Selenium自動化測試-iframe處理css
上一篇,咱們介紹了元素的內容、屬性、狀態信息。寫自動化腳本時會遇到 iframe嵌套頁面,這時直接定位是不行的,今天咱們要介紹怎麼處理iframe定html
iframe是HTML標籤,做用是文檔中的文檔,或者浮動的框架(FRAME)。iframe元素會建立包含另一個文檔的內聯框架(即行內框架), 做用就是嵌套網頁。python
以163網易郵箱帳號或手機號碼輸入框爲例,咱們先按正常定位方法試下可否定位成功。web
代碼以下:chrome
報錯信息以下:app
Traceback (most recent call last):框架
......學習
raise exception_class(message, screen, stacktrace)測試
selenium.common.exceptions.ElementNotInteractableException: Message: element not interactablespa
(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>
1、怎麼切換到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')]")
2、從iframe切回到主文檔
切換到iframe框架內後,就不能直接定位主文檔元素了,好比切換到iframe以後,再定位126郵箱頁面的企業郵箱連接。
代碼以下:
結果報錯,由於在iframe框架內,沒有切換到主文檔,不能直接定位到主文檔的元素
處理辦法是,需回主文檔,進行定位,使用:driver.switch_to.default_content()
運行以後,切換到iframe框架,而後再切回主文檔,定位企業郵箱連接
3、嵌多層套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軟件測試小棧