您好,登錄后才能下訂單哦!
這篇文章主要介紹了Python+Selenium定位不到元素的原因有哪些,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
在做web應用的自動化測試時,定位元素是必不可少的,這個過程經常會碰到定位不到元素的情況(報selenium.common.exceptions.NoSuchElementException),一般可以從以下幾個方面著手解決:
這個是最常見的原因,首先要理解下frame的實質,frame中實際上是嵌入了另一個頁面,而webdriver每次只能在一個頁面識別,因此需要先定位到相應的frame,對那個頁面里的元素進行定位。
解決方案:
如果iframe有name或id的話,直接使用switch_to_frame("name值")或switch_to_frame("id值")。如下:
driver=webdriver.Firefox() driver.get(r'http://www.126.com/') driver.switch_to_frame('x-URS-iframe') #需先跳轉到iframe框架 username=driver.find_element_by_name('email') username.clear()
如果iframe沒有name或id的話,則可以通過下面的方式定位:
#先定位到iframe elementi= driver.find_element_by_class_name('APP-editor-iframe') #再將定位對象傳給switch_to_frame()方法 driver.switch_to_frame(elementi)
如果完成操作后,可以通過switch_to.parent_content()方法跳出當前iframe,或者還可以通過switch_to.default_content()方法跳回最外層的頁面。
由于Xpath層級太復雜,容易犯錯。但是該定位方式能夠有效定位絕大部分的元素,建議掌握。
解決方案:
2.1可以使用Firefox的firePath,復制xpath路徑。該方式容易因為層級改變而需要重新編寫過xpath路徑,不建議使用,初學者可以先復制路徑,然后嘗試去修改它。
2.2提高下寫xpath的水平。
可以詳看筆者另外一篇博文總結:Selenuim+Python之元素定位總結及實例說明
該博文詳細總結了Xpath的使用,多組合定位一般都能實現定位問題。
如何檢驗編寫的Xpath是否正確?編寫好Xpath路徑,可以直接復制到搜狐瀏覽器的firebug查看html源碼,通過Xpath搜索:如下紅色框,若無報錯,則說明編寫的Xpath路徑沒錯。
find_element_by_xpath("//input[@id='kw']")
這種情況一般說來,可以設置等待,等待頁面顯示之后再操作,這與人手工操作的原理一樣:
3.1設置等待時間;缺點是需要設置較長的等待時間,案例多了測試就很慢;
3.2設置等待頁面的某個元素出現,比如一個文本、一個輸入框都可以,一旦指定的元素出現,就可以做操作。
3.3在調試的過程中可以把頁面的html代碼打印出來,以便分析。
解決方案:
導入時間模塊。
import time time.sleep(3)
解決方案:
如果發現是動態id,直接用xpath定位或其他方式定位。
如百度登錄彈出框登錄百度賬號,需先定位到百度彈出框,然后再定位到用戶名密碼登錄。
# coding=utf-8 ''' Created on 2016-7-20 @author: Jennifer Project:登錄百度賬號 ''' from selenium import webdriver import time driver = webdriver.Firefox() driver.get("http://www.baidu.com/") time.sleep(3) #點擊登錄:有些name為tj_login的元素為不可見的,點擊可見的那個登錄按鈕即可。 #否則會報:ElementNotVisibleException element0=driver.find_elements_by_name("tj_login") for ele0 in element0: if ele0.is_displayed(): ele0.click() #在登錄彈出框,需先定位到登錄彈出框 #否則會報:NoSuchElementException element1=driver.find_element_by_class_name("tang-content") element11=element1.find_element_by_id("TANGRAM__PSP_8__userName") element11.clear() element11.send_keys("登錄名") element2=element1.find_element_by_id("TANGRAM__PSP_8__password") element2.clear() element2.send_keys("密碼") element3=element1.find_element_by_id("TANGRAM__PSP_8__submit") element3.click() element3.submit() try: assert "登錄名" in driver.page_source except AssertionError: print "登錄失敗" else: print "登錄成功" time.sleep(3) finally: print "測試記錄:已測試" driver.close()
代碼:
from selenium import webdriver from PIL import Image import time import pandas as pd import datetime driver = webdriver.Ie(r"C:\Program Files\internet explorer\IEDriverServer2.exe") driver.get("https://www.cib.com.cn/cn/minipage/page/login-firmalert.html") print("請輸入用戶名和帳號密碼,實現登錄") input("====按任意鍵繼續====") # print(driver.current_url) # https://corporatebank.cib.com.cn/firm/main/mainx.do frame = driver.find_element_by_id("workframe") # 切換到 iframe 標簽中查找 driver.switch_to_frame(frame) # 切入 iframe 標簽 # driver.switch_to_default_content() # 切出 iframe 標簽 也可以 直接 默認的 driver.find_element_by_xpath('//div[@id="fast-way"]/ul/li[2]/a').click() # 點擊 當日明細查詢按鈕 time.sleep(2) try: driver.find_element_by_xpath('//div[@id="fast-way"]/ul/li[2]/a').click() # 點擊 當日明細查詢按鈕 except Exception as e: print("=======雙擊這個按鈕========", e) time.sleep(3)
感謝你能夠認真閱讀完這篇文章,希望小編分享的“Python+Selenium定位不到元素的原因有哪些”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。