概述
Selenium
虽然内置了很多与浏览器交互的方法,但是有一些方面还是不能完全覆盖,因此执行JavaScript是非常有必要的,这也是模拟浏览器包必备的功能。
需要执行JavaScript的主要场景如下:
- 修改元素的属性,如显示隐藏元素
- 执行特定动作,如拖动滚动条
- 表单操作,如向文本框输入内容
- 获取某些
Selenium
未提供接口的DOM属性 - 注入其他工具库,比如jQuery
execute_script
方法:同步执行JavaScript脚本
Selenium
中同步执行JavaScript脚本主要依靠WebDriver
的execute_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)
获取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脚本主要依靠WebDriver
的execute_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地图直播视频贴吧学术更多网盘知道百科图片宝宝知道文库经验音乐查看全部百度产品 >