前言
① frame 標簽有 frameset 、 frame 、 iframe 三種; frameset 跟其他普通標簽沒有區別,不會影響到元素正常的定位;而 frame 與 iframe 對selenium定位而言是一樣的,selenium工具中有一組方法對frame/iframe框架進行操作。
②iframe 元素會創建包含另外一個文檔的內聯框架(即行內框架)。【解釋:就像是我們的某個主頁,里面有好多小模塊,每 個 小模塊用這個叫做iframe的東西分開來,方便維護,也方便開發各自開發各自的部分,互不相干】
③通常不在同一個iframe分為兩種情況:一種是包含(嵌套),一種是平級。
④為什么我們要定位iframe?介於iframe是獨立開的一個一個的小模塊,就像是船艙的特性,所以iframe就行船艙的艙門,想要進入船艙去找東西,就必須先進入艙門,所以當元素在不同的iframe時,就必須先進入到元素所在地的iframe之后才能定位到元素。
⑤定位iframe幾種方式:1.用iframe中的ID來定位;2.用iframe中的name來定位;3.用xpath來定位;4.用css來定位
1、進入iframe
♦ 首先我們用self.driver.switch_to.frame()這個方法來進入iframe框架,如果iframe是包含關系,需要從最外面的iframe一層一層進入。 self.driver.switch_to.frame() ♦1.用iframe中的ID來定位 self.driver.switch_to.frame(‘noticeCheckWin’)
♦2.用iframe中的name來定位 self.driver.switch_to.frame(‘noticeCheckWin’)
♦3.用xpath來定位 self.frame2 = self.driver.find_element_by_xpath(‘/html/body/div[2]/div[2]/div[2]/iframe[3]’) self.driver.switch_to.frame(self.frame2)#定位動態的iframe,可以把動態的部分刪了然后再用xpath定位
♦4.用css來定位 self.frame3 = self.driver.find_element_by_css_selector(‘body > div.h-main > div.h-screen.layout > div.h-screen-con > iframe’)#也可以查出所有的路徑用下標切出來 self.driver.switch_to.frame(self.frame3)
2、退出iframe ♦ 退出iframe有兩種形式:1.退出所有的iframe切換到主文檔 2.退回到父級iframe ♦1.退出所有的iframe切換到主文檔 self.driver.switch_to.default_content()、
♦2.退回到父級iframe switch to.parent_frame()#退回到自己想要的層級
方法
①iframe框架有name或者id屬性值
driver.switch_to.frame('iframe-id')
driver.switch_to.frame('iframe-name')
【注意】不得不提到 switch_to_frame() 方法,很多人在這樣寫的時候會發現,這句話被划上了刪除線,原因是最新版本的selenium庫對相關方法進行了升級,之后很有可能會不支持,建議的寫法是 switch_to.frame()
②frame/iframe框架沒有name或者id屬性值:采用xpath元素定位方式(使用iframe的其他屬性)
例如:

代碼如下:
xf = self.driver.find_element_by_xpath('//iframe[@allowtransparency="true"]')
driver.switch_to.frame(xf)
③跳出當前frame/iframe框架(返回上一層的frame/iframe框架)
self.driver.switch_to.parent_frame()
④返回最外層frame/iframe框架
driver.switch_to.default_content()
實例
實例①:切入frame框架
selenium工具提供了 switch_to.frame() 方法來切入frame框架;
switch_to.frame(reference) # reference是傳入的參數,用來定位frame,可以傳入id、name、index以及selenium的WebElement對象;
html代碼:
<html> <head><title>iframe test</title></head> <body> <iframe id="frame1" src="" name="name1"></iframe> <br> <iframe id="frame2" src="" name="name2"></iframe> </body> </html>
python腳本代碼:
from selenium import webdriver driver = webdriver.Chrome() driver.switch_to.frame(0) # 1.用frame的index來定位,第一個是0
# driver.switch_to.frame("frame1") # 2.用id來定位
# driver.switch_to.frame("name1") # 3.用name來定位
# driver.switch_to.frame(driver.find_element_by_id("frame1")) # 4.用WebElement對象來定位
通常采用id和name定位元素的方式就能夠解決絕大多數問題。但有時候frame標簽並無這兩項屬性,則可以用index和WebElement來定位:
(1)index從0開始,傳入整型參數即判定為用index定位,傳入str參數則判定為用id/name定位。
(2)WebElement對象,即用find_element系列方法所取得的對象,我們可以用tag_name、xpath等來定位frame對象。
實例②:切出frame框架
切到frame框架中之后,我們便不能繼續操作主文檔的元素,這時如果想操作主文檔內容,則需切回主文檔。
selenium工具提供了 switch_to.default_content() 方法來切出 frame框架;
driver.switch_to.default_content()
實例③:嵌套frame框架的操作
html代碼:
<html> <head><title>iframe test</title></head> <body> <iframe id="frame1" src="" name="name1"> <iframe id="frame2" src="" name="name2"> </iframe> </iframe> </body> </html>
1、從主文檔切到frame2框架,一層層切進去。
driver.switch_to.frame("frame1") driver.switch_to.frame("frame2")
2、從frame2框架再切回frame1框架,這里selenium工具給我們提供了一個方法能夠從子frame切回到父frame,而不用我們切回主文檔再切進來。
driver.switch_to.parent_frame() # 如果當前已是主文檔,則無效果
解釋:有了parent_frame()這個相當於后退的方法,我們可以隨意切換不同的frame框架,隨意的在不同的層級的frame框架中跳來跳去了。
