2

我正在使用 Python 无头浏览器库 Pyppeteer。它与 Puppeteer (JS) 基本相同。所以在 Puppeteer 上工作的解决方案也应该在这里工作。我需要一个按钮来点击。问题是这个按钮是动态生成的,并且它的 id 每次都会改变:

按钮

<button type="submit" class="btn btn-secondary" id="single_button5ea4a114318a96" title="">Upgrade Moodle database now</button>

代码

   async def configure(self):
   browser = await launch()
   page = await browser.newPage()
   await page.goto('mysite.example')
   await asyncio.gather(
   page.waitForSelector('button[title="Upgrade Moodle database now"]', timeout=60000),
   page.click('button[title="Upgrade Moodle database now"]')
   )

我可以从它的名称的那部分找到那个按钮,它没有改变single_button,但是还有 3 个按钮,它们的 ids 开始single_button

页面中的其他按钮:

<button type="submit" class="btn btn-secondary" id="single_button5ea4a114318a95" title="">Cancel new installations (2)</button>
<button type="submit" class="btn btn-secondary" id="single_button5ea4a114318a93" title="">Cancel this installation</button>
<button type="submit" class="btn btn-secondary" id="single_button5ea4a114318a94" title="">Cancel this installation</button>

使这个按钮独一无二的两件事是它的 id 最后一个数字和标题如果你能帮助我如何通过它的标题点击这个按钮,我将不胜感激。

感谢你们!

4

2 回答 2

0

检索更完整的 CSS 选择器。可以通过右键单击元素 > 复制 > CSS 选择器在 Firefox 开发工具中执行此操作

于 2020-04-30T20:55:41.860 回答
0

很简单,使用包含文本的 XPATH 选择器:
//button[@type='submit' and contains(., 'Upgrade')]

而不是使用 waitForSelector,而是使用一个简单的 while 循环,直到找到此元素。请记住创建超时以避免无限循环。

from time import sleep, process_time

...

start = process_time()
btn = []
while len(btn) == 0:
    elapsed = process_time() - start
    if elapsed > 0.30:
        break  # timeout 30s
    btn = await page.xpath('//button[@type="submit" and contains(., "Entrar")]')
    sleep(1)
于 2020-10-02T16:18:09.543 回答