1. 程式人生 > >Python+Selenium練習篇之27-多視窗之間切換

Python+Selenium練習篇之27-多視窗之間切換

本文來介紹如何處理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”,由於這個新聞具有時效性,等你看這篇文章,可能指令碼執行不成功,需要調整下指令碼,如果不好斷言,就放棄斷言部分,本文只學視窗切換,至於測試斷言技能,需要你不斷去寫指令碼,去掌握和提高的部分。