簡潔な答え
この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()
。