Kısa cevap
Bu XPath ifadesi, "Düğme metni" metnini içeren bir düğmeyi sorgular:
const [button] = await page.$x("//button[contains(., 'Button text')]");
if (button) {
await button.click();
}
<div class="elements">Düğmelerin etrafına da uymak için aşağıdaki kodu kullanın:
const [button] = await page.$x("//div[@class='elements']/button[contains(., 'Button text')]");
Açıklama
text()Bazı durumlarda metin düğümünü ( ) kullanmanın neden yanlış olduğunu açıklamak için bir örneğe bakalım:
<div>
<button>Start End</button>
<button>Start <em>Middle</em> End</button>
</div>
Öncelikle, kullanırken sonuçları kontrol edelim contains(text(), 'Text'):
//button[contains(text(), 'Start')]her iki düğümü de döndürecektir (beklendiği gibi)
//button[contains(text(), 'End')]yalnızca bir düğüm (ilki) text()döndürür, çünkü iki metin ( Start ve End) içeren bir liste döndürür , ancak containsyalnızca ilkini kontrol eder
//button[contains(text(), 'Middle')]alt düğümlerin metnini içermediği için hiçbir sonuç döndürmeyecektext()
Alt contains(., 'Text')düğümleri de dahil olmak üzere öğenin kendisi üzerinde çalışan XPath ifadeleri şunlardır :
//button[contains(., 'Start')]iki düğmeyi de döndürecek
//button[contains(., 'End')]yine iki düğmeyi de döndürecek
//button[contains(., 'Middle')] dönecektir birini (son düğmesi)
Bu yüzden çoğu durumda, bir XPath ifadesi .yerine kullanmak daha mantıklıdır text().