1. 程式人生 > >1108Selenium web自動化測試經驗分享-JS處理滾動條

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
歡迎關注 微信公眾號:紫雲小站