今天踩著七彩祥云沐浴著陽光
又給大家輸送新能量啦~

在上一篇:Selenium自動化測驗-獲取元素屬性資訊,介紹了如何獲取元素的內容、屬性、狀態資訊,寫自動化腳本有時會遇到 iframe嵌套頁面,這時直接定位是不行的,今天我們介紹怎么處理iframe,
iframe是HTML標簽,作用是檔案中的檔案,或者浮動的框架(FRAME),iframe元素會創建包含另外一個檔案的行內框架(即行內框架), 作用就是嵌套網頁,
以126網易郵箱賬號或手機號碼輸入框為例,我們先按正常定位方法試下能否定位成功,

代碼如下:

報錯資訊如下:
Traceback (most recent call last):......raise exception_class(message, screen, stacktrace)selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable (Session info: chrome=76.0.3809.132)
讓我們定位到元素看下到底發生了什么:

我們發現要定位的這個元素在iframe嵌套頁面里,我們要操作這個元素,需要先切換到iframe頁面,才能正常定位,
<iframe name="" frameborder="0" id="x-URS-iframe1571229605178.6365" scrolling="no" src="https://passport.126.com/webzj/v1.0.1/pub/index_dl2_new.html?cd=https%3A%2F%2Fmimg.127.net%2Fp%2Ffreemail%2Findex%2Funified%2Fstatic%2F2019%2Fcss%2F&cf=urs.126.589bdb88.css&MGID=1571229605178.6365&wdaId=&pkid=QdQXWEQ&product=mail126" style="width: 100%; height: 100%; border: none; background: none;"></iframe>
一、怎么切換到iframe
1.iframe有固定id或name屬性,
①有id屬性,且唯一;
driver.switch_to.frame('id')
②有name屬性,且唯一;
driver.switch_to.frame('name')

2.如果是動態id或者沒有id和name屬性,可以xpath或css定位解決,
檢查發現126郵箱id="x-URS-iframexxxxxx" 是動態id, 所以,我們不能直接通過id定位,
我們用之前學過的css定位,代碼如下:

郵箱或手機號輸入框寫入了vivi,表示切換iframe,定位成功,
這里再補充下xpath其他的三種方法:
1. contains(a, b) 如果a中含有字串b,則回傳true,否則回傳false,
driver.find_element_by_xpath("//div[contains(@id, 'btn-attention')]")
2. starts-with(a, b) 如果a是以字串b開頭,回傳true,否則回傳false,
driver.find_element_by_xpath("//div[starts-with(@id,'btn-attention')]")
3. ends-with(a, b) 如果a是以字串b結尾,回傳true,否則回傳false,
driver.find_element_by_xpath("//div[ends-with(@id, 'btn-attention')]")
實作代碼如下:

二、從iframe切回到主檔案
切換到iframe框架內后,就不能直接定位主檔案元素了,比如切換到iframe之后,再定位126郵箱頁面的企業郵箱鏈接,

代碼如下:

結果報錯,因為在iframe框架內,沒有切換到主檔案,不能直接定位到主檔案的元素,

處理辦法是退回主檔案,進行定位,使用:driver.switch_to.default_content(),

運行之后,切換到iframe框架,然后再切回主檔案,定位企業郵箱鏈接,
三、多層嵌套iframe的操作
有時候頁面會有多層嵌套iframe,這時候我們需要層層切換iframe
<iframe src="" id="index_main" name="main" scrolling="Yes" noresize="noresize"><iframe id="Editor1" src="" frameborder="0" scrolling="no" ><iframe id="eWebEditor" width="100%" height="100%" scrolling="yes" frameborder="0" src=""><input type="text" id="TeacherTxt" name="Teacher" size="12" maxlength="12" ></iframe></iframe></iframe>
比如這個原始碼中,有三層iframe嵌套,如果我們想定位到id="eWebEditor"這一層,代碼如下:
driver.switch_to.frame("inden_main")driver.switch_to.frame("Editor1")driver.switch_to.frame("eWebEditor")那么如果我們又想切換到上一層呢,driver.switch_to.parent_frame(),表示從當前的子iframe切換到父iframe,即上級iframe,???????
# 切換到第一層iframedriver.switch_to.frame("inden_main")# 切換到第二層iframedriver.switch_to.frame("Editor1")切換到第三層iframedriver.switch_to.frame("eWebEditor")重新切換到父iframe,即切換到第二層iframedriver.switch_to.parent_frame()
總結:遇到iframe時,需要先切換到iframe框架內,再進行定位;多層嵌套的,層層切換iframe;在iframe框架內,定位主檔案的元素,需切回到主檔案再定位,
下一篇將介紹定位一組元素,敬請期待~
感謝每一個認真閱讀我文章的人,看著粉絲一路的上漲和關注,禮尚往來總是要有的,雖然不是什么很值錢的東西,如果你用得到的話可以直接拿走:
① 2000多本Python電子書(主流和經典的書籍應該都有了)
② Python標準庫資料(最全中文版)
③ 專案原始碼(四五十個有趣且經典的練手專案及原始碼)
④ Python基礎入門、爬蟲、web開發、大資料分析方面的視頻(適合小白學習)

⑤ Python學習路線圖(告別不入流的學習)
在我的QQ技術交流群里(技術交流和資源共享,廣告進來腿給你打斷)
可以自助拿走,群號953306497(備注“csdn111”)群里的免費資料都是筆者十多年測驗生涯的精華,還有同行大神一起交流技術哦,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/292885.html
標籤:其他
上一篇:【2021】軟體測驗用例評審
下一篇:不裝了、攤牌了,我們要搞事情
