Befehl browsingContext.locateNodes
Der Befehl browsingContext.locateNodes des Moduls browsingContext findet die Nodes in einem Kontext, die einem Locator entsprechen. Der Locator legt die Suchkriterien fest.
Syntax
/* With required parameters */
{
"method": "browsingContext.locateNodes",
"params": {
"context": "93ee5bd6-d256-4608-a002-9a8995cc0e5f",
"locator": {
"type": "css",
"value": ".product"
}
}
}
/* With required and optional parameters */
{
"method": "browsingContext.locateNodes",
"params": {
"context": "93ee5bd6-d256-4608-a002-9a8995cc0e5f",
"locator": {
"type": "xpath",
"value": "//a[text()='Learn more']"
},
"maxNodeCount": 3,
"serializationOptions": {
"maxDomDepth": 2,
"includeShadowTree": "all"
},
"startNodes": [
{
"sharedId": "f8f6a1f2-3d8a-4b8e-9f1a-6f6a2f6a2f6a"
}
]
}
}
Parameter
Das Feld params enthält:
context-
Ein String mit der ID des zu durchsuchenden Kontexts. Kontext-IDs werden von Befehlen wie
browsingContext.getTreezurückgegeben. locator-
Ein Objekt, das anhand einer Kombination der Felder
typeundvalueeines von fünf Kriterien zum Finden von Nodes festlegt. Die Struktur des Feldsvaluehängt vom Feldtypeab. Bei einigen Werten vontypesind zusätzliche Felder im Objektlocatormöglich.type-
Ein String, der die Strategie zum Finden von Nodes festlegt. Er kann einen der folgenden Werte haben:
"accessibility": Findet Nodes mit einer passenden zugänglichenrole, einem passenden zugänglichennameoder beidem."context": Findet das Containerelement eines untergeordneten Kontexts, beispielsweise ein<iframe>oder<embed>."css": Findet Nodes, die einem CSS-Selektor entsprechen."innerText": Findet Nodes, deren gerenderter Text (innerText) dem angegebenen String entspricht oder ihn enthält."xpath": Findet Nodes, die einem XPath-Ausdruck entsprechen.
value-
Je nach
typeein String oder ein Objekt, das das Suchkriterium festlegt:- Bei
type: "accessibility"istvalueein Objekt, das mindestens eines der folgenden Felder enthalten muss:nameOptional-
Ein String mit dem passenden zugänglichen Namen, beispielsweise
"Submit"für einen Button mit der Beschriftungaria-label="Submit". roleOptional-
Ein String mit der passenden zugänglichen Rolle, beispielsweise
"checkbox"für ein Element mitrole="checkbox".
- Bei
type: "context"istvalueein Objekt mit dem folgenden Feld:context-
Ein String mit der ID eines untergeordneten Kontexts. Dieser muss ein direktes Kind des Kontexts sein, der im Parameter
contextdes Befehls angegeben ist.
- Bei
type: "css"istvalueein String mit dem auszuwertenden CSS-Selektor, beispielsweise"li:nth-child(2)". - Bei
type: "innerText"istvalueein String mit dem zu findenden Text. - Bei
type: "xpath"istvalueein String mit dem auszuwertenden XPath-Ausdruck, beispielsweise"//img[@alt='logo']".
- Bei
ignoreCaseOptional-
Ein boolescher Wert, der angibt, ob beim Textvergleich die Groß- und Kleinschreibung ignoriert wird. Dieses Feld ist nur für
type: "innerText"verfügbar.false: Beim Vergleich wird die Groß- und Kleinschreibung berücksichtigt. Dies ist die Standardeinstellung.true: Beim Vergleich wird die Groß- und Kleinschreibung ignoriert.
matchTypeOptional-
Ein String, der festlegt, ob der Suchtext mit dem gesamten Text des Nodes exakt übereinstimmen muss oder nur mit einem Teil davon. Dieses Feld ist nur für
type: "innerText"verfügbar. Er kann einen der folgenden Werte haben:"full": Der Suchtext muss mit dem gesamten Text des Nodes exakt übereinstimmen. Dies ist die Standardeinstellung."partial": Der Suchtext muss nur mit einem Teil des Texts des Nodes übereinstimmen.
maxDepthOptional-
Eine nicht negative Ganzzahl, die die maximale Anzahl der zu durchsuchenden Ebenen von Nachkommen festlegt. Auf der tiefsten zulässigen Ebene wird ein Node anhand seines eigenen gerenderten Texts abgeglichen, statt weiter durchsucht zu werden. Dieses Feld ist nur für
type: "innerText"verfügbar. Wird es nicht angegeben, ist die Anzahl der durchsuchten Ebenen unbegrenzt.
maxNodeCountOptional-
Eine positive Ganzzahl, die die maximale Anzahl zurückgegebener Nodes festlegt. Wird sie nicht angegeben, werden alle passenden Nodes zurückgegeben.
serializationOptionsOptional-
Ein Objekt, das steuert, wie viele Details die Antwort zu jedem passenden Node enthält. Es kann die folgenden Felder enthalten:
includeShadowTreeOptional-
Ein String, der festlegt, ob Nachkommen von Shadow Roots in der Antwort enthalten sind (siehe das im Abschnitt Rückgabewert beschriebene Feld
shadowRoot). Er kann einen der folgenden Werte haben:"none": Nachkommen von Shadow Roots werden nicht aufgenommen. Dies ist die Standardeinstellung."all": Nachkommen sowohl offener Shadow Roots (von JavaScript außerhalb der Root zugänglich) als auch geschlossener Shadow Roots (von JavaScript außerhalb der Root nicht zugänglich) werden aufgenommen."open": Nur Nachkommen offener Shadow Roots werden aufgenommen.
maxDomDepthOptional-
Eine nicht negative Ganzzahl oder
nullfür unbegrenzt. Sie legt fest, wie viele Ebenen von Nachkommen-Nodes für jeden passenden Node in der Antwort enthalten sind (siehe das im Abschnitt Rückgabewert beschriebene Feldchildren). Der Standardwert ist0; dabei werden keine Nachkommen aufgenommen. Diese Begrenzung gilt auch für Nachkommen von Shadow Roots, die überincludeShadowTreeaufgenommen werden. maxObjectDepthOptional-
Eine nicht negative Ganzzahl oder
nullfür unbegrenzt. Sie legt fest, wie viele Ebenen verschachtelter Objekte bei der Serialisierung der JavaScript-Eigenschaften eines Nodes enthalten sind. Der Standardwert istnull.
startNodesOptional-
Ein Array aus einer oder mehreren Node-Referenzen, das die Nodes festlegt, innerhalb derer gesucht werden soll, anstatt das gesamte Dokument zu durchsuchen. Jede Referenz ist ein Objekt mit den folgenden Feldern:
handleOptional-
Ein String mit einem Handle für ein JavaScript-Objekt, beispielsweise einem Handle aus einer früheren Antwort von
script.evaluateoderscript.callFunction. -
Ein String mit der ID eines zuvor zurückgegebenen Nodes, beispielsweise aus einer früheren Antwort von
browsingContext.locateNodesoderscript.evaluate.
Hinweis:
startNodeskann nicht verwendet werden, wennlocator.typeden Wert"context"hat.
Rückgabewert
Das Objekt result in der Antwort enthält die folgenden Felder:
nodes-
Ein Array aus Node-Objekten, eines für jeden passenden Node. Jedes Objekt kann die folgenden Felder haben:
internalIdOptional-
Ein String, der dieses Node-Objekt innerhalb der Antwort eindeutig identifiziert. Dieses Feld ist nur vorhanden, wenn dasselbe Node-Objekt mehrmals in derselben Antwort vorkommt, beispielsweise sowohl als direktes Suchergebnis als auch als Nachkomme eines anderen passenden Nodes.
-
Ein String mit einer ID, über die dieser Node in späteren Befehlen referenziert werden kann, beispielsweise in
startNodeseines nachfolgenden Aufrufs vonbrowsingContext.locateNodes. Diese ID ist innerhalb der gesamten Sitzung eindeutig und bleibt für die Dauer der Sitzung gültig, solange der Node noch existiert. type-
Ein String, der immer den Wert
"node"hat. valueOptional-
Ein Objekt, das Eigenschaften des passenden Nodes beschreibt. Dieses Objekt kann die folgenden Felder enthalten:
attributesOptional-
Ein Objekt, das jedem Attribut seinen String-Wert zuordnet. Dieses Feld ist nur bei Element-Nodes vorhanden.
childNodeCount-
Eine nicht negative Ganzzahl, die die Anzahl der direkten Kind-Nodes des zurückgegebenen Nodes angibt. Dies ist die tatsächliche Anzahl, auch wenn das Feld
childrenfehlt oder weniger Kind-Nodes enthält. childrenOptional-
Ein Array aus Nachkommen-Nodes, die jeweils dieselben Felder wie dieses Objekt enthalten. Nachkommen werden bis zu der Ebene aufgenommen, die
maxDomDepthinserializationOptionsfestlegt. localNameOptional-
Ein String mit dem lokalen Namen des Nodes. Bei einem HTML-Element ist dies der Tag-Name in Kleinbuchstaben. Dieses Feld ist nur bei Element-Nodes vorhanden.
modeOptional-
Ein String, der den Modus der Shadow Root angibt, die mit dem Node verbunden ist. Dieses Feld ist nur bei Shadow-Root-Nodes vorhanden. Er kann einen der folgenden Werte haben:
"closed": Gibt an, dass auf Nodes innerhalb der Shadow Root nicht von JavaScript außerhalb der Root zugegriffen werden kann."open": Gibt an, dass Nodes innerhalb der Shadow Root von JavaScript außerhalb der Root zugänglich sind.
namespaceURIOptional-
Ein String mit der Namespace-URI des Nodes. Dieses Feld ist nur bei Element-Nodes vorhanden. Bei HTML-Elementen ist der Wert immer der standardmäßige HTML-Namespace
"http://www.w3.org/1999/xhtml". nodeType-
Eine Ganzzahl, die den Typ des Nodes angibt, beispielsweise
1für ein Element oder3für einen Text-Node. nodeValueOptional-
Ein String mit dem Wert des Nodes, beispielsweise dem Text eines Text-Nodes oder den Daten eines Kommentar-Nodes. Bei Element- und Dokument-Nodes fehlt dieses Feld.
shadowRootOptional-
Ein Objekt, das die mit dem Node verbundene Shadow Root beschreibt. Das Objekt hat dieselben Felder wie die Node-Objekte in
nodes, daruntersharedId,typeundvalue. Der Wert dieses Felds istnull, wenn der zurückgegebene Node keine Shadow Root hat.
Fehler
invalid argument-
Wird in einem der folgenden Fälle ausgelöst:
- Ein erforderlicher Parameter fehlt oder hat einen ungültigen Typ.
startNodeswird angegeben, obwohllocator.typeden Wert"context"hat.- Der durch
locator.value.contextidentifizierte untergeordnete Kontext ist kein direktes Kind des im Parametercontextangegebenen Kontexts.
invalid selector-
Wird in einem der folgenden Fälle ausgelöst:
- Der CSS-Selektor oder XPath-Ausdruck in
locator.valuekann nicht geparst werden. locator.typehat den Wert"innerText"undvalueist ein leerer String.locator.typehat den Wert"accessibility"und wederrolenochnameist angegeben.
- Der CSS-Selektor oder XPath-Ausdruck in
no such frame-
Es wurde kein Kontext mit der angegebenen
context-ID gefunden. no such handle-
Ein in
startNodesreferenzierter Node kann nicht aufgelöst werden, beispielsweise weil er durch die Garbage Collection entfernt wurde. unknown error-
Die Auswertung des XPath-Ausdrucks in
locator.valueist aus einem anderen Grund als einem Parsingfehler fehlgeschlagen.
Beschreibung
Der Befehl browsingContext.locateNodes ist die wichtigste Möglichkeit, Nodes im DOM eines Dokuments zu finden. Er ähnelt den Find Element(s)-Befehlen in WebDriver classic.
Er wandelt einen Locator, beispielsweise einen CSS-Selektor oder XPath-Ausdruck, in Node-Referenzen um (mit sharedId und optional handle).
Sie können diese Referenzen in späteren Befehlen verwenden, beispielsweise in startNodes eines nachfolgenden Aufrufs von browsingContext.locateNodes oder als Ziel für script.callFunction.
Alternativ zu diesem Befehl können Sie script.evaluate verwenden. Dafür müssen Sie allerdings den entsprechenden JavaScript-Code schreiben.
Umfang der zurückgegebenen Details steuern
Beim Finden von Nodes können Sie drei Begrenzungen festlegen, um den Umfang der in der Antwort zurückgegebenen Daten zu steuern:
maxNodeCountist ein Parameter auf oberster Ebene, der die Gesamtzahl der zurückgegebenen passenden Nodes begrenzt. Er steuert den Umfang des Suchergebnisses.- Die beiden anderen Begrenzungen,
maxDomDepthundmaxObjectDepth, sind Felder des ParametersserializationOptions. Sie steuern die Tiefe der für jeden passenden Node zurückgegebenen Daten (wie beiscript.evaluate):maxDomDepthsteuert, wie viele Ebenen von DOM-Nachkommen im Feldchildrenjedes passenden Nodes enthalten sind.maxObjectDepthsteuert, wie viele Ebenen verschachtelter JavaScript-Objekteigenschaften bei der Darstellung von Werten, die keine Nodes sind, in der Antwort enthalten sind.
Beispiele
>Nodes mit einem CSS-Selektor finden
Angenommen, Sie verfügen über eine WebDriver-BiDi-Verbindung und eine aktive Sitzung.
Angenommen, Ihr Dokument enthält genau ein <button>-Element mit der Klasse submit.
Senden Sie mit der Kontext-ID dieses Dokuments, die Sie über browsingContext.getTree erhalten haben, die folgende Nachricht, um den Button anhand seiner Klasse zu finden:
{
"id": 1,
"method": "browsingContext.locateNodes",
"params": {
"context": "93ee5bd6-d256-4608-a002-9a8995cc0e5f",
"locator": {
"type": "css",
"value": "button.submit"
}
}
}
Der Browser antwortet mit dem passenden Node wie folgt:
{
"id": 1,
"type": "success",
"result": {
"nodes": [
{
"type": "node",
"sharedId": "f8f6a1f2-3d8a-4b8e-9f1a-6f6a2f6a2f6a",
"value": {
"nodeType": 1,
"localName": "button",
"namespaceURI": "http://www.w3.org/1999/xhtml",
"childNodeCount": 1,
"attributes": {
"class": "submit"
},
"shadowRoot": null
}
}
]
}
}
Beachten Sie, dass das Array nodes in dieser Antwort ein einzelnes Objekt enthält, das einem passenden Node entspricht.
Dessen localName ist "button" und entspricht damit dem Tag des Elements.
Der Button hat einen Kind-Node, seinen Text „Submit“. Deshalb ist childNodeCount gleich 1.
shadowRoot ist null, weil der Button keine Shadow Root hat.
Anzahl der zurückgegebenen passenden Nodes begrenzen
Angenommen, Ihr Dokument enthält drei <li>-Elemente mit der Klasse item.
Senden Sie über dieselbe Verbindung und Sitzung wie im ersten Beispiel die folgende Nachricht, um zwei davon mithilfe eines CSS-Selektors und maxNodeCount zu finden:
{
"id": 2,
"method": "browsingContext.locateNodes",
"params": {
"context": "93ee5bd6-d256-4608-a002-9a8995cc0e5f",
"locator": {
"type": "css",
"value": "li.item"
},
"maxNodeCount": 2
}
}
Der Browser antwortet mit zwei passenden Nodes wie folgt:
{
"id": 2,
"type": "success",
"result": {
"nodes": [
{
"type": "node",
"sharedId": "a1b2c3d4-1111-4b8e-9f1a-6f6a2f6a2f6a",
"value": {
"nodeType": 1,
"localName": "li",
"namespaceURI": "http://www.w3.org/1999/xhtml",
"childNodeCount": 1,
"attributes": {
"class": "item"
},
"shadowRoot": null
}
},
{
"type": "node",
"sharedId": "a1b2c3d4-2222-4b8e-9f1a-6f6a2f6a2f6a",
"value": {
"nodeType": 1,
"localName": "li",
"namespaceURI": "http://www.w3.org/1999/xhtml",
"childNodeCount": 1,
"attributes": {
"class": "item"
},
"shadowRoot": null
}
}
]
}
}
Einen Node anhand seiner zugänglichen Rolle und seines zugänglichen Namens finden
Angenommen, Ihr Dokument enthält das folgende Markup, das dem Element die zugängliche Rolle "checkbox" und den zugänglichen Namen "Checkbox name" zuweist:
<span
role="checkbox"
aria-checked="false"
tabindex="0"
aria-labelledby="checkbox-label"></span>
<span id="checkbox-label">Checkbox name</span>
Senden Sie über dieselbe Verbindung und Sitzung wie im ersten Beispiel die folgende Nachricht, um die Checkbox anhand ihrer Zugänglichkeitsmerkmale zu finden:
{
"id": 3,
"method": "browsingContext.locateNodes",
"params": {
"context": "93ee5bd6-d256-4608-a002-9a8995cc0e5f",
"locator": {
"type": "accessibility",
"value": {
"role": "checkbox",
"name": "Checkbox name"
}
}
}
}
Der Browser antwortet mit dem passenden Node wie folgt:
{
"id": 3,
"type": "success",
"result": {
"nodes": [
{
"type": "node",
"sharedId": "f8f6a1f2-4444-4b8e-9f1a-6f6a2f6a2f6a",
"value": {
"nodeType": 1,
"localName": "span",
"namespaceURI": "http://www.w3.org/1999/xhtml",
"childNodeCount": 0,
"attributes": {
"role": "checkbox",
"aria-checked": "false",
"tabindex": "0",
"aria-labelledby": "checkbox-label"
},
"shadowRoot": null
}
}
]
}
}
Sie können diese Checkbox auch allein anhand ihrer zugänglichen Rolle oder allein anhand ihres zugänglichen Namens finden, da bei diesem Locator eines der beiden Kriterien ausreicht.
Das Containerelement eines untergeordneten Kontexts finden
Angenommen, Ihr Dokument enthält ein <iframe>-Element mit einem untergeordneten Kontext.
Ermitteln Sie über dieselbe Verbindung und Sitzung wie im ersten Beispiel die ID des untergeordneten Kontexts mit browsingContext.getTree.
Senden Sie die folgende Nachricht, um das iframe mit einem Kontext-Locator zu finden:
{
"id": 4,
"method": "browsingContext.locateNodes",
"params": {
"context": "93ee5bd6-d256-4608-a002-9a8995cc0e5f",
"locator": {
"type": "context",
"value": {
"context": "6442450945"
}
}
}
}
Der Browser antwortet mit dem passenden Node wie folgt:
{
"id": 4,
"type": "success",
"result": {
"nodes": [
{
"type": "node",
"sharedId": "f8f6a1f2-5555-4b8e-9f1a-6f6a2f6a2f6a",
"value": {
"nodeType": 1,
"localName": "iframe",
"namespaceURI": "http://www.w3.org/1999/xhtml",
"childNodeCount": 0,
"attributes": {
"src": "https://example.com/frame.html"
},
"shadowRoot": null
}
}
]
}
}
Spezifikationen
| Spezifikation |
|---|
| WebDriver BiDi> # command-browsingContext-locateNodes> |
Browser-Kompatibilität
Siehe auch
- Befehl
browsingContext.getTree - Befehl
browsingContext.navigate - Befehl
browsingContext.reload - Befehl
script.callFunction