selenium中执行JavaScript的过程解析

使用方式

# 同步执行js代码
driver.execute_script(script, *args)
"""
Synchronously Executes JavaScript in the current window/frame.

:Args:
  - script: The JavaScript to execute.
  - \\*args: Any applicable arguments for your JavaScript.
:Usage:
   ::
   driver.execute_script('return document.title;')
"""

# 异步执行js代码
driver.execute_async_script(self, script: str, *args)
"""
Asynchronously Executes JavaScript in the current window/frame.
:Args:
  - script: The JavaScript to execute.
  - \\*args: Any applicable arguments for your JavaScript.
:Usage:
  ::
  script = "var callback = arguments[arguments.length - 1]; " \\
           "window.setTimeout(function(){ callback('timeout') }, 3000);"
  driver.execute_async_script(script)
"""

上面两段代码注释,均来自于python的selenium包里面

同步执行js

所谓的同步,其实是selenium将需要执行的js代码发给浏览器之后,需要等待浏览器立即响应并给出返回值。所以,我们要执行的js代码必须能立即得到返回值,否则将会出现超时。尽管是同步执行,但是也有一个超时检测机制,默认30秒。
示例中的代码执行的是 return document.title
单纯的理解document.title还好,但是为什么要加上一个return?
return不应该是一个函数给调用方返回结果时,才需要的吗?
其实,我们的js代码就是被封装进了一个匿名的js函数中,当只需要通过js点击元素、滚动页面等操作时,是不需要返回值得,所以不需要携带return。不过,在我们需要获取某个元素的某个属性时,selenium自带的方法解决不了,可以从js很方便的获取时,就需要用return将这个属性值给拿到。大致可以抽象理解为如下:

function anonymous(script) {
	/* 伪代码
	解析传入的待执行script
	执行script
	如果有return:
		将结果返回
	如果没有return:
		直接结束
	*/
}
/*
我们在Python中执行的driver.execute_script("return document.title")
就是把这段代码放到了anonymous函数内部,让我们要执行的代码封装在一个js函数里面
再通过浏览器去解析执行
*/

异步执行js

介绍完同步执行,异步执行就稍微简单一些
异步执行也就是将我们的代码放在了函数内部,不过由于我们请求的是异步,所以不能立即返回结果。在js中,不能立即得到返回值的调用,都需要一个回调函数来获取结果。
还是用示例代码说明:

script = "var callback = arguments[arguments.length - 1]; " \\
         "window.setTimeout(function(){ callback('timeout') }, 3000);"
driver.execute_async_script(script)
"""
重点看js代码使如何书写的。
var callback = arguments[arguments.length - 1];
arguments.length:指的是js函数的的入参个数;js函数中有一个特殊的变量是arguments,记录了函数到底有多少个入参,用一个数组存放
arguments[arugments.length - 1]:js函数的最后一个入参
整句话就是说,把函数的最后一个入参赋值给了变量callback,但是要注意js是弱类型语言,callback可以是变量也可以是函数、类。在这里不管callback是什么,它要做的就是把结果返回出来

window.setTimeout(function(){ callback('timeout') }, 3000);
setTimeout是启动一个定时后台任务,接受2个参数,第一个是要执行的函数,第二个是延迟多少毫秒后执行
这里的含义是,在3秒之后执行一个函数,函数执行的内容是通过callback将'timeout'返回出去
所以driver.execute_async_script(script)得到一个返回值'timeout'
"""

实际上js实现的回调是通过promise做的,关于promise这里有详细的介绍Promise

如果只是单纯调用,只需要知道异步执行的时候,必须要指定一个callback函数来回调结果。

后面会再出一篇文章,是本人用selenium完成接口测试的案例,是一个剑走偏锋的操作,只做知识普及,不建议落地执行。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
selenium是一个用于自动化浏览器操作的工具,可以用于爬虫文件解析。它提供了一系列的API(应用程序编程接口)来操作浏览器,包括模拟用户的点击、填写表单、提交表单等。如果你想要解析网页上的内容,你可以使用selenium来模拟浏览器的操作,从而获取页面上的数据。 在Python,你可以使用selenium库来进行爬虫文件解析。你可以利用selenium库提供的方法来启动一个浏览器,打开指定的网页,并执行相关的操作。通过定位元素、获取元素属性、执行JavaScript等操作,你可以获取到网页的数据,并将其解析出来。 你可以参考以下资源来学习如何使用selenium进行爬虫文件解析: - 官方文档:https://www.selenium.dev/selenium/docs/api/py/api.html - Selenium-Python***/ - Selenium with Python文文档:https://selenium-python-zh.readthedocs.io/en/latest/index.html 这些资源提供了详细的说明和示例代码,可以帮助你理解和使用selenium进行爬虫文件解析。你可以阅读这些文档,了解selenium的基本用法和常用的操作方法。然后根据你的需求,使用selenium编写相应的代码来解析爬虫文件。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [python--爬虫--selenium的简介和使用](https://blog.csdn.net/q383965374/article/details/121834923)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值