如何将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
相关产品推荐
相关产品推荐

