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

如何将Selenium中execute_script执行JS异步函数的返回值传给Python变量

最优解决方案:使用Selenium异步执行脚本接口

你遇到的问题本质是execute_script是同步执行接口,只会等待JS同步代码执行完成就返回,不会等待setTimeout这类异步回调的结果,因此你原来的写法会直接拿到setTimeout的返回值(定时器ID,而Selenium默认会把未明确同步返回的JS结果处理为None)。

Selenium本身提供了execute_async_script接口专门处理需要等待异步结果的场景,不需要额外写文件、修改页面节点,也不需要固定时长的sleep等待。

实现步骤

  • 首先设置脚本最大超时时间(要大于你需要等待的异步执行时长):
# 单位为秒,这里设置2秒足够覆盖你需要的1秒等待时长
driver.set_script_timeout(2)
  • 调用异步执行接口获取返回值:
var = driver.execute_async_script("""
    // Selenium会自动传入回调函数作为JS的最后一个入参
    const done = arguments[arguments.length - 1];
    setTimeout(function(){
        // 异步逻辑执行完成后,调用回调函数将结果返回给Python
        done([1,2,3]);
    }, 1000);
""")

执行完成后var就能直接拿到你需要的数组结果。

替代方案:全局变量轮询

如果你不想用异步执行接口,也可以用全局变量存储结果+短间隔轮询的方案,比你提到的写文件、插页面节点更简单:

import time

# 先执行异步逻辑,将结果存在window全局变量中
driver.execute_script("""
    window.__extractedData = null;
    setTimeout(function(){
        window.__extractedData = [1,2,3];
    }, 1000);
""")

# 轮询等待结果返回,最多等2秒
var = None
wait_start = time.time()
while time.time() - wait_start < 2:
    var = driver.execute_script("return window.__extractedData;")
    if var is not None:
        break
    time.sleep(0.1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 20:06:03