WebDriver-Fähigkeiten

WebDriver Fähigkeiten werden verwendet, um die von einer Sitzung unterstützten Funktionen zu kommunizieren. Ein Client kann auch Fähigkeiten nutzen, um zu definieren, welche Funktionen der Treiber bei der Erstellung einer neuen Sitzung bereitstellen muss.

Wenn eine WebDriver-Sitzung erstellt wird, gibt sie eine Menge von Fähigkeiten zurück, die die verhandelten, effektiven Fähigkeiten der Sitzung beschreiben. Einige der in dieser Menge enthaltenen Fähigkeiten sind standardisiert und von allen Browsern geteilt, aber die Menge kann auch browser-spezifische Fähigkeiten enthalten, die immer einen Präfix haben.

Fähigkeiten-Verhandlung

Fähigkeiten können verwendet werden, um einen Treiber zu verlangen, der eine bestimmte Untermenge von Funktionen unterstützt. Dies kann genutzt werden, um bestimmte Browser-Funktionen zu verlangen, wie die Fähigkeit, die Fensterabmessungen zu ändern, wird aber auch in verteilten Umgebungen verwendet, um eine bestimmte Browser-Konfiguration aus einer Vielzahl von Optionen auszuwählen.

Die Auswahl eines bestimmten Webbrowsers oder einer Plattform macht nur Sinn, wenn Sie einen Remote-WebDriver verwenden. In diesem Fall stellt der Client über einen oder mehrere Zwischenknoten eine Verbindung mit WebDriver her, die aushandeln, welchen Treiber er Ihnen basierend auf den empfangenen Fähigkeiten zurückgibt.

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

Der Auswahlprozess, oder die Fähigkeiten-Verhandlung, wird über alwaysMatch und firstMatch gesteuert.

alwaysMatch

Wie der Name schon sagt, sind Fähigkeiten, die im alwaysMatch-Objekt beschrieben sind, Funktionen, die Sie verlangen, dass die Sitzung sie hat. Wenn der Server nicht bieten kann, was Sie verlangen, 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ähigkeiten-Objekten, die nacheinander abgeglichen werden, bis eines gefunden wird, das der Server bereitstellen kann, oder es schlägt fehl.

Dies kann nützlich sein, wenn Sie einen Treiber möchten, der unter macOS oder Linux, aber nicht unter Windows läuft:

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 möchten, der unter macOS oder Linux läuft, aber unbedingt Firefox sein muss:

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

Das vorherige Beispiel ist genau äquivalent dazu, die Anforderung an Firefox in jedem firstMatch-Arm zu platzieren:

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 relevant sein, wenn Sie eine Browserkonfiguration übergeben. Um zu vermeiden, dass Daten unnötig wiederholt werden, wie z.B. Profile, ist es ratsam, alwaysMatch zu verwenden, so dass diese Daten nur einmal über die Leitung ü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

Hersteller-spezifische Fähigkeiten

Zusätzlich zu den Standardfähigkeiten erlaubt WebDriver Drittanbietern, die Menge der Fähigkeiten zu erweitern, um ihren Anforderungen gerecht zu werden. Browseranbieter und Anbieter von Treibern verwenden typischerweise Erweiterungsfähigkeiten, um die Konfiguration des Browsers bereitzustellen, aber sie können auch von Zwischenstellen für beliebige Informationen verwendet 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 Konvertierung eines veralteten Fähigkeiten-Objekts in den neuen Stil ist einfach. Das Erste, was Sie wissen müssen, ist, dass alwaysMatch/firstMatch immer innerhalb eines capabilities-JSON-Objekts eingeschlossen ist, während desiredCapabilities/requiredCapabilities auf oberster Ebene existieren. Im Allgemeinen gilt, dass alles, was zuvor in desiredCapabilities ging, in einen firstMatch-Zweigarm gehen sollte, um denselben Effekt zu erzielen.

Nehmen Sie dieses veraltete Fähigkeiten-Objekt:

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 kein Firefox installiert hat, ist es auch äquivalent zu diesem:

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

Siehe auch