1108Selenium web自動化測試經驗分享-JS處理滾動條
web自動化測試中,有一個情景是要滑動瀏覽器的滾動條(或者說 翻頁),目前的處理方式多是用JS。本期分享主要內容有:處理整個瀏覽器滾動條、處理某個內嵌的滾動條、滾動到某元素的位置、翻頁PageDown。
一)整個瀏覽器的滾動條處理
個人推薦掌握的是 ‘window.scrollTo()’,其他都可以直接忽視掉
1A.scrollTo()
‘window.scrollTo(x,y)’ x,y 絕對座標 掌握!!!
def test_46js1(self): """控制滾動條-整個瀏覽器-scrollTo()""" self.driver = webdriver.Chrome() self.driver.maximize_window() self.driver.get("https://www.baidu.com") self.xin_find_element(self.driver, By.ID, 'kw').send_keys('Python') self.xin_find_element(self.driver, By.ID, 'su').click() time.sleep(2) js1 = 'window.scrollTo(0,10000)' self.driver.execute_script(js1) time.sleep(2) js2 = 'window.scrollTo(0,0)' self.driver.execute_script(js2) time.sleep(1) self.driver.quit()
1B.scrollTo()
’document.documentElement.scrollTo(x,y)’ 瞭解
def test_46js4a(self): """控制滾動條-整個瀏覽器-scrollTo()""" self.driver = webdriver.Chrome() self.driver.maximize_window() self.driver.get("https://www.baidu.com") self.xin_find_element(self.driver, By.ID, 'kw').send_keys('Python') self.xin_find_element(self.driver, By.ID, 'su').click() time.sleep(2) js3 = 'document.documentElement.scrollTo(0,10000)' self.driver.execute_script(js3) time.sleep(2) js4 = 'document.documentElement.scrollTo(0,0)' self.driver.execute_script(js4) time.sleep(1) self.driver.quit()
2.scrollHeight 獲取滾動條高度
’window.scrollTo(0,document.documentElement.scrollHeight)’ 瞭解。
def test_46js2b(self): """控制滾動條-整個瀏覽器-scrollTo(0,scrollHeight)""" self.driver = webdriver.Chrome() self.driver.maximize_window() self.driver.get("https://www.baidu.com") self.xin_find_element(self.driver, By.ID, 'kw').send_keys('Python') self.xin_find_element(self.driver, By.ID, 'su').click() time.sleep(2) # scrollHeight 獲取物件的滾動高度。 js12 = 'window.scrollTo(0,document.documentElement.scrollHeight)' self.driver.execute_script(js12) time.sleep(1) self.driver.quit()
3.scrollWidth 獲取橫向滾動條寬度
’window.scrollTo(document.documentElement.scrollWidth,0)’ 瞭解。
def test_46js2c(self):
"""控制滾動條-整個瀏覽器-scrollTo(scrollWidth,0)"""
self.driver = webdriver.Chrome()
# 左右最好不要最大化
self.driver.get("https://www.baidu.com")
self.xin_find_element(self.driver, By.ID, 'kw').send_keys('Python')
self.xin_find_element(self.driver, By.ID, 'su').click()
time.sleep(2)
# scrollWidth 獲取物件的滾動寬度
js12 = 'window.scrollTo(document.documentElement.scrollWidth,0)'
self.driver.execute_script(js12)
time.sleep(1)
self.driver.quit()
4.scrollTop
’document.documentElement.scrollTop=10000’ 瞭解。
def test_46js3a(self):
"""控制滾動條-整個瀏覽器-scrollTop"""
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.get("https://www.baidu.com")
self.xin_find_element(self.driver, By.ID, 'kw').send_keys('Python')
self.xin_find_element(self.driver, By.ID, 'su').click()
time.sleep(2)
js = 'document.documentElement.scrollTop=10000'
self.driver.execute_script(js)
time.sleep(2)
js2 = 'document.documentElement.scrollTop=50'
self.driver.execute_script(js2)
time.sleep(1)
self.driver.quit()
5.scrollLeft
’document.documentElement.scrollLeft=10000’ 瞭解。
def test_46js4(self):
"""控制滾動條-整個瀏覽器-scrollLeft"""
# 左右滑動 是不能使用最大化瀏覽器
self.driver = webdriver.Chrome()
self.driver.get("https://www.baidu.com")
self.xin_find_element(self.driver, By.ID, 'kw').send_keys('Python')
self.xin_find_element(self.driver, By.ID, 'su').click()
time.sleep(2)
# 在HTML頁面中,由於前端技術框架的原因,頁面元素為動態顯示,元素根據滾動條的下拉而被載入
js3 = 'document.documentElement.scrollLeft=10000'
self.driver.execute_script(js3)
time.sleep(2)
js4 = 'document.documentElement.scrollLeft=0'
self.driver.execute_script(js4)
time.sleep(1)
self.driver.quit()
6A.scrollBY()
’window.scrollBy(x,y)’ 相對量 瞭解。
def test_46js9b(self):
"""滾動條-scrollBy(x,y)方法滾動當前window中顯示的文件,x和y指定滾動的相對量"""
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.get("https://www.baidu.com")
self.xin_find_element(self.driver, By.ID, 'kw').send_keys('Python')
self.xin_find_element(self.driver, By.ID, 'su').click()
time.sleep(2)
js11 = 'window.scrollBy(0,600)'
self.driver.execute_script(js11)
time.sleep(2)
js111 = 'window.scrollBy(0,-600)'
self.driver.execute_script(js111)
time.sleep(2)
self.driver.quit()
6B.scrollBy()
’document.documentElement.scrollBy(x,y)’ 相對量 瞭解。
def test_46js9c(self):
"""控制滾動條-整個瀏覽器-scrollBy(x,y)"""
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.get("https://www.baidu.com")
self.xin_find_element(self.driver, By.ID, 'kw').send_keys('Python')
self.xin_find_element(self.driver, By.ID, 'su').click()
time.sleep(2)
js = 'document.documentElement.scrollBy(0,1500)'
self.driver.execute_script(js)
time.sleep(2)
js2 = 'document.documentElement.scrollBy(0,-1500)'
self.driver.execute_script(js2)
time.sleep(1)
self.driver.quit()
二)內嵌視窗的滾動條的處理
個人推薦掌握的是 ‘document.XXXXXXX.scrollTo()’,其他都可以直接忽視掉
在某個網頁有滾動條,想要處理,那肯定得先定位到這個元素。
JS定位元素的常用方法:
1.id和querySelector獲取的是單個element元素物件,其他都是elements返回都是list物件
document.getElementById(“XXXX”)
document.querySelector(“XXXX”) CSS定位
2.name不推薦
document.getElementsByName(“XXXX”)
3.標籤名
document.getElementsByTagName(“XXXX”)
4.class 類
document.getElementsByClassName(“XXXX”)
5.css選擇器
document.querySelectorAll(“XXXX”)
下圖程式碼 就是querySelectorAll()和querySelector()的不同用法
def test_46js8(self):
driver = webdriver.Chrome()
driver.get(r'D:\new_web\內嵌div滾動條.html')
time.sleep(1)
js3 = 'document.querySelectorAll("div.scroll")[0].scrollTo(200,200)'
driver.execute_script(js3)
time.sleep(2)
js3 = 'document.querySelector("div.scroll").scrollTo(0,0)'
driver.execute_script(js3)
time.sleep(2)
driver.quit()
連結:https://pan.baidu.com/s/1KYsvOjTIyXzYjrsN5fQDhw
提取碼:bnyn
是程式碼中的那個 內嵌div滾動條.html
1.scrollTop
def test_46js5(self):
"""控制滾動條-內嵌滾動條-scrollTop"""
driver = webdriver.Chrome()
driver.get(r'D:\new_web\內嵌div滾動條.html')
# 通過控制scrollTop的值來控制滾動條高度
time.sleep(1)
js = 'document.getElementsByClassName("scroll")[0].scrollTop=10000'
driver.execute_script(js)
time.sleep(2)
js1 = 'document.getElementsByClassName("scroll")[0].scrollTop=0'
driver.execute_script(js1)
time.sleep(2)
driver.quit()
2.scrollLeft
def test_46js6(self):
"""控制滾動條-內嵌滾動條-scrollLeft"""
driver = webdriver.Chrome()
driver.get(r'D:\new_web\內嵌div滾動條.html')
# 通過控制scrollLeft的值來控制滾動條高度
time.sleep(1)
js = 'document.getElementsByClassName("scroll")[0].scrollLeft=10000'
driver.execute_script(js)
time.sleep(2)
js1 = 'document.getElementsByClassName("scroll")[0].scrollLeft=0'
driver.execute_script(js1)
time.sleep(2)
driver.quit()
3.scrollTo()
def test_46js7(self):
"""控制滾動條-內嵌滾動條-scrollTo()"""
driver = webdriver.Chrome()
driver.get(r'D:\new_web\內嵌div滾動條.html')
time.sleep(1)
js = 'document.getElementsByClassName("scroll")[0].scrollTo(10000,10000)'
driver.execute_script(js)
time.sleep(2)
js1 = 'document.getElementsByClassName("scroll")[0].scrollTo(0,0)'
driver.execute_script(js1)
time.sleep(2)
driver.quit()
三)滾動條拉到 具體元素的位置
開啟網頁 有時候無法確定要操作的元素的位置,怎麼辦呢?
這個時候可以先讓頁面直接跳到元素出現的位置,然後再操作
就是說:將滾動條 拖動到 需要顯示的元素的位置
target1111 = driver.find_element_by_xxx(“XXXXX”)
driver.execute_script(“arguments[0].scrollIntoView();”,target1111)
def test_46js9a(self):
"""滾動條拉到指定位置(具體元素)-target-scrollIntoView方法滾動當前元素,進入瀏覽器的可見區域"""
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.get("https://www.baidu.com")
self.xin_find_element(self.driver, By.ID, 'kw').send_keys('Python')
self.xin_find_element(self.driver, By.ID, 'su').click()
time.sleep(2)
# 下面兩個方式都可以
# target11 = self.xin_find_element(self.driver, By.CSS_SELECTOR, 'div#page>a:nth-child(2)')
target11 = self.xin_find_element(self.driver, By.XPATH, '//div[@id="page"]/a[3]')
self.driver.execute_script("arguments[0].scrollIntoView();", target11)
time.sleep(2)
self.driver.quit()
上圖程式碼 模擬的是 百度搜索後 將滾動條拖到 最下面第三頁 的位置
四)PageDown 下一頁
模擬鍵盤的PageDown和PageUp來實現向下翻頁 向上翻頁
def test_36d(self):
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.maximize_window()
self.xin_find_element(driver, By.ID, 'kw').send_keys('Python')
from selenium.webdriver.common.keys import Keys
self.xin_find_element(driver, By.ID, 'su').send_keys(Keys.ENTER)
time.sleep(2)
self.xin_find_element(driver, By.ID, 'su').send_keys(Keys.PAGE_DOWN)
time.sleep(2)
self.xin_find_element(driver, By.ID, 'su').send_keys(Keys.PAGE_DOWN)
time.sleep(1)
self.xin_find_element(driver, By.ID, 'su').send_keys(Keys.PAGE_UP)
time.sleep(2)
self.xin_find_element(driver, By.ID, 'su').send_keys(Keys.PAGE_UP)
time.sleep(1)
driver.quit()
我用的是谷歌瀏覽器,實際js對於Chrome和ie還有一種‘document.body.xxxx’的寫法,但我執行用例的時候有些地方出錯,故而就一點沒寫。
總結起來:我還是推薦"window.scrollTo(x,y)處理整個瀏覽器的滾動條"和處理內嵌滾動條的 ‘document.XXXXXXX.scrollTo()’
交流技術 歡迎+QQ 153132336 zy
歡迎關注 微信公眾號:紫雲小站