Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

WebDriver-Fähigkeiten

WebDriver-klassische Fähigkeiten werden verwendet, um die von einer Sitzung unterstützten Funktionen zu kommunizieren. Ein Client kann auch Fähigkeiten verwenden, um zu definieren, welche Funktionen der Treiber erfüllen muss, wenn eine neue Sitzung erstellt wird.

Wenn eine WebDriver-Sitzung erstellt wird, gibt sie eine Reihe von Fähigkeiten zurück, die die ausgehandelten, effektiven Fähigkeiten der Sitzung beschreiben. Einige der in diesem Satz enthaltenen Fähigkeiten sind standardisiert und werden von allen Browsern geteilt, aber der Satz kann auch browserspezifische Fähigkeiten enthalten, die immer mit einem Präfix versehen sind.

Fähigkeitsverhandlung

Fähigkeiten können verwendet werden, um einen Treiber zu verlangen, der einen bestimmten Funktionsumfang unterstützt. Dies kann verwendet werden, um bestimmte Browserfunktionen zu verlangen, wie z.B. die Möglichkeit, die Fenstergröße zu ändern, wird aber auch in verteilten Umgebungen genutzt, um eine bestimmte Browserkonfiguration aus einer Matrix von Optionen auszuwählen.

Die Auswahl eines bestimmten Webbrowsers oder einer Plattform ergibt nur Sinn, wenn Sie einen Remote-WebDriver verwenden. In diesem Fall stellt der Client über einen oder mehrere Zwischenknoten Kontakt mit WebDriver her, die verhandeln, welchen Treiber Sie basierend auf den empfangenen Fähigkeiten zurückerhalten sollen.

Das Fähigkeiten-Objekt ist ein Auswahlmechanismus, der einschränkt, welche Treiberkonfigurationen der Server zurückgibt. Wenn Sie eine Firefox-Instanz mit browserName anfordern und Firefox nicht auf dem Remote installiert ist oder macOS von einem Remote, das nur Linux unterstützt, können Sie Pech haben. Aber gelegentlich könnte es Ihnen egal sein, welches spezifische Betriebssystem oder welcher Webbrowser Ihre Sitzung hat: Sie möchten einfach nur eine Sitzung, die eine gewisse Fähigkeit hat.

Der Auswahlprozess oder die Fähigkeitsverhandlung erfolgt über alwaysMatch und firstMatch.

alwaysMatch

Wie der Name schon sagt, sind die in dem alwaysMatch-Fähigkeiten-Objekt beschriebenen Fähigkeiten solche, die Sie erfordern, dass die Sitzung sie hat. Wenn der Server die von Ihnen geforderten Funktionen nicht bereitstellen kann, schlägt die Sitzungserstellung fehl.

Wenn Sie beispielsweise Firefox-Version 62 auf einem System anfordern, das nur 60 installiert hat, schlägt die Sitzungserstellung fehl:

json
{
  "capabilities": {
    "alwaysMatch": {
      "browserName": "firefox",
      "browserVersion": "60"
    }
  }
}

firstMatch

Das firstMatch-Feld akzeptiert ein Array von Fähigkeitsobjekten, die der Reihe nach abgeglichen werden, bis eines gefunden wird, das der Server bereitstellen kann, oder es wird fehlschlagen.

Dies kann nützlich sein, wenn Sie einen Treiber auf macOS oder Linux, aber nicht auf Windows wünschen:

json
{
  "capabilities": {
    "firstMatch": [{ "platformName": "macos" }, { "platformName": "linux" }]
  }
}

Kombination von alwaysMatch und firstMatch

firstMatch kann natürlich mit alwaysMatch kombiniert werden, um die Auswahl einzugrenzen. Wenn Sie beispielsweise einen Treiber wünschen, der unter macOS oder Linux läuft, aber es muss Firefox sein:

json
{
  "capabilities": {
    "alwaysMatch": {
      "browserName": "firefox"
    },
    "firstMatch": [{ "platformName": "macos" }, { "platformName": "linux" }]
  }
}

Das vorherige Beispiel ist genau gleichbedeutend damit, das Firefox-Erfordernis in jedem firstMatch-Arm zu setzen:

json
{
  "capabilities": {
    "firstMatch": [
      { "browserName": "firefox", "platformName": "macos" },
      { "browserName": "firefox", "platformName": "linux" }
    ]
  }
}

Welche der beiden vorhergehenden Beispiele Sie wählen, ist nicht wichtig, aber es kann eine Rolle spielen, wenn Sie Browserkonfigurationen weitergeben. Um zu vermeiden, dass Daten unnötig wiederholt werden, wie z.B. Profile, ist es ratsam, alwaysMatch zu verwenden, sodass diese Daten nur einmal über das Netzwerk übertragen werden:

json
{
  "capabilities": {
    "alwaysMatch": {
      "browserName": "firefox",
      "moz:firefoxOptions": {
        "profile": "<base64 encoded profile>",
        "args": ["-headless"],
        "prefs": { "dom.ipc.processCount": 8 },
        "log": { "level": "trace" }
      }
    },
    "firstMatch": [{ "platformName": "macos" }, { "platformName": "linux" }]
  }
}

Liste der Fähigkeiten

Anbieter-spezifische Fähigkeiten

Zusätzlich zu den Standardfähigkeiten erlaubt WebDriver Dritten, den Satz von Fähigkeiten ihren Bedürfnissen entsprechend zu erweitern. Browserhersteller und Treiberanbieter verwenden in der Regel Erweiterungsfähigkeiten, um Konfigurationen an den Browser zu übermitteln, sie können aber auch von Zwischenstellen für beliebige Informationsblöcke genutzt werden.

Veraltete Fähigkeiten

Die Mehrheit der Selenium-Clients verwendet desiredCapabilities und requiredCapabilities, um die neue Sitzung zu konfigurieren. Diese sind den oben beschriebenen firstMatch und alwaysMatch sehr ähnlich. Einige Treiber unterstützen diese veralteten Fähigkeiten, aber sie sind nicht mehr aktuell und sollten vermieden werden.

Die Umwandlung eines veralteten Fähigkeitenobjekts in den neuen Stil ist einfach. Das erste, was Sie wissen müssen, ist, dass alwaysMatch/firstMatch immer innerhalb eines capabilities JSON-Objekts eingehüllt ist, während desiredCapabilities/requiredCapabilities auf der obersten Ebene existieren. Im Allgemeinen sollte alles, was zuvor in desiredCapabilities enthalten war, in einen firstMatch-Zweigarm gehen, um denselben Effekt zu erzielen.

Nehmen Sie dieses veraltete Fähigkeitenobjekt:

json
{ "desiredCapabilities": { "browserName": "firefox" } }

Dies wäre im neuen Stil funktional äquivalent:

json
{ "capabilities": { "firstMatch": [{ "browserName": "firefox" }] } }

Aber da es nur einen firstMatch-Arm gibt und wir wissen, dass die Sitzungserstellung fehlschlagen wird, wenn der Server keinen Firefox installiert hat, ist es auch äquivalent zu diesem:

json
{ "capabilities": { "alwaysMatch": { "browserName": "firefox" } } }

Siehe auch