Selenium3自動化測試【27】Frame的操作
本篇文章內容摘要 “ 講解Python3+Selenium3如何處理Frame窗體”
同步視訊知識與系列知識內容,可關注:【公眾號】:柒哥測試;【WX】:Lee-890;【視訊號】:柒哥思維
Frame窗體
我們在使用Selenium定位頁面元素的時候,有時會遇到定位不到的問題,在頁面上看到元素就在那兒,用瀏覽器的開發者工具也能夠看到,而程式碼執行就是定位不到。當遇到這種情況時,很有可能是有Frame存在。
Frame標籤有Frameset、Frame、IFrame三種,Frameset跟其他普通標籤沒有區別,不會影響到正常的定位。在頁面中我們經常能看到Frame或IFrame(Frame是整個頁面的框架,IFrame是內嵌的框架),由於WebDriver定位元素時只能在一個頁面上定位,所以對於IFrame這樣的情況,WebDriver是無法直接定位到元素的。Selenium有對應的方法對Frame進行操作。
WebDriver提供了switch_to.frame()方法來切換frame。
switch_to.frame(reference)
切換到IFrame中
青蔥歲月,彈指間,畢業季到來。恍惚昨天還是那稚氣未脫懵懂的樣子,才覺時光如此短暫。青蔥歲月,彈指間,畢業季到來。恍惚昨天還是那稚氣未脫懵懂的樣子,才覺時光如此短暫。
通過案例來講解如何切換Iframe。案例描述如下:
-
外部頁面有個指向Baidu的連結;
-
內嵌的頁面是通過Iframe實現的,巢狀的Bing首頁。
案例實現iframe.html頁面的程式碼如下:
<html> <body> <div class="alert" align="center">The link <a class="alert-link" href="http://www.baidu.com"> baidu </a> </div> <div class="row-fluid"> <div class="span-ifrme" align="center"> <h4 align="center">iframe</h4>> <iframe id="iname" name="nf" src="http://cn.bing.com" width="800" height="600"></iframe>> </div> </div> </body> </html>
iframe.html頁面呈現效果如圖所示。
案例要求:
單擊Bing搜尋頁的搜尋框完成關鍵字的搜尋。iframe.html程式碼中iframe標籤的id等於"INAME"。實現的程式碼如下:
from selenium import webdriver from time import sleep driver = webdriver.Firefox() driver.get("file:///D:/iframe.html") # 案例1:操作iframe # 切換窗體iframe(id:iname,name:nf) # 使用switch_to_frame,會在該方法上出現下劃線,不再推薦使用 # driver.switch_to_frame("iname") #不再推薦使用 driver.switch_to.frame("iname") driver.find_element_by_xpath("//input[@id='sb_form_q']").send_keys("bella") driver.find_element_by_xpath("//input[@id='sb_form_go']").click() sleep(2) driver.quit()
註解
需要特別說明的是:switch_to_frame()方法,有些人還在使用它,但是寫的時候在這樣寫的時候會發現,這行程式碼被畫上了刪除線,原因是這個方法已經被淘汰了,之後很有可能會不支援,因此建議的寫法是switch_to.frame()。
切換到主窗體
當切換到子窗體Frame中之後,便不能繼續操作主窗體中的元素,這時如果要操作主窗體中的元素,則需切回主窗體。
針對本節的案例,就是當對Bing搜尋頁完成操作後,如想單擊外部的Baidu連結,則需要切換到主窗體。
切換到主窗體的方法是
driver.switch_to.default_content()。
程式碼實現如下。
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get("file:///D:/iframe.html")
driver.switch_to.frame("iname")
driver.find_element_by_xpath("//input[@id='sb_form_q']").send_keys("bella")
driver.find_element_by_xpath("//input[@id='sb_form_go']").click()
sleep(2)
driver.switch_to.default_content() #switch_to.default_content() 跳到最外層
driver.find_element_by_xpath("//a[@href='http://www.baidu.com']").click()
sleep(2)
driver.quit()
段落引用如果遇到巢狀的Frame,由子窗體切換到它的上一級父窗體,則可以使用switch_to.parent_frame()方法。
針對本節的案例,就是當對Bing搜尋頁進行了操作後,如想單擊外部的Baidu連結,其實也是切換到它的父級,因此也可通過switch_to.parent_frame()方法實現,程式碼如下:
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox()
driver.get("file:///D:/iframe.html")
driver.switch_to.frame("iname")
driver.find_element_by_xpath("//input[@id='sb_form_q']").send_keys("bella")
driver.find_element_by_xpath("//input[@id='sb_form_go']").click()
sleep(2)
driver.switch_to.parent_frame() # 跳到iframe的上一級
driver.find_element_by_xpath("//a[@href='http://www.baidu.com']").click()
sleep(2)
driver.quit()
如果你覺的文章讀的不過癮,可以檢視詳細的視訊教程。
【2021】UI自動化測試:Selenium3自動化測試
https://ke.qq.com/course/3172187?tuin=9c43f38e
【測試全系列視訊課程】請點選我哦.....
地址:https://ke.qq.com/course/2525707?tuin=9c43f38e
圖書京東、噹噹有售
京東:https://item.jd.com/12784287.html
噹噹:http://product.dangdang.com/29177828.html)!
同步視訊知識與系列知識內容,可關注:【公眾號】:柒哥測試;【WX】:Lee-890;【視訊號】:柒哥思維