佳木斯湛栽影视文化发展公司

主頁 > 知識(shí)庫(kù) > Python+Selenium定位不到元素常見原因及解決辦法(報(bào):NoSuchElementException)

Python+Selenium定位不到元素常見原因及解決辦法(報(bào):NoSuchElementException)

熱門標(biāo)簽:呼叫中心市場(chǎng)需求 百度AI接口 客戶服務(wù) 硅谷的囚徒呼叫中心 企業(yè)做大做強(qiáng) 語音系統(tǒng) Win7旗艦版 電話運(yùn)營(yíng)中心

在做web應(yīng)用的自動(dòng)化測(cè)試時(shí),定位元素是必不可少的,這個(gè)過程經(jīng)常會(huì)碰到定位不到元素的情況(報(bào)selenium.common.exceptions.NoSuchElementException),一般可以從以下幾個(gè)方面著手解決:

1.Frame/Iframe原因定位不到元素:

這個(gè)是最常見的原因,首先要理解下frame的實(shí)質(zhì),frame中實(shí)際上是嵌入了另一個(gè)頁面,而webdriver每次只能在一個(gè)頁面識(shí)別,因此需要先定位到相應(yīng)的frame,對(duì)那個(gè)頁面里的元素進(jìn)行定位。

解決方案:

如果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') #需先跳轉(zhuǎn)到iframe框架
username=driver.find_element_by_name('email')
username.clear()

如果iframe沒有name或id的話,則可以通過下面的方式定位:

#先定位到iframe
elementi= driver.find_element_by_class_name('APP-editor-iframe')
#再將定位對(duì)象傳給switch_to_frame()方法
driver.switch_to_frame(elementi) 

如果完成操作后,可以通過switch_to.parent_content()方法跳出當(dāng)前iframe,或者還可以通過switch_to.default_content()方法跳回最外層的頁面。

2.Xpath描述錯(cuò)誤原因:

由于Xpath層級(jí)太復(fù)雜,容易犯錯(cuò)。但是該定位方式能夠有效定位絕大部分的元素,建議掌握。

解決方案:

2.1可以使用Firefox的firePath,復(fù)制xpath路徑。該方式容易因?yàn)閷蛹?jí)改變而需要重新編寫過xpath路徑,不建議使用,初學(xué)者可以先復(fù)制路徑,然后嘗試去修改它。

2.2提高下寫xpath的水平。

可以詳看筆者另外一篇博文總結(jié):Selenuim+Python之元素定位總結(jié)及實(shí)例說明
該博文詳細(xì)總結(jié)了Xpath的使用,多組合定位一般都能實(shí)現(xiàn)定位問題。

如何檢驗(yàn)編寫的Xpath是否正確?編寫好Xpath路徑,可以直接復(fù)制到搜狐瀏覽器的firebug查看html源碼,通過Xpath搜索:如下紅色框,若無報(bào)錯(cuò),則說明編寫的Xpath路徑?jīng)]錯(cuò)。

find_element_by_xpath("http://input[@id='kw']")

3.頁面還沒有加載出來,就對(duì)頁面上的元素進(jìn)行的操作:

這種情況一般說來,可以設(shè)置等待,等待頁面顯示之后再操作,這與人手工操作的原理一樣:
3.1設(shè)置等待時(shí)間;缺點(diǎn)是需要設(shè)置較長(zhǎng)的等待時(shí)間,案例多了測(cè)試就很慢;
3.2設(shè)置等待頁面的某個(gè)元素出現(xiàn),比如一個(gè)文本、一個(gè)輸入框都可以,一旦指定的元素出現(xiàn),就可以做操作。
3.3在調(diào)試的過程中可以把頁面的html代碼打印出來,以便分析。

解決方案:
導(dǎo)入時(shí)間模塊。

import time
time.sleep(3)

4.動(dòng)態(tài)id定位不到元素:

解決方案:
如果發(fā)現(xiàn)是動(dòng)態(tài)id,直接用xpath定位或其他方式定位。

5.二次定位,如彈出框登錄

如百度登錄彈出框登錄百度賬號(hào),需先定位到百度彈出框,然后再定位到用戶名密碼登錄。

# coding=utf-8
'''
Created on 2016-7-20
@author: Jennifer
Project:登錄百度賬號(hào)
'''
from selenium import webdriver
import time

driver = webdriver.Firefox()
driver.get("http://www.baidu.com/")

time.sleep(3)

#點(diǎn)擊登錄:有些name為tj_login的元素為不可見的,點(diǎn)擊可見的那個(gè)登錄按鈕即可。
#否則會(huì)報(bào):ElementNotVisibleException
element0=driver.find_elements_by_name("tj_login")
for ele0 in element0:
  if ele0.is_displayed():
    ele0.click()

#在登錄彈出框,需先定位到登錄彈出框
#否則會(huì)報(bào):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 "測(cè)試記錄:已測(cè)試"
driver.close()

補(bǔ)充:報(bào):selenium.common.exceptions.ElementNotVisibleException

代碼:

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("請(qǐng)輸入用戶名和帳號(hào)密碼,實(shí)現(xiàn)登錄")
input("====按任意鍵繼續(xù)====")
 
# print(driver.current_url) # https://corporatebank.cib.com.cn/firm/main/mainx.do
 
frame = driver.find_element_by_id("workframe") # 切換到 iframe 標(biāo)簽中查找
driver.switch_to_frame(frame) # 切入 iframe 標(biāo)簽
 
# driver.switch_to_default_content()  # 切出 iframe 標(biāo)簽 也可以 直接 默認(rèn)的
 
driver.find_element_by_xpath('//div[@id="fast-way"]/ul/li[2]/a').click() # 點(diǎn)擊 當(dāng)日明細(xì)查詢按鈕
time.sleep(2)
try:
  driver.find_element_by_xpath('//div[@id="fast-way"]/ul/li[2]/a').click() # 點(diǎn)擊 當(dāng)日明細(xì)查詢按鈕
except Exception as e:
  print("=======雙擊這個(gè)按鈕========", e)
time.sleep(3)

到此這篇關(guān)于Python+Selenium定位不到元素常見原因及解決辦法(報(bào):NoSuchElementException)的文章就介紹到這了,更多相關(guān)Python+Selenium定位不到元素內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 基于python requests selenium爬取excel vba過程解析
  • Python + selenium + requests實(shí)現(xiàn)12306全自動(dòng)搶票及驗(yàn)證碼破解加自動(dòng)點(diǎn)擊功能
  • 如何使用selenium和requests組合實(shí)現(xiàn)登錄頁面
  • python selenium實(shí)現(xiàn)智聯(lián)招聘數(shù)據(jù)爬取
  • 使用Selenium實(shí)現(xiàn)微博爬蟲(預(yù)登錄、展開全文、翻頁)
  • python+selenium小米商城紅米K40手機(jī)自動(dòng)搶購(gòu)的示例代碼
  • python爬蟲之利用Selenium+Requests爬取拉勾網(wǎng)

標(biāo)簽:山西 山西 安康 喀什 海南 崇左 濟(jì)南 長(zhǎng)沙

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Python+Selenium定位不到元素常見原因及解決辦法(報(bào):NoSuchElementException)》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    施秉县| 麻栗坡县| 巴中市| 淅川县| 景洪市| 遂宁市| 乐都县| 怀安县| 教育| 易门县| 东阿县| 云安县| 桓台县| 丰城市| 兴和县| 堆龙德庆县| 沂南县| 卢氏县| 大姚县| 伊金霍洛旗| 越西县| 长子县| 车险| 临朐县| 博湖县| 竹北市| 隆化县| 江孜县| 兴安盟| 吉首市| 蕉岭县| 上林县| 抚州市| 上高县| 阜康市| 新晃| 广东省| 怀安县| 南华县| 朝阳县| 长沙县|