1106Selenium web自動化測試經驗分享-開啟多個視窗,切換控制代碼
阿新 • • 發佈:2018-11-10
在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