Playwright Python爬虫:弹窗内Show All按钮定位失败求助
问题解决:Playwright无法定位弹出窗口中的"Show All"按钮
问题根源
你的代码存在三个核心问题导致按钮定位失败:
- 操作对象错误:你在主页面
page上尝试定位按钮,但"Show All"按钮实际位于点击马名后弹出的新窗口(popup)中,必须通过popup对象来定位元素。 - 执行顺序错误:你先尝试点击按钮,再获取popup对象,此时popup还未被正确捕获,代码逻辑顺序颠倒。
- 缺少元素等待:弹出窗口加载需要时间,直接执行点击操作可能遇到元素未渲染完成的情况。
修改后的代码
import pandas as pd from playwright.sync_api import sync_playwright, expect def scrape_ranking(url, sheet_name): with sync_playwright() as p: browser = p.chromium.launch(headless=False) # 调试时可改为False可视化窗口状态,上线后改回True page = browser.new_page() page.goto(url, wait_until="domcontentloaded") # 点击马名,等待弹出窗口并获取popup对象 with page.expect_popup() as popup_info: page.click('text="LUCKY MISSILE"') popup = popup_info.value # 等待弹出窗口网络请求完成,确保元素加载 popup.wait_for_load_state("networkidle") # 等待"Show All"按钮可见后再点击 show_all_btn = popup.get_by_text("Show All") expect(show_all_btn).to_be_visible() show_all_btn.click() # 等待点击后数据加载完成,时间可根据实际情况调整 popup.wait_for_timeout(1000) html = popup.content() browser.close() tables = pd.read_html(html) df = tables[7] # 处理Excel写入,兼容文件不存在的情况 try: with pd.ExcelWriter("hkjc.xlsx", engine="openpyxl", mode='a', if_sheet_exists='overlay') as writer: df.to_excel(writer, sheet_name=sheet_name, index=True) except FileNotFoundError: df.to_excel("hkjc.xlsx", sheet_name=sheet_name, index=True) url = 'https://racing.hkjc.com/racing/information/English/racing/RaceCard.aspx?RaceDate=2023/04/06&Racecourse=HV&RaceNo=1' scrape_ranking(url, "LUCKY MISSILE")
关键调整说明
- 切换操作对象到popup:通过
popup = popup_info.value获取弹出窗口对象,所有针对弹出窗口的操作都基于这个对象执行。 - 强化等待逻辑:
- 使用
popup.wait_for_load_state("networkidle")等待弹出窗口的网络请求全部完成,确保页面元素完整加载。 - 用
expect(show_all_btn).to_be_visible()确保按钮已经渲染并可见,彻底避免因元素未加载导致的定位失败。
- 使用
- 调试与兼容优化:
- 保留
headless=False便于调试时观察窗口操作流程,上线后可改回无头模式。 - 增加Excel文件不存在时的创建逻辑,避免首次运行报错。
- 保留
内容的提问来源于stack exchange,提问作者NNBananas
相关产品推荐
相关产品推荐

