我有以下代码:
<div class="pt6-sm pb6-sm ta-sm-r d-sm-flx flx-jc-sm-fe"><button class="mb1-sm css-bz0cep ex41m6f0 secondary" type="button">Cancel</button><button class="ml3-sm mb1-sm css-17hmqcn ex41m6f0 primary" type="button">Save</button></div>
我试图单击“保存”按钮,并且正在尝试这样做:
const addBtn = await select(page).getElement('button:contains(Save)');
await addBtn.click()
我也尝试过:
const [button] = await page.$x("//div[@class='elements']/button[contains(., 'Save')]");
if (button) {
await button.click();
}
我收到未处理的承诺拒绝。知道为什么吗?
答案 0 :(得分:3)
基本上,您会得到UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'click' of undefined
,直到选择器不正确/元素不存在或尚未出现在页面上为止。
在这种情况下,您的xpath选择器似乎没有抓住元素。
这将完成工作:
const addBtn = await page.$x('//button[contains(text(), "Save")]')
await addBtn[0].click()
您知道吗?如果在Chrome DevTools的“元素”选项卡中右键单击一个元素,然后选择“复制”:您可以在其中复制元素的确切选择器或xpath。之后,您可以切换到“控制台”选项卡,并使用Chrome api可以测试选择器的内容,因此可以为操纵up脚本做好准备。例如:$x('//button[contains(text(), "Save")]').textContent
应该显示您希望单击的按钮的文本,否则您需要更改访问权限,或者需要检查是否有更多具有相同选择器的元素,等等。这可能帮助您找到更合适的选择器。