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 contains
yalnı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()
.