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

Python WebDriver与Asyncio:能否先为每个任务启动浏览器再加载链接?

解决Selenium异步使用报错及预打开浏览器加载链接的问题

首先直接给结论:完全可以先打开浏览器,之后再加载任意数量的对应链接——这其实是Selenium很常用的操作方式,不用每次加载链接都重启浏览器。

再看你遇到的报错:TypeError: object WebDriver can't be used in 'await' expression,原因很简单:Selenium的webdriver.Chrome()构造函数和driver.get()都是同步方法,它们不属于异步可等待对象(比如协程、Future等),所以不能用await关键字来修饰它们。

下面给你两种场景的解决方案:

场景1:普通同步用法(先开浏览器,再加载多个链接)

这是最直接的方式,先初始化浏览器实例(打开浏览器窗口),之后反复调用driver.get()加载不同URL:

from selenium import webdriver

# 第一步:打开浏览器(初始化WebDriver实例)
driver = webdriver.Chrome()

# 第二步:加载第一个链接
driver.get("https://example.com")
# 这里可以添加你的页面操作,比如获取元素、截图等
print("加载example.com完成")

# 第三步:加载第二个链接
driver.get("https://google.com")
print("加载google.com完成")

# 最后:关闭浏览器(记得一定要做,避免残留进程)
driver.quit()

场景2:结合asyncio的异步用法

如果你确实需要用asyncio做异步处理,Selenium本身不支持原生异步,但可以用asyncio.to_thread()把同步的WebDriver操作放到独立线程中执行,这样就能和异步代码兼容了,同时也能实现先开浏览器再加载多个链接的需求:

import asyncio
from selenium import webdriver

async def load_and_get_page(driver, url):
    # 把同步的get方法放到线程中执行,支持await
    await asyncio.to_thread(driver.get, url)
    # 获取页面源码也是同步操作,同样用to_thread包装
    page_source = await asyncio.to_thread(driver.page_source)
    return page_source

async def main():
    # 先异步初始化浏览器(打开窗口)
    driver = await asyncio.to_thread(webdriver.Chrome)
    try:
        # 依次加载多个链接
        example_html = await load_and_get_page(driver, "https://example.com")
        google_html = await load_and_get_page(driver, "https://google.com")
        
        # 打印部分内容验证
        print("example.com页面前50字符:", example_html[:50])
        print("google.com页面前50字符:", google_html[:50])
    finally:
        # 无论成功失败,都要关闭浏览器
        await asyncio.to_thread(driver.quit)

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

注意:如果你的Python版本低于3.9(asyncio.to_thread()是3.9+引入的),可以用loop.run_in_executor()替代,实现逻辑完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:29:25