Puppeteer: 等待打开一个新页面
对于点击 <a target='_blank'>
标签打开新 tab 页的场景,Puppeteer目前(2019-03,v1.13.0)没有现成的 API 支持。因此需要一些 walkaround 来解决。有几个方案。
提取 href,手动打开新 page 去访问
url = await page.evaluate('() => $("a").attr("href")') detail_page = await browser.newPage() # goto 带了 waitForNavigation 的作用 await detail_page.goto(detail_page_url)
使用点击,再去轮徇 pages
代码如下。这个方案的问题在于,拿到 detail_page
时并不知道页面是否 load
完成了,在这个时候调用 .waitForNavigation()
可能会超时报错(因为没有 load
事件被 fire
)。如果页面有 AJAX 请求,你可能需要写额外的 waitForSelector
来确保你要的数据已经在页面上。
# 点击完后出现新 tab 页 await page.click(f'#panel-5 tr:nth-child({index + 1}) a') # 等新 Tab 页 ready,即 pages 中有新 tab 页。由于没有现成 API,只能靠等 detail_page = None for i in range(5): pages = await browser.pages() try: detail_page = next(page for page in pages if 'biangeng.html' in page.url) except StopIteration: await asyncio.sleep(1) else: break if detail_page is None: msg = "New page did not show up or show up so slowly." logger.error(msg) raise Exception(msg)
我最擅长从零开始创造世界,所以从来不怕失败,它最多也就让我一无所有。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
2009-01-10 Windows7 beta1 微软官方下载