添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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(
Selenium如何使用execute_async_script的callback前言在我百度的时候,貌似关于execute_script的讲解不少,但是关于execute_async_script的讲解不是很多,还看到有文章在问callback为什么不能用(写在python里是肯定不能用的……)所以自己也写一篇关于execute_async_script的用法。基础很多用法上的错误是源于...
Selenium3 Python WebDriver API源码探析(7):同步/异步执行JavaScriptexecute_script,execute_async_script:参数,返回值)
Selenium虽然内置了很多与浏览器交互的方法,但是有一些方面还是不能完全覆盖,因此执行JavaScript是非常有必要的,这也是模拟浏览器包必备的功能。 需要执行JavaScript的主要场景如下: 修改元素的属性,如显示隐藏元素 执行特定动作,如拖动滚动条 表单操作,如向文本框输入内容 获取某些Selenium未提供接口的DOM属性 注入其他工具库,比如jQuery execute_script方法 Selenium中执行JavaScript主要依靠WebDriver的execute_scr
本文主要介绍Java中,使用Selenium WebDriver 调用浏览器执行Js(JavaScript)代码,其中executeAsyncScriptexecuteScript方法的使用。 原文地址:Java Selenium WebDriver 中executeAsyncScriptexecuteScript方法的使用 event_loop:事件循环,相当于一个无限循环,我们可以把一些特殊函数注册(放置)到这个事件循环上, 当满足某些条件的时候,函数就会被循环执行。程序是按照设定的顺序从头执行到尾,运行的次数也是完全按照设定。 当在编写异步程序时,必然其中有部分程序的运行耗时是比较久的,需要先让出当前程序的控制权,让其在背后运行, 让另一部分的程序...