selenium自動化測試-處理iframe

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軟件測試小棧

相關文章
相關標籤/搜索