概述

Selenium虽然内置了很多与浏览器交互的方法,但是有一些方面还是不能完全覆盖,因此执行JavaScript是非常有必要的,这也是模拟浏览器包必备的功能。

需要执行JavaScript的主要场景如下:

  • 修改元素的属性,如显示隐藏元素
  • 执行特定动作,如拖动滚动条
  • 表单操作,如向文本框输入内容
  • 获取某些Selenium未提供接口的DOM属性
  • 注入其他工具库,比如jQuery

execute_script方法:同步执行JavaScript脚本

Selenium中同步执行JavaScript脚本主要依靠WebDriverexecute_script方法。

作用:同步执行JavaScript。
签名:driver.execute_script(script, *args) 参数:script为需要同步执行的JavaScript语句。*args为JavaScript语句执行中使用到的参数。
返回值:JavaScript语句中return语句返回的对象。

向JavaScript语句传递参数

JavaScript使用特殊对象 arguments指代参数,arguments[0]表示第一个参数,arguments[1]表示第二个参数,依次类推。

案例:在浏览器控制台中显示传递给JavaScript脚本的两个变量之和。

from selenium import webdriver

driver = webdriver.Firefox()
driver.execute_script('console.log(arguments[0]+arguments[1])', 1, 2)

python selenium 检测异步数据响应_返回值

获取JavaScript对象

在Javascript语句中使用return语句,即可将JavaScript对象传递给selenium,此时JavaScript对象会转换为Python对象。

案例:输出传递给JavaScript的变量

from selenium import webdriver

driver = webdriver.Firefox()
arguments = driver.execute_script('return arguments', 1, 2)
print(arguments, type(arguments))

控制台结果:

[1, 2] <class 'list'>

execute_async_script方法:异步步执行JavaScript脚本

Selenium中异步执行JavaScript脚本主要依靠WebDriverexecute_script方法。

作用:异步执行JavaScript。
签名:driver.execute_async_script(script, *args) 参数:script为需要异步执行的JavaScript语句。*args为JavaScript语句执行中使用到的参数。
返回值:JavaScript语句中回调函数中的参数。注意:Selenium自动为execute_async_script方法添加了一个特殊参数,这个参数追加在其他参数后面,即回调函数。

案例1 :演示回调函数和返回值

from selenium import webdriver

driver = webdriver.Firefox()

script = "var callback = arguments[arguments.length - 1]; " \
    "console.log(arguments.length);"\
    "window.setTimeout(function(){ callback(1) }, 3000);"

result = driver.execute_async_script(script, "test")

print(repr(result), type(result))

var callback = arguments[arguments.length - 1];是回调函数的固定定义方法。
浏览器控制台输出为:2,说明JavaScript接收到了2个参数,但我们只明确传了"test"
结果即回调函数callback中的参数。

1 <class 'int'>

案例2 :演示异步特性

JavaScript中有两个异步任务,一个任务3秒后返回1,一个任务1秒后返回2,第二个任务当然先完成。执行回调函数callback后,脚本结束运行。

from selenium import webdriver
import time

driver = webdriver.Firefox()

script = "var callback = arguments[arguments.length - 1]; " \
    "window.setTimeout(function(){ callback(1) }, 3000);"\
    "window.setTimeout(function(){ callback(2) }, 1000);"
start_time = time.time()

result = driver.execute_async_script(script, "test")
end_time = time.time()
print(end_time-start_time)
print(repr(result), type(result))

输出为:

1.023017406463623
2 <class 'int'>

Selenium常用JavaScript脚本

拖动滚动条

js_ = "document.documentElement.scrollTop=10000"
driver.execute_script(js_)

修改表单元素的值

driver.get("http://www.baidu.com")
js="document.getElementById('kw').value='123'"
driver.execute_script(js)

修改CSS属性,隐藏百度搜索框

driver.get("http://www.baidu.com")
js="document.getElementById('kw').style.display='None'"
driver.execute_script(js)

返回JavaScript对象,浏览器UA

js="return window.navigator.userAgent"
UA =driver.execute_script(js)
print(UA)
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0

获取某元素的HTML

driver.get("http://www.baidu.com")
js="return document.getElementById('s-top-left').innerHTML"
html =driver.execute_script(js)
print(repr(html))

注入jQuery

driver.get("http://www.baidu.com")
js1 = "var newScript = document.createElement('script');newScript.src = 'https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js';"
js2 = "return $('.s-top-left').text()"
driver.execute_script(js1)
text = driver.execute_script(js2)
print(text)

结果:

新闻hao123地图直播视频贴吧学术更多网盘知道百科图片宝宝知道文库经验音乐查看全部百度产品 >