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

使用Playwright执行Google搜索时遭遇TimeoutError问题求助

解决Playwright Google搜索时的TimeoutError问题

问题根源

超时是因为Playwright无法定位到input[name="q"]元素,常见原因包括:Cookie弹窗未正确处理、Google页面DOM结构因地区/版本变化、浏览器启动参数不合理、页面未完全加载。

具体修复方案

1. 修正Cookie同意按钮定位

不同地区的Google隐私提示文本不同(比如"Accept all"而非"I agree"),改用更通用的定位方式,同时使用Playwright更推荐的locatorAPI:

# 替换原Cookie处理代码
try:
    await page.locator('button:has-text("Accept all")').click(timeout=5000)
except:
    try:
        await page.locator('button:has-text("I agree")').click(timeout=5000)
    except:
        pass

2. 优化搜索框定位

Google搜索框的title属性通常是"Search",用这个定位比name="q"更稳定,也可以结合get_by_role:

# 替换原fill和press代码
query = "Playwright Python"
# 方式1:通过title属性定位
await page.fill('input[title="Search"]', query)
# 方式2:通过角色定位更可靠
# await page.get_by_role("textbox", name="Search").fill(query)
await page.press('input[title="Search"]', 'Enter')

3. 调整浏览器启动参数

移除--single-process参数,该参数会导致浏览器稳定性下降,尤其在无头模式下:

browser = await pw.chromium.launch(
    args=["--disable-gpu", "--headless=new"], 
    headless=True
)

4. 确保页面完全加载

在page.goto中添加wait_until="networkidle",等待网络空闲后再进行操作:

await page.goto('https://www.google.com', wait_until="networkidle")

完整修正代码

from playwright.async_api import async_playwright
import asyncio


async def main():
    async with async_playwright() as pw:
        # 移除不稳定的--single-process参数
        browser = await pw.chromium.launch(
            args=["--disable-gpu", "--headless=new"], 
            headless=True
        )

        page = await browser.new_page()

        # 等待网络空闲,确保页面加载完成
        await page.goto('https://www.google.com', wait_until="networkidle")

        # 兼容不同地区的Cookie同意按钮文本
        try:
            await page.locator('button:has-text("Accept all")').click(timeout=5000)
        except:
            try:
                await page.locator('button:has-text("I agree")').click(timeout=5000)
            except:
                pass

        # 使用更稳定的搜索框定位方式
        query = "Playwright Python"
        await page.fill('input[title="Search"]', query)
        await page.press('input[title="Search"]', 'Enter')

        # 等待搜索结果加载
        await page.wait_for_selector('h3')

        # 提取第一个结果链接
        first_result = await page.query_selector('h3')
        first_link = await first_result.evaluate('(element) => element.closest("a").href')
        print("First search result link:", first_link)

        await browser.close()

if __name__ == '__main__':
    asyncio.run(main())

额外排查点

  • 如果仍有问题,尝试关闭无头模式(headless=False),手动查看页面实际加载情况,确认是否有其他弹窗或页面加载异常。
  • 检查网络环境,确保可以正常访问Google服务。

内容的提问来源于stack exchange,提问作者shantanuo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 01:40:10