짧은 대답
이 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')]
예상대로 두 노드를 모두 반환합니다.
//button[contains(text(), 'End')]
두 개의 텍스트 ( 및 ) 가있는 목록을 반환하므로 하나의 노드 (첫 번째) 만 반환 하지만 첫 번째 노드 만 확인합니다.text()
Start
End
contains
//button[contains(text(), 'Middle')]
반환하지 않습니다 더 같은 결과를 text()
자식 노드의 텍스트를 포함하지 않는다
에 대한 XPath 표현식 contains(., 'Text')
은 하위 노드를 포함하여 요소 자체에서 작동합니다.
//button[contains(., 'Start')]
두 버튼을 모두 반환 합니다.
//button[contains(., 'End')]
다시 두 개의 버튼을 모두 반환 합니다.
//button[contains(., 'Middle')]
하나 를 반환합니다 (마지막 버튼).
따라서 대부분의 경우 XPath 표현식에서 대신를 사용하는 .
것이 더 합리적 text()
입니다.