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

 

posted @ 2022-08-18 15:18  云long  阅读(3388)  评论(0编辑  收藏  举报