一 前言
在python selenium系列(八)元素定位進階之分層定位一文中,介紹了層級定位的思想。在實際應用中,還會遇到另外一種情況:元素屬性唯一,定位方法也正確,但元素卻定位不到。此時,需要檢查下該元素是否在frame裏。而針對這種情況,selenium 提供的switch_to.frame方法,可以輕鬆解決該問題。
二 實例
假設現在我們有如下一個頁面,需要對其進行自動化登錄操作:
可能你會以爲,這個頁面也沒什麼特別之處,登錄操作也是WEB UI自動化最常見、最基本的操作了,應該沒啥問題吧。事實是,雖然頁面元素都是唯一的,按常規的定位方法卻無法定位到輸入框和登錄按鈕,那原因是什麼呢?
先看下頁面源碼,如下:
從頁面源碼標註的紅框部分可知,要定位的元素是在一個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。