簡潔な答え
このXPath式は、「ボタンテキスト」というテキストを含むボタンをクエリします。
const [button] = await page.$x("//button[contains(., 'Button text')]");
if (button) {
await button.click();
}
<div class="elements">ボタンの周囲も尊重するには、次のコードを使用します。
const [button] = await page.$x("//div[@class='elements']/button[contains(., 'Button text')]");
説明
テキストノード(text())の使用が間違っている場合がある理由を説明するために、例を見てみましょう。
<div>
<button>Start End</button>
<button>Start <em>Middle</em> End</button>
</div>
まず、以下を使用した場合の結果を確認しましょうcontains(text(), 'Text')。
//button[contains(text(), 'Start')]2つのノードの両方を返します(予想どおり)
//button[contains(text(), 'End')]のみを返します1つのノード(最初の)として、text()2つのテキスト(と戻りリストStart との End)が、contains最初のものだけをチェックします
//button[contains(text(), 'Middle')] 戻らないだろう何のような結果をtext()子ノードのテキストが含まれていません。
のXPath式はcontains(., 'Text')、子ノードを含む要素自体で機能します。
//button[contains(., 'Start')]2つのボタンの両方を返します
//button[contains(., 'End')]再び2つのボタンの両方を返します
//button[contains(., 'Middle')]1つ(最後のボタン) を返します
したがって、ほとんどの場合、XPath式では.なくを使用する方が理にかなっていますtext()。