You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python Playwright处理爬虫中的新标签页切换问题

处理Playwright中点击按钮后新标签页的切换与操作问题

你当前的代码在点击target="_blank"的链接后,仍然在原标签页执行后续操作,这是因为没有主动切换到新打开的标签页。Playwright中可以通过监听页面创建事件来捕获新标签页,具体解决方法如下:

核心思路

在触发新标签页的点击操作前,先监听浏览器上下文的page事件,等待新页面创建完成后,获取新页面对象,后续操作都基于这个新对象执行。

修改后的代码

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    context = browser.new_context()
    page = context.new_page()
    # 补充页面访问代码,例如:page.goto("你的目标页面URL")

    for itemId in range(250):
        itemId += 1
        locator = page.locator(f"text='{('%03d' % itemId)}'")
        # 正确判断元素是否存在,原逻辑有误,需用count()或is_visible()验证
        if locator.count() > 0:
            locator.click()
            page.wait_for_timeout(5000)
            
            # 关键:监听新页面创建事件
            new_page_promise = context.wait_for_event("page")
            # 点击打开新标签页的链接
            page.locator('a[target="_blank"]').click()
            # 获取新页面实例
            new_page = new_page_promise.result()
            # 等待新页面加载完成
            new_page.wait_for_load_state()

            # 在新标签页执行元素操作
            text_contents = new_page.locator("div[ng-repeat='(colRenderIndex, col) in colContainer.renderedColumns track by col.uid']").all_text_contents()
            print(text_contents)
            
            # 可选:操作完成后关闭新标签页,释放资源
            new_page.close()
            page.wait_for_timeout(5000)
        else:
            break

    browser.close()

关键细节说明

  • 监听新页面事件:context.wait_for_event("page")返回Promise对象,点击触发新标签页的元素后,调用result()即可拿到新页面实例。
  • 等待页面加载:new_page.wait_for_load_state()确保新页面完全加载后再执行元素操作,避免因页面未加载完成导致定位失败。
  • 元素存在判断:原代码直接用if page.locator(...)的判断逻辑无效(locator对象始终为真值),需用count() > 0或is_visible()验证元素是否存在。

内容的提问来源于stack exchange,提问作者Jorge Augusto Wilchen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 20:55:20