简介
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()