selenium-Frame、Window切換(10)

2、Frame切換
1.應用場景:沒法定位到頁面上的元素,調查頁面源代碼時,發現這個元素屬於frame或iframe標記下面的html裏的元素,此時就須要切換frame。
示例:
selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: 退出
2.Frame是html語法中的框架技術,包括frame和iframe兩種標記,均可以實現網頁的嵌套顯示,在一個主網頁里加入多個子網頁來顯示在同一個瀏覽器裏。
示例:
<html> ----主網頁
……
<frame id='header-frame' name='header-frame'>
<html> ---1個子網頁
……
<a>退出</a>
……
3.如何切換進入Frame內的子網頁裏?
(1)切換方式一:經過主網頁源代碼中frame或iframe標記的元素id或name屬性值來切換。--最經常使用!
語法:driver.switch_to.frame("frame或iframe標記的元素id或name屬性值")
示例1:
# 切換到header-frame
# <frame id='header-frame'……
driver.switch_to.frame("header-frame")
示例2:
# <frame id='f1' name='frame1'……
driver.switch_to.frame("frame1")
示例3:
# <iframe id='frame1' name='f1'……
driver.switch_to.frame("frame1")
(2)切換方式二:使用frame或iframe標記的元素在整個主網頁裏的索引號來切換。
語法:driver.switch_to.frame(索引號)
注意:索引號是表明當前frame或iframe標記的元素是主網頁裏的第幾個的整數,從0開始編號。
(3)切換方式三:使用其餘方式來定位到frame或iframe標記的元素,而後把定位到的元素對象做爲切換frame時的參數。其餘方式包括class name或xpath或css selector定位等任何定位方法。---語法最複雜,功能最強大!
語法:
變量=driver.find_element(By.XXX,"xxxx")
driver.switch_to.frame(變量)
注意:若是使用FirePath校驗本身書寫的xpath或css表達式是否正確,須要在FirePath面板左上角下拉列表裏選擇Top Window,這樣就是在主網頁裏進行校驗。
示例:
# <frame src='frame1.html'>
f=driver.find_element(By.XPATH,"//frame[@src='frame1.html']")#//frame[contains(@src,'frame1')]
driver.switch_to.frame(f)
4.切換進入Frame的子網頁裏之後,能夠定位該子網頁裏的全部元素來操做,可是不能定位其餘子網頁或主網頁裏的元素。
(1)若是已經切換進入某個frame內,從該frame回到默認主網頁,下面的語法能夠切換:
driver.switch_to.default_content()
#---比如從包間1出來,回到進門處---就是指主網頁
(2)若是已經回到默認主網頁,就能夠切換到其餘frame裏。若是在一個子網頁裏,不能切換到同級的其餘子網頁裏,不然拋出NoSuchFrameException
示例:
driver.switch_to.frame(xxx)
……
driver.switch_to.default_content()
driver.switch_to.frame(yyy)
……

css

3、Window切換(窗口切換)
1.應用場景:測試網頁裏的超級連接或按鈕或圖片點擊動做後,若是看到出現了一個新的瀏覽器窗口(也可能顯示爲一個瀏覽器裏的一個新的標籤頁),咱們須要切換Window才能操做新窗口裏的網頁。
示例:ECShop前臺首頁,點擊「EC論壇」,就會出現一個新的瀏覽器窗口(以新的標籤頁形式顯示)。
2.切換Window語法:driver.switch_to.window(窗口句柄)
3.窗口句柄(Window Handle):是Windows操做系統在啓動每一個窗口時,爲每一個窗口分配的一個惟一標識信息,就是窗口句柄,每一個窗口的句柄都不會與其餘窗口句柄重複。
4.說明:由於窗口句柄(Window Handle)是Windows操做系統在啓動瀏覽器時動態分配的信息,因此咱們沒法提早調查網頁來得到這個信息,咱們須要在程序代碼中瀏覽器啓動的步驟後面,經過書寫代碼來動態得到當前的窗口句柄。
類比:
Windows操做系統 ---派出所
窗口 ---人
窗口啓動起來 ---人出生後上戶口
窗口句柄---身份證號
寫代碼時不知道窗口句柄具體的值----人尚未出生不知道他的身份證號
運行代碼過程當中窗口啓動起來了就有窗口句柄了----人出生去上完戶口,此時有身份證號了
總結:寫代碼時,能夠在出現新窗口的步驟後面,寫得到當前窗口句柄的代碼。
5.得到窗口句柄的語法:
(1)driver.current_window_handle:得到此屬性值能夠得到當前窗口的句柄。
(2)driver.window_handles:得到此屬性值能夠得到全部由WebDriver本次運行所啓動的窗口的句柄,是以list類型存儲的。
6.採用排除法切換到新窗口的算法---適用於一共只有2個窗口的狀況:
(1)得到當前窗口句柄
(2)得到全部窗口句柄
(3)循環遍歷全部窗口句柄
(4)判斷若是不等於第(1)步驟的當前窗口句柄
(5)就用這個遍歷到的句柄來切換
(6)退出循環html

 

1、Window切換
7.如今一共有2個瀏覽器窗口,切換窗口的程序代碼:
# 切換到新窗口
a=driver.current_window_handle
b=driver.window_handles
for c in b:
if c!=a:
driver.switch_to.window(c)
break
8.如今一共有3個或3個以上瀏覽器窗口,切換到目標窗口的程序代碼:---瞭解!使用較少!
(1)說明:3個或3個以上的狀況,在break退出循環以前判斷是不是目標瀏覽器窗口,是的話,就退出,不是的話,繼續循環。
(2)判斷是不是目標瀏覽器窗口,須要根據業務數據來判斷,好比當前窗口裏當前網頁的標題、url、網頁源代碼、網頁裏是否能夠定位到目標元素均可以做爲判斷的條件。
a.得到當前窗口裏當前網頁的標題:driver.title
b.得到當前窗口裏當前網頁url:driver.current_url
c.得到當前窗口裏當前網頁源代碼(是一個很長的字符串,從<html>開始,到</html>結束):driver.page_source
示例:
# 如今一共有3個窗口,但願能切換到網頁標題是「複選框案例」的窗口
a=driver.current_window_handle
b=driver.window_handles
for c in b:
if c!=a:
driver.switch_to.window(c)
if driver.title=="複選框案例":
break
(3)判斷業務數據的代碼:
a.判斷業務數據等於某值
示例1:
if driver.title=="複選框案例":
示例2:
if driver.current_url=="http://localhost/demo03.html":
b.判斷業務數據包含某值:
示例1:
if "複選框" in driver.title:
示例2:
if "demo03" in driver.current_url:
示例3:
if "登山" in driver.page_source
c.判斷業務數據開頭部分:
示例:
if driver.title.startswith("複選框"):
d.判斷業務數據結尾部分:
示例:
if driver.current_url.endswith("demo03.html"):
9.補充:關閉瀏覽器窗口的函數
(1)driver.quit() 一次性關閉全部由WebDriver代碼運行而啓動的瀏覽器窗口,通常放在代碼末尾,用於清理測試環境。
(2)driver.close() 只關閉當前瀏覽器窗口,也就是你剛剛還在操做的那個瀏覽器窗口或剛切換過來的那個窗口,只關閉一個窗口,不關閉其餘窗口,通常放在業務步驟之間。
說明:關閉了當前瀏覽器窗口之後,若是想操做其餘瀏覽器窗口,仍是須要切換過去才能操做。
10.目前WebDriver問題:若是在一個瀏覽器窗口作了一個操做後,若是出現了新的瀏覽器窗口,就算不切換到新窗口,還想繼續操做舊窗口,也必須先得到當前窗口句柄,而後再用這個句柄切換,才能操做舊窗口。
示例:
driver=webdriver.Firefox()#打開一個瀏覽器窗口
driver.get("http://localhost/demo05.html")
a2=driver.find_element(By.XPATH,"//a[2]")
a2.click()#出現一個新的瀏覽器窗口
#得到當前窗口句柄,而後再用這個句柄切換
a=driver.current_window_handle
driver.switch_to.window(a)
a3=driver.find_element(By.XPATH,"//a[3]")
a3.click()#又出現一個新的瀏覽器窗口web

相關文章
相關標籤/搜索