1. 程式人生 > 其它 >Selenium3自動化測試【27】Frame的操作

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。案例描述如下:

  1. 外部頁面有個指向Baidu的連結;

  2. 內嵌的頁面是通過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;【視訊號】:柒哥思維