Python+Selenium 如何使用execute_async_script的callback

本文详细介绍了如何在Selenium中使用execute_async_script进行异步操作,并解释了JavaScript的异步机制、Python同步执行的区别,以及如何在JavaScript中设置回调函数以获取异步执行的结果。通过实例展示了execute_async_script返回数组和对象的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Selenium如何使用execute_async_script的callback

前言

在我百度的时候,貌似关于execute_script的讲解不少,但是关于execute_async_script的讲解不是很多,还看到有文章在问callback为什么不能用(写在python里是肯定不能用的……)所以自己也写一篇关于execute_async_script的用法。

基础

很多用法上的错误是源于对概念、模型等问题理解有偏差造成的,这里必须先阐述一下关于Python、JS的一些基础概念或者相关理论,不然只有代码,可能永远不能理解问题本质。
如果你对JS的异步机制(例如Promise等)已经很了解,可以跳过基础部分
如果你只是不想看废话,可以直接跳到完整样例和其他几个例子,相信聪明的你肯定一看就懂

1. JS异步

JS是一个单线程语言,这是针对浏览器设计的,JS本身不支持任何延迟、卡顿、锁死线程的操作(谁都不想上网的时候画面卡住吧?),取而代之的是使用 回调技术 来完成延时或者很耗时的任务。
例如,如果在JS中想要调用funcA,然后1秒钟后调用funcB,那么必须这么写:

funcA()
setTimeout(funcB, 1000)

仔细观察funcA后面是有括号的,funcB后面没有括号,这是将funcB作为参数传入setTimeout函数的意思,也就是通知主线程,1s后调用funcB

这一行代码并不会造成线程卡顿,它只是将funcB加入了JS的任务队列中,等待执行,如果后面有代码,后面的代码会立刻执行。例如下面的代码,执行顺序是A -> C -> B

funcA()
setTimeout(funcB, 1000)
funcC()

更具体的内容,可以百度查阅有关js 线程js 异步js Promisejs 异步编程相关话题,这里只需对JS的异步编程思想做一些了解即可。

2. Python同步

Python是一个多线程语言,没有复杂难懂的回调机制,如果你使用了定时,那么 当前线程会被“锁死”,直到这一行结束

funcA()
time.sleep(1)
funcB()

例如上面的代码,将会是A -> B这样的顺序,A和B之间时长为1秒,当程序执行到time.sleep时线程会等待,不会执行其他代码。
这与JS的异步区别很大,在刚才的A -> C -> B的例子中,JS主线程执行时间可能只有几微妙(A和C执行就一瞬间,B执行也一瞬间),中间1000毫秒的时间不会执行任何代码。

3. Selenium

Selenium是一个测试框架,主要语言是Python,那么同步和异步的写法,哪一种简单呢?显然是Python的同步写法简单,符合人类思维。
事实上,execute_async_script也是这样设计的,他被设计为执行异步代码,但不可能为了这个问题让你在python里面写异步代码。
所以事实上,这个函数是个同步的函数,程序执行到execute_async_script时,会一直等待代码执行完毕,然后继续执行下一行。
例如:

funcA()
result = browser.execute_async_script('// some script')
funcB()

这样的代码,会先执行funcA,然后线程卡死在execute_async_script,一直死等,等到execute_async_script执行完毕,再执行funcB。这里的result是代码执行结果,定义方式比较

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值