python selenium系列(九)元素定位進階之多層框架定位

前言

python selenium系列(八)元素定位進階之分層定位一文中,介紹了層級定位的思想。在實際應用中,還會遇到另外一種情況:元素屬性唯一,定位方法也正確,但元素卻定位不到。此時,需要檢查下該元素是否在frame裏。而針對這種情況,selenium 提供的switch_to.frame方法,可以輕鬆解決該問題。

 

實例

假設現在我們有如下一個頁面,需要對其進行自動化登錄操作:

 9.1.png


可能你會以爲,這個頁面也沒什麼特別之處,登錄操作也是WEB UI自動化最常見、最基本的操作了,應該沒啥問題吧。事實是,雖然頁面元素都是唯一的,按常規的定位方法卻無法定位到輸入框和登錄按鈕,那原因是什麼呢?

 

先看下頁面源碼,如下

 9.2.png

 

從頁面源碼標註的紅框部分可知,要定位的元素是在一個iframe裏,也就是說,當前頁面嵌套了一個iframe頁面,而登錄操作的元素正是在這個iframe頁面。所以,要操作iframe的元素,需要先轉到這個頁面,然後才能對該頁面的元素進行操作,此時,需要使用switch_to.frame方法。

 

登錄腳本源碼主要部分如下

 

#因登錄元素在iframe裏,需要先定位到該iframe後再操作
#因該frame沒有id,不能直接傳入switch_to.frame
iframe = browser.find_element_by_class_name("cnt-frame"
#登錄元素在frame裏,需要先switch進去
browser.switch_to.frame(iframe) 

#點擊賬戶登錄標籤頁,切換到登錄窗口
browser.find_element_by_xpath("html/body/div[1]/div/div/div[1]/div[1]/div[2]/div/ul/li[2]").click() 

#定位到輸入框
input_element = browser.find_element_by_id("inp_account_content"
#輸入客戶號
input_element.send_keys(100200) 

#點擊登錄按鈕
login_element = WebDriverWait(browser, 5).until(EC.visibility_of_element_located((By.XPATH,"html/body/div[1]/div/div/div[1]/div[1]/div[2]/div/div/div[3]/div/div/form/div[3]/button"))) 
login_element.click()

 

在腳本里,主要使用了switch_to.frame方法操作iframe中的元素,爲了簡便,元素的xpath表達式是直接在瀏覽器複製的,不建議實際應用中直接複製,難以閱讀和維護。

 

三 總結

本文主要介紹了多框架場景中iframe元素的定位方式,使用了switch_to.frame方法;如果是多窗口場景,相應的方法是switch_to.window,思路相同,不在贅述。


四 其他資源

關於python學習、分享、交流,筆者開通了微信公衆號【小蟒社區】,感興趣的朋友可以關注下,歡迎加入,建立屬於我們自己的小圈子,一起學python。

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章