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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 08:40:31