1. 程式人生 > >1106Selenium web自動化測試經驗分享-開啟多個視窗,切換控制代碼

1106Selenium web自動化測試經驗分享-開啟多個視窗,切換控制代碼

在web自動化測試中,好像很少會出現多視窗和切換控制代碼的情景。我之前曾想過一個情景:如果我開啟多個視窗,該怎樣更快更好的切換控制代碼呢?今天做個小分享。

一)切換控制代碼(handle)(1)

首先說明下情景:百度搜索Python,在搜尋的結果中點選一個‘官網’的超連結,打開了一個新視窗(進入的是百度認證)。大家都知道 如果想對新視窗的元素進行操作,需要先切換控制代碼。斷言控制代碼是否切換成功是 用列印title來判斷。

    def test_42a(self):
        """切換控制代碼"""
        driver = webdriver.Chrome()
        driver.maximize_window()
        driver.get("https://www.baidu.com")
        
        baidu = driver.current_window_handle
        print('--------' * 5)
        print('當前控制代碼:', baidu)
        print('當前頁面的title:', driver.title)
        self.xin_find_element(driver, By.ID, 'kw').send_keys('Python')
        self.xin_find_element(driver, By.ID, 'su').click()
        self.xin_find_element(driver, By.LINK_TEXT, '官網').click()
        
        all_handles = driver.window_handles
        print('所有的控制代碼: ', all_handles)

        #     1.迴圈判斷是否與首頁控制代碼相等
        #     2.如果不等,說明是新頁面的控制代碼
        #     3.獲取的新頁面控制代碼後,可以切換到新開啟的頁面上
        #     4.列印新頁面的title,看是否切換成功

        for handle in all_handles:
            if handle != baidu:
                driver.switch_to.window(handle)
        print('當前頁面的title:', driver.title)
        print('--------' * 5)

        time.sleep(1)
        driver.quit()
    def test_42b(self):
        """切換控制代碼"""
        driver = webdriver.Chrome()
        driver.maximize_window()
        driver.get("https://www.baidu.com")
        baidu = driver.current_window_handle
        print('--------' * 5)
        print('當前控制代碼:', baidu)
        print('當前頁面的title:', driver.title)
        self.xin_find_element(driver, By.ID, 'kw').send_keys('Python')
        self.xin_find_element(driver, By.ID, 'su').click()
        self.xin_find_element(driver, By.LINK_TEXT, '官網').click()

        all_handles = driver.window_handles
        print('所有的控制代碼: ', all_handles)

        # 直接獲取all_h這個list資料裡面第二個hand的值:all_h[1]

        driver.switch_to.window(all_handles[1])
        print('當前頁面的title:', driver.title)
        print('--------' * 5)
        
        time.sleep(1)
        driver.quit()

網上很多關於控制代碼的教程基本是這樣,我沒啥好說的。下圖就是結果。

在這裡插入圖片描述

二)開啟多個視窗,切換控制代碼(A)

使用js的指令碼來開啟新的瀏覽器視窗


    def test_42c(self):
        """新增瀏覽器視窗,列印handle和title"""
        driver = webdriver.Chrome()
        driver.maximize_window()
        driver.get("https://www.baidu.com/")
        hand11 = driver.current_window_handle
        print('---------' * 5)
        print('當前控制代碼:', hand11)
        print('當前頁面的title:', driver.title)
        print('---------' * 5)

        js1 = 'window.open("https://mail.qq.com/")'
        driver.execute_script(js1)
        # 此時新開一個視窗,控制代碼增多
        
        hand13 = driver.current_window_handle
        print('當前控制代碼:', hand13)
        print('當前頁面的title:', driver.title)
        all_handles = driver.window_handles
        print('所有的控制代碼: ', all_handles)
        driver.switch_to.window(all_handles[1])
        print('當前頁面的title:', driver.title)
        hand13 = driver.current_window_handle
        print('當前控制代碼:', hand13)
        print('---------' * 5)

        # driver.get("https://mail.163.com/")
        # driver.get() 只是把瀏覽器的網址改變。非新開啟瀏覽器視窗

        js2 = 'window.open("https://mail.163.com/")'
        driver.execute_script(js2)
        hand14 = driver.current_window_handle
        print('當前控制代碼:', hand14)
        print('當前頁面的title:', driver.title)
        all_handles = driver.window_handles
        print('所有的控制代碼: ', all_handles)
        driver.switch_to.window(all_handles[2])
        print('當前頁面的title:', driver.title)
        hand13 = driver.current_window_handle
        print('當前控制代碼:', hand13)
        print('---------' * 5)

        time.sleep(1)
        driver.quit()

在這裡插入圖片描述

看結果 就知道:即使已經開啟新的視窗,你的控制代碼和title還是前面視窗的,這就是切換控制代碼的原因了。

二)開啟多個視窗,切換控制代碼(B)

A 好多重複程式碼,一點不簡潔,不優雅。
下圖 我把網址放進一個list,迴圈遍歷下。

    def test_42d1(self):
        """開啟不同標籤頁面,切換控制代碼,列印標題"""
        driver = webdriver.Chrome()
        driver.maximize_window()
        web = ['https://mail.163.com/', 'https://mail.qq.com/', 'https://www.baidu.com/', 'https://mail.sina.com.cn/', 'https://exmail.qq.com/login', 'http://mail.10086.cn/', 'https://www.126.com/']
        for w in web:
            js = 'window.open("%s")' % w
            driver.execute_script(js)
            print('--------------' * 6)
            print(w)
            print(web.index(w))
            print('所有的控制代碼: ', driver.window_handles)
            driver.switch_to.window(driver.window_handles[int(web.index(w)) + 1])
            print('當前控制代碼:', driver.current_window_handle)
            print('當前title:', driver.title)
            print('--------------' * 6)

        time.sleep(1)
        driver.quit()

每次切換的控制代碼在所有控制代碼list的index是 列表的index + 1

我的谷歌瀏覽器每次新開會是空白標籤,我把沒切換控制代碼前的 列印控制代碼那行程式碼 刪掉了

在這裡插入圖片描述

二)開啟多個視窗,切換控制代碼 (C )

    def test_42d2(self):
        """開啟不同標籤頁面,切換控制代碼,列印標題"""
        driver = webdriver.Chrome()
        driver.maximize_window()
        web = ['https://mail.163.com/', 'https://mail.qq.com/', 'https://www.baidu.com/', 'https://mail.sina.com.cn/', 'https://exmail.qq.com/login', 'http://mail.10086.cn/', 'https://www.126.com/']
        for w in web:
            js = 'window.open("%s")' % w
            driver.execute_script(js)
            print('--------------' * 6)
            print(w)
            print(web.index(w))
            print('當前控制代碼:', driver.current_window_handle)
            print('所有的控制代碼: ', driver.window_handles)
            driver.switch_to.window(driver.window_handles[-1])
            print('當前控制代碼:', driver.current_window_handle)
            print('當前title:', driver.title)
            print('--------------' * 6)

        time.sleep(1)
        driver.quit()

沒切換控制代碼前的列印控制代碼 那行程式碼保留了,沒做修改
每次切換的控制代碼實際也是 所有的控制代碼list的最後一個。

在這裡插入圖片描述

一)切換控制代碼(handle)(2)

所以根據C的經驗,
一)(1) 裡面的第二個指令碼 driver.switch_to.window(all_handles[1])
也可以更改為: driver.switch_to.window(all_handles[-1])

實際考慮起來,好像 取list的最後一位值 更合適。

    def test_42b2(self):
        """切換控制代碼"""
        driver = webdriver.Chrome()
        driver.maximize_window()
        driver.get("https://www.baidu.com")
        baidu = driver.current_window_handle
        print('--------' * 5)
        print('當前控制代碼:', baidu)
        print('當前頁面的title:', driver.title)
        self.xin_find_element(driver, By.ID, 'kw').send_keys('Python')
        self.xin_find_element(driver, By.ID, 'su').click()
        self.xin_find_element(driver, By.LINK_TEXT, '官網').click()

        all_handles = driver.window_handles
        print('所有的控制代碼: ', all_handles)

        # 直接獲取all_h這個list資料裡面最後一個值:all_h[-1]

        driver.switch_to.window(all_handles[-1])
        print('當前頁面的title:', driver.title)
        print('--------' * 5)

        time.sleep(1)
        driver.quit()

交流技術 歡迎+QQ 153132336 zy