我正在尝试单击带有特定文本的链接,这是一个从网站注销的按钮。
button = await page.xpath("//a[contains(., 'Abmelden')]")
以上应该通过xpath选择正确的元素。但是我怎样才能点击它呢? 不幸的是,语法与原始的 puppeteer 有点不同。
我试过了
button = await page.xpath("//a[contains(., 'Abmelden')]")
await page.click(button)
但后来我明白了
TypeError: Object of type ElementHandle is not JSON serializable
xpath()
返回一个列表,因此您需要对该列表进行索引。一旦你有了一个元素句柄,你就可以直接调用handle.click()
。如果传参数给click,应该是字符串选择器
例子:
import asyncio
from pyppeteer import launch
async def main():
browser = await launch({"headless": True})
[page] = await browser.pages()
await page.setContent("""
<body>
<a href="#">Abmelden</a>
<script>
const a = document.querySelector("a");
a.addEventListener("click", e => a.textContent = "clicked");
</script>
</body>
""")
[button] = await page.xpath("//a[contains(., 'Abmelden')]")
await button.click()
print(await page.Jeval("a", "el => el.textContent")) # => clicked
await browser.close()
asyncio.run(main())
如果这在您的实时站点上不起作用,则可能有一些额外的行为可以解释它:
如果是这种情况,请分享mcve。