Python+Selenium練習篇之19-多窗口之間切換


本文來介紹如何處理driver在多窗口之間切換,想一下這樣的場景,在頁面A點擊一個連接,會觸發在新Tab或者新窗口打開頁面B,由於之前的driver實例對象在頁面A,但是你接下來的腳本是操作頁面B的元素,這樣就造成了找不到元素的報錯。本來介紹selenium中switch_to.window()方法來處理這個問題。

測試場景:打開百度新聞(頁面A),點擊熱點新聞中第一個新聞鏈接(一般是國家領導人的新聞),會在第二個窗口打開這個新聞的具體詳情頁(頁面B),測試需要去判斷你點擊這個這個新聞,在打開的詳情頁是否正確。

問題拆分:

1. 我們已經知道switch_to.window()方法可以處理窗口切換的問題

2. 在頁面A跳轉到頁面B之前,我們需要用一個變量保存這個新聞的標題

3. 切換到頁面B后,我們獲取這個新聞標題,然后和前面這個變量保存的值去對比,如果相等,那么就測試通過。

我們分兩個步驟去解答這個測試需求:

1. 先實現頁面A切換到頁面B

2. 頁面A和頁面B兩個新聞標題進行對比

先看看窗口切換的腳本代碼:


# coding=utf-8
import time
from selenium import webdriver


driver = webdriver.Chrome()
driver.maximize_window()
driver.get('http://news.baidu.com')
time.sleep(1)

driver.find_element_by_xpath("//*[@id='pane-news']/div/ul/li[1]/strong/a").click()
print driver.current_window_handle # 輸出當前窗口句柄
handles = driver.window_handles # 獲取當前全部窗口句柄集合
print handles # 輸出句柄集合

for handle in handles:# 切換窗口
if handle != driver.current_window_handle:
print 'switch to second window',handle
driver.close() # 關閉第一個窗口
driver.switch_to.window(handle) #切換到第二個窗口

代碼解釋:
1. 先打印當前窗口(頁面A)句柄,一個長字符串

2. 獲取全部窗口句柄,這里我們有兩個,打印出這兩個句柄。

3. for 循環遍歷,當發現其中一個句柄和當前句柄不相等,這里做了三件事,第一件,打印一個語句,告訴你馬上要切換到第二個窗口,第二件,關閉當前窗口,這里指頁面A,第三,切換到頁面B窗口。

這里在切換到第二個頁面時候,我關閉之前的頁面A,只是我個人測試習慣,你可以不關閉,但是你的要思路清晰,哪些元素在頁面A還是在頁面B,如果操作了頁面B后還要操作頁面A的元素,你還要切換到頁面A,為了麻煩,建議你每次切換都把前面頁面給關閉。

 

判斷在打開新頁面顯示的新聞標題是不是你剛剛點擊的新聞,腳本代碼如下:


# coding=utf-8
import time
from selenium import webdriver


driver = webdriver.Chrome()
driver.maximize_window()
driver.get('http://news.baidu.com')
time.sleep(1)

news_link = driver.find_element_by_xpath("//*[@id='pane-news']/div/ul/li[1]/strong/a")
page1_title_string = news_link.text #得到頁面A新聞標題
news_link.click() # 點擊新聞鏈接
time.sleep(1)
handles = driver.window_handles

for handle in handles:# 切換窗口(切換到搜狗)
if handle != driver.current_window_handle:
print 'switch to second window',handle
driver.close() # 關閉第一個窗口
driver.switch_to.window(handle) #切換到第二個窗口
page2_title_string = driver.find_element_by_xpath("//*[@id='yc_con_txt']/p[1]").text # 詳情頁有一個原標題

try :
assert page1_title_string in page2_title_string # 判斷頁面B標題是否包含頁面A標題
print ('Test Pass.')
except Exception as e:
print ('Test Fail')
注意:很有可能遇到,頁面A的標題是簡短,頁面B的標題是長標題,這個時候就需要采取,字符串包含的關系去斷言,我這里剛好打開的詳情頁有一個叫 “原標題:xxxx”,由於這個新聞具有時效性,等你看這篇文章,可能腳本運行不成功,需要調整下腳本,如果不好斷言,就放棄斷言部分,本文只學窗口切換,至於測試斷言技能,需要你不斷去寫腳本,去掌握和提高的部分。

 

歡迎關注老王公眾號


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM