如何使用pyppeteer点击带有特定文本的链接

问题描述 投票:0回答:1

我正在尝试单击带有特定文本的链接,这是一个从网站注销的按钮。

enter image description here

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
text hyperlink puppeteer screen-scraping pyppeteer
1个回答
0
投票

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())

如果这在您的实时站点上不起作用,则可能有一些额外的行为可以解释它:

  • iframe
  • 影根
  • 检测到您的机器人并阻止您的页面
  • 可见性/滚动
  • 异步 JS 行为或等待响应到达并改变 DOM
  • ...

如果是这种情况,请分享mcve

© www.soinside.com 2019 - 2024. All rights reserved.