Selenium执行javaScript
简介
1)selenium能够处理js,这使selenium拥有更为强大的能力,既然能够执行js,那么js能做的事情,selenium大部分也能做
2)直接使用js操作页面,能解决很多click()不生效的问题
3)页面滚动到底部,顶部
4)处理富文本,时间控件的输入
1. selenium调用js
WebDriver有两个方法来执行JavaScript,分别是:
execute_script(同步执行)
execute_async_script(异步执行)
execute_script(script, *args): 执行js
return:可以返回js的返回结果
execute_script:arguments传参
driver.execute_script("return document.getElementById('kw').value") driver.execute_script("return document.title;") # 返回网页标题
2.js 提供的定位方法
文档级别操作
document.getElementById
document.getElementsByClassName
document.getElementsByName
document.getElementsByTagName
document.getElementsByTagNameNS
元素级别操作
可以先使用WebDriver获取想要操作的元素,然后使用JavaScript执行操作。
input_ele = driver.find_element(By.ID, "su") driver.execute_script("arguments[0].click();", input_ele)
def test_baidu2(self): self.driver.get("http://www.baidu.com") input_ele = self.driver.find_element_by_id("kw") self.driver.execute_script("arguments[0].value = 'test';", input_ele) time.sleep(2) baidu_ele = self.driver.find_element_by_id("su") self.driver.execute_script("arguments[0].click();", baidu_ele) time.sleep(2)
可以在语句中使用多个 JavaScript动作
username = driver.find_element_by_xpath("//*[@id='username']") password = driver.find_element_by_xpath("//*[@id='password']") driver.execute_script("arguments[0].value = 'admin';arguments[1].value = 'admin';", username, password)
3.js的滑动页面
如:百度搜索后一直滑动到最底部,点击下一页
js:document.documentElement.scrollTop=10000 将页面滑动至底部,给一个非常大的值就可以
document.documentElement.scrollTop=0 给一个非常小的值就可以滑动到顶部
document.getElementById("su") 可以通过这种方式获取元素
window.scrollTo(0,document.body.clientHeight) 滑动到可视窗口的最底部
selenium:滑动到target 为可见状态:
target =self.driver.find_element_by_id("help") 或 target =driver.execute_script("return document.getElementById('help')")
self.driver.execute_script("arguments[0].scrollIntoView();", target)
class TestJS(Base): def test_js_scroll(self): self.driver.get('https://www.baidu.com') self.driver.find_element_by_id('kw').send_keys('selenium') # self.driver.find_element_by_id('su').click() #点击百度一下 element = self.driver.execute_script('return document.getElementById("su")') #点击百度一下 element.click() # 点击百度一下 self.driver.execute_script('document.documentElement.scrollTop=5000') # 滚动到最底部 time.sleep(2) self.driver.find_element_by_xpath('//*[@id="page"]/div/a[6]/span[2]').click() time.sleep(3) for code in [ 'return document.title', 'return JSON.stringify(performance.timing)' ] : print(self.driver.execute_script(code)) # 打印标题和内容
4.js处理时间控件
思路:1.要取消日期的readonly属性;
2.给value赋值;
3.写js代码来实现如上2点,在用webdriver对js进行处理;
示例:
def test_js_datetime(self):
self.driver.get("https://www.12306.cn/index/")
# 将出发元素赋值
time_element = "document.getElementById('train_date')"
# 打印修改前的日期
print(self.driver.execute_script(f"return {time_element}.value"))
# 移除元素的readonly属性
self.driver.execute_script(f"{time_element}.removeAttribute('readonly')")
# 修改元素的值
self.driver.execute_script(f"{time_element}.value='2020-12-30'")
sleep(2)
# 打印修改的日期
print(self.driver.execute_script(f"return {time_element}.value"))
5.获取页面标题
js: document.title
driver.execute_script("return document.title"))
6.弹出alert弹窗
#js: window.alert("hello selenium”) driver.execute_script("window.alert('hello selenium')")
7. 获取当前页面的加载速度等数据
#js:JSON.stringify(performance.timing) driver.execute_script("return JSON.stringify(performance.timing)")
8.其他
driver.execute_script("arguments[0].click();", element)
,点击操作driver.execute_script("arguments[0].scrollIntoView();", element)
,移动到目标元素,类似于滑动查找
9.在页面的textarea文本框中输入内容
HTML代码如下:
<textarea value="" name="ta1"></textarea>
虽然可以通过name定位到元素,但是不能通过send_keys()输入内容,这种情况下就可以借助javascript代码输入内容
代码如下:
#定义输入的内容 input_text = "selenium" #将输入的内容与js拼接 js = "document.querySelector('textarea').value='"+ input_text + "';" print(js) driver.execute_script(js)
实操:通过JavaScript实现页面滚动,JavaScript操作滚动条:
from selenium import webdriver from time import sleep class casetest(object): def __init__(self): self.driver = webdriver.Chrome() self.driver.get('http://wwww.baidu.com') def test_execute1(self): self.driver.execute_script("alert('test')") # 同步执行 sleep(2) self.driver.switch_to.alert.accept() def test_execute2(self): js ='return document.title' title = self.driver.execute_script(js) # 取到百度的title print(title) def test_execute3(self): js ='var q=document.getElementById("kw");q.style.border="2px solid red"' self.driver.execute_script(js) # 把百度搜索边框变为红色 sleep(2) def test_execute4(self): # 滚动条滚动 self.driver.find_element_by_id('kw').send_keys('留白') self.driver.find_element_by_id('su').click() sleep(2) # 滚动到底部 js = 'window.scrollTo(0,document.body.scrollHeight)' self.driver.execute_script(js) sleep(2) if __name__ == '__main__': case = casetest() # case.test_execute1() # case.test_execute2() # case.test_execute3() case.test_execute4() case.driver.quit()