Selenium自動化測試-iframe處理
上一篇,我們介紹了元素的內容、屬性、狀態信息。寫自動化腳本時會遇到 iframe嵌套頁面,這時直接定位是不行的,今天我們要介紹怎么處理iframe定
iframe是HTML標簽,作用是文檔中的文檔,或者浮動的框架(FRAME)。iframe元素會創建包含另外一個文檔的內聯框架(即行內框架), 作用就是嵌套網頁。
以163網易郵箱賬號或手機號碼輸入框為例,我們先按正常定位方法試下能否定位成功。
代碼如下:
報錯信息如下:
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-iframe1570682661270.0098" scrolling="no" style="width: 100%; height: 100%; border: none; background: none;" src="https://dl.reg.163.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.163.bc0e7491.css&MGID=1570682661270.0098&wdaId=&pkid=CvViHzl&product=mail163" __idm_frm__="472"></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
<frame 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="TeWebEditor這一層,代碼如下:
driver.switch_to_.rame("inden_main")
driver.switch_to_.rame("EEditor1)
driver.switch_to_.rame("eeWebEditor"
那么如果我們又想切換到上一層呢,driver.switch_to.parent_frame(),表示從當前的子iframe切換到父iframe,即上級iframe
# 切換到第一層iframe
driver.switch_to_.rame("inden_main")
# 切換到第二層iframe
driver.switch_to_.rame("EEditor1)
切換到第三層iframe
driver.switch_to_.rame("eeWebEditor)
重新切換到父iframe,即切換到第二層iframe
driver.switch_to.parent_frame()
總結:遇到iframe時,需要先切換到iframe框架內,再進行定位;多層嵌套的,層層切換iframe;在iframe框架內,定位主文檔的元素,需切回到主文檔再定位
下一篇將介紹單選框和多選框的操作
如果學習中有什么疑問,歡迎關注公眾號:ITester軟件測試小棧