Die aktuelle Top-Antwort von tokland funktioniert nur auf Textknoten und nicht auf Knoten mit anderen Elementen.
Kurze Antwort
Dieser XPath-Ausdruck fragt eine Schaltfläche ab, die den Text "Schaltflächentext" enthält:
const [button] = await page.$x("//button[contains(., 'Button text')]");
if (button) {
await button.click();
}
<div class="elements">
Verwenden Sie den folgenden Code, um auch die Umgebung der Schaltflächen zu berücksichtigen:
const [button] = await page.$x("//div[@class='elements']/button[contains(., 'Button text')]");
Erläuterung
text()
Schauen wir uns ein Beispiel an, um zu erklären, warum die Verwendung des Textknotens ( ) in einigen Fällen falsch ist:
<div>
<button>Start End</button>
<button>Start <em>Middle</em> End</button>
</div>
Lassen Sie uns zunächst die Ergebnisse überprüfen, wenn Sie Folgendes verwenden contains(text(), 'Text')
:
//button[contains(text(), 'Start')]
gibt beide zwei Knoten zurück (wie erwartet)
//button[contains(text(), 'End')]
gibt nur einen Knoten (den ersten) zurück, da text()
eine Liste mit zwei Texten ( Start
und End
) zurückgegeben contains
wird, überprüft aber nur den ersten
//button[contains(text(), 'Middle')]
gibt keine Ergebnisse zurück, da text()
der Text der untergeordneten Knoten nicht enthalten ist
Hier sind die XPath-Ausdrücke für contains(., 'Text')
, die für das Element selbst einschließlich seiner untergeordneten Knoten funktionieren:
//button[contains(., 'Start')]
kehren beide zwei Tasten
//button[contains(., 'End')]
wird wieder die beiden Rück zwei Tasten
//button[contains(., 'Middle')]
gibt eins zurück (die letzte Taste)
In den meisten Fällen ist es daher sinnvoller, den Ausdruck .
anstelle von text()
in einem XPath-Ausdruck zu verwenden.