Python Playwright无法导航至URL,点击疑似失效致超时
Python Playwright点击搜索后超时问题排查与解决
我用Python Playwright编写代码下载依赖用户会话的CSV文件,但第22行触发TimeoutError,页面实际加载正常,怀疑点击操作未生效,尝试相关方案后无效。
原代码
from playwright.sync_api import Playwright, sync_playwright, expect def run(playwright: Playwright) -> None: browser = playwright.chromium.launch(headless=False) context = browser.new_context() # Open new page page = context.new_page() # Go to https://www.elections.il.gov/CampaignDisclosure/ContributionSearchByCommittees.aspx?T=637994490317517425 page.goto("https://www.elections.il.gov/CampaignDisclosure/ContributionSearchByCommittees.aspx?T=637994490317517425") # Click input[name="ctl00\$ContentPlaceHolder1\$txtCmteID"] page.locator("input[name=\"ctl00\\$ContentPlaceHolder1\\$txtCmteID\"]").click() # Fill input[name="ctl00\$ContentPlaceHolder1\$txtCmteID"] page.locator("input[name=\"ctl00\\$ContentPlaceHolder1\\$txtCmteID\"]").fill("34589") # Click input:has-text("Search") page.locator("input:has-text(\"Search\")").click() page.wait_for_url("https://www.elections.il.gov/CampaignDisclosure/ContributionSearchByCommittees.aspx?txtCmteID=%2fVrwBYk8TlTSLyRmy7TWmQ%3d%3d&ddlVendorState=Ry707kcsXsM%3d&ddlContributionType=wOGh3QTPfKqV2YWjeRmjTeStk426RfVK&ddlState=Ry707kcsXsM%3d&ddlFiledDateTime=Ry707kcsXsM%3d&ddlFiledDateTimeThru=Ry707kcsXsM%3d&T=637999702238350506") # Click text=Download This List page.locator("text=Download This List").click() page.wait_for_url("https://www.elections.il.gov/CampaignDisclosure/DownloadList.aspx?T=637999702324593366") # Click text=CSV File with page.expect_download() as download_info: page.locator("text=CSV File").click() download = download_info.value # --------------------- context.close() browser.close() with sync_playwright() as playwright: run(playwright)
错误信息
Exception has occurred: TimeoutError Timeout 30000.0ms exceeded. =========================== logs =========================== waiting for navigation to "https://www.elections.il.gov/CampaignDisclosure/ContributionSearchByCommittees.aspx?txtCmteID=%2fVrwBYk8TlTSLyRmy7TWmQ%3d%3d&ddlVendorState=Ry707kcsXsM%3d&ddlContributionType=wOGh3QTPfKqV2YWjeRmjTeStk426RfVK&ddlState=Ry707kcsXsM%3d&ddlFiledDateTime=Ry707kcsXsM%3d&ddlFiledDateTimeThru=Ry707kcsXsM%3d&T=637999702238350506" until 'load'
问题原因及解决办法
- 硬编码URL等待失效:网站URL中的
T参数是动态生成的,每次请求都会变化,硬写的URL永远无法匹配,直接导致超时。 - 点击操作可能未触发导航:元素定位不准确或页面用AJAX加载而非跳转,导致后续等待逻辑失效。
优化后的代码
from playwright.sync_api import Playwright, sync_playwright, expect def run(playwright: Playwright) -> None: browser = playwright.chromium.launch(headless=False) context = browser.new_context() # 打开新页面 page = context.new_page() # 访问搜索页面 page.goto("https://www.elections.il.gov/CampaignDisclosure/ContributionSearchByCommittees.aspx?T=637994490317517425") # 直接填充委员会ID,fill方法自动聚焦元素,无需额外点击 page.locator("input[name=\"ctl00\\$ContentPlaceHolder1\\$txtCmteID\"]").fill("34589") # 点击搜索按钮,自动等待导航完成,适配动态URL with page.expect_navigation(): page.locator("input:has-text(\"Search\")").click() # 等待"下载列表"链接出现,确保搜索结果加载完成 download_link = page.locator("text=Download This List") expect(download_link).to_be_visible() # 点击下载链接,等待页面跳转 with page.expect_navigation(): download_link.click() # 触发CSV下载并保存文件 with page.expect_download() as download_info: page.locator("text=CSV File").click() download = download_info.value download.save_as("campaign_contributions.csv") # 关闭浏览器资源 context.close() browser.close() with sync_playwright() as playwright: run(playwright)
关键优化点
- 替换
wait_for_url为page.expect_navigation():自动等待页面跳转,无需关注动态变化的URL参数。 - 合并输入框的点击与填充:
fill()方法自动聚焦元素,减少冗余操作。 - 使用
expect()断言元素可见:确保页面加载完成后再执行下一步,避免过早操作。 - 添加文件保存逻辑:明确指定保存路径,防止下载的文件丢失。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

