国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Web自動(dòng)化 —— Selenium元素定位與防踩坑

這篇具有很好參考價(jià)值的文章主要介紹了Web自動(dòng)化 —— Selenium元素定位與防踩坑。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1. 基本元素定位一

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
# selenium = Service("../../chromedriver.exe")
# driver = webdriver.Chrome(service=Service)
# driver.get("http://www.baidu.com")
 
# # 使用id進(jìn)行定位
# input_element = driver.find_element_by_id("kw")
# # 往輸入框輸入內(nèi)容
# input_element.send_keys("凱學(xué)長(zhǎng)")
# search_button = driver.find_element_by_id("su")
# # 點(diǎn)擊搜索按鈕
# search_button.click()
 
# 隱藏正在受到自動(dòng)化測(cè)試軟件的控制這句話
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option('excludeSwitches',
                                       ['enable-automation'])
selenium = Service("../../chromedriver.exe")
driver = webdriver.Chrome(service=Service,options=chrome_options)
driver.get("http://www.baidu.com")
 
 
# 以下是新的寫法
input_element = driver.find_element(by=By.ID,value="kw")
input_element.send_keys("凱學(xué)長(zhǎng)")
search_button = driver.find_element(by=By.ID,value="su")
# 點(diǎn)擊搜索按鈕
search_button.click()

2. 基本元素定位二

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
# selenium = Service("../../chromedriver.exe")
# driver = webdriver.Chrome(service=Service)
# driver.get("http://www.baidu.com")
 
# 使用id進(jìn)行定位
# input_element = driver.find_element_by_id("kw")
# 往輸入框輸入內(nèi)容
# input_element.send_keys("凱學(xué)長(zhǎng)")
# search_button = driver.find_element_by_id("su")
# 點(diǎn)擊搜索按鈕
# search_button.click()
 
# 隱藏正在受到自動(dòng)化測(cè)試軟件的控制這句話
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option('excludeSwitches',
                                       ['enable-automation'])
selenium = Service("../../chromedriver.exe")
driver = webdriver.Chrome(service=Service,options=chrome_options)
driver.get("http://www.baidu.com")
 
# 以下是新的寫法
# input_element = driver.find_element(by=By.ID,value="kw")
# input_element.send_keys("凱學(xué)長(zhǎng)")
# search_button = driver.find_element(by=By.ID,value="su")
# # 點(diǎn)擊搜索按鈕
# search_button.click()
 
# 把瀏覽器最大化
driver.maximize_window()
 
driver.get("https://www.jd.com")
# jd_search_input = driver.find_element(by=By.CLASS_NAME,value="text")
# jd_search_input.send_keys("電腦")
# jd_search_button = driver.find_element(by=By.CLASS_NAME,value="button")
# jd_search_button.click()
driver.find_element(by=By.LINK_TEXT,value="家用電器").click()
# driver.find_element(by=By.LINK_TEXT,value="平板電視").click()
# 當(dāng)頁面以一個(gè)新的頁面打開時(shí),將會(huì)出現(xiàn)多個(gè)句柄(就是瀏覽器的頁面)
# 這個(gè)時(shí)候我們需要做的事情是切換操作句柄
 
# 句柄切換
# 拿到所有句柄
handlers = driver.window_handles
print(driver.title)
for h in handlers:
    if h !=driver.current_window_handle:
        # 切換到這個(gè)句柄上
        driver.switch_to.window(h)
    print("當(dāng)前句柄是:" + driver.title)
 
driver.find_element(by=By.PARTIAL_LINK_TEXT,value="一體").click()

3. CSS選擇器定位法一

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
service = Service("../../chomedriver.exe")
driver = webdriver.Chrome(service=service)
 
# 把瀏覽器最大化
driver.maximize_window()
driver.get("https://www.jd.com")
driver.find_element(by=By.CSS_SELECTOR,value="#key").send_keys("鍵盤")
driver.find_element(by=By.CSS_SELECTOR,
                    value="#search > div > div.from > button").click()
 
# css學(xué)習(xí)參考手冊(cè)
# https://www.runoob.com/cssref/css-reference.html#animation

4. CSS選擇器定位法二

  1. 瀏覽器完整的打開-關(guān)閉調(diào)用流程
from selenium import webdriver  #導(dǎo)入webdriver包
 
driver=webdriver.Chrome()   #初始化一個(gè)谷歌瀏覽器實(shí)例
driver.maximize_window()    #最大化瀏覽器
driver.implicitly_wait(8)   #設(shè)置隱式時(shí)間等待
 
driver.get("https://www.baidu.com") #通過get方法打開一個(gè)url站點(diǎn)
 
driver.quit()  #關(guān)閉并退出瀏覽器

5. xpath定位法
1、相對(duì)路徑定位
//標(biāo)簽名[@屬性名="屬性值"]

2、定位某個(gè)元素的父級(jí)元素
元素xpath/parent::"父級(jí)元素標(biāo)簽名"

//*[@id="list"]/dl/a/parent::dl

3、定位一組元素的第幾個(gè)
xpath[數(shù)字] 注意:xpath是從1開始

例:定位第5個(gè)元素

//*[@id="list"]/dl/a[5]

4、定位到一組元素,但是需要從第n個(gè)開始
xpath[position()]

例:從第13個(gè)元素開始

//*[@id="list"]/dl/a[position()>12]

5、定位元素的屬性值
xpath/@屬性名

例:定位a標(biāo)簽的href屬性值

//*[@id="list"]/dl/a/@href

6、定位標(biāo)簽的文本內(nèi)容
xpath/text()

例:定位dd標(biāo)簽的文本內(nèi)容

//*[@id="list"]/dl/a/dd/text()

6. 句柄切換和頁面關(guān)閉操作
句柄,就是當(dāng)前瀏覽器每個(gè)窗口的標(biāo)識(shí)符,每個(gè)窗口的句柄具有唯一性,多用于頁面切換與關(guān)閉指定頁面;
接下來先做一個(gè)小實(shí)驗(yàn),證明一下為啥需要用到句柄:
以百度新聞為例:
Web自動(dòng)化 —— Selenium元素定位與防踩坑,自動(dòng)化測(cè)試,技術(shù)分享,軟件測(cè)試,前端,自動(dòng)化,selenium,軟件測(cè)試,測(cè)試工具

# -*- coding:utf-8 -*-
import time
from selenium import webdriver
 
browser = webdriver.Chrome()
browser.set_window_size(1920, 1080)
browser.get("http://news.baidu.com/") #打開百度新聞頁面
time.sleep(1)
handles = browser.window_handles #獲取所有窗口的句柄
print("當(dāng)前窗口的句柄",handles )  #這里輸出所有窗口的句柄,當(dāng)前只有一個(gè)窗口,所以輸出的是當(dāng)前窗口的句柄
browser.find_element_by_link_text("百度新聞客戶端").click() #在百度新聞頁面基礎(chǔ)上(新窗口)打開百度新聞客戶端頁面
handles = browser.window_handles #獲取所有窗口的句柄
print("全部窗口的句柄",handles ) #這里會(huì)輸出兩個(gè)句柄信息,以list的方式返回

?Web自動(dòng)化 —— Selenium元素定位與防踩坑,自動(dòng)化測(cè)試,技術(shù)分享,軟件測(cè)試,前端,自動(dòng)化,selenium,軟件測(cè)試,測(cè)試工具

到這里,我們?cè)趺粗喇?dāng)前標(biāo)記的是哪個(gè)窗口的句柄呢(就是讀取哪個(gè)窗口的代碼)?我們可以關(guān)閉一個(gè)窗口,如果某個(gè)窗口被關(guān)閉了,那就證明標(biāo)記的是哪個(gè)窗口的句柄,在后面增加下面這行代碼

browser.close() #關(guān)閉當(dāng)前標(biāo)識(shí)的窗口
handles = browser.window_handles #獲取所有窗口的句柄
print("全部窗口的句柄",handles )

Web自動(dòng)化 —— Selenium元素定位與防踩坑,自動(dòng)化測(cè)試,技術(shù)分享,軟件測(cè)試,前端,自動(dòng)化,selenium,軟件測(cè)試,測(cè)試工具

我們會(huì)發(fā)現(xiàn)就算打開了新的窗口,并在頁面上跳轉(zhuǎn)到新的窗口,但是關(guān)閉的窗口仍然是最初始的窗口,所以這就證明由始至終都是標(biāo)識(shí)第一個(gè)窗口的句柄,那我們就要在進(jìn)行后面一系列操作之前,先標(biāo)識(shí)到新窗口的句柄

這樣子,我們就可以在新窗口進(jìn)行一系列的操作啦,當(dāng)然,切換窗口,也可以使用重定向的方式

7. 自動(dòng)化元素定位防踩坑
踩坑一:StaleElementReferenceException

selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document

異常原因: 意思是,引用的元素已過期。原因是頁面刷新了,此時(shí)當(dāng)然找不到之前頁面的元素,就算是后退回來的頁面也是不一樣的。
Web自動(dòng)化 —— Selenium元素定位與防踩坑,自動(dòng)化測(cè)試,技術(shù)分享,軟件測(cè)試,前端,自動(dòng)化,selenium,軟件測(cè)試,測(cè)試工具

在編寫腳本時(shí)一直報(bào)這個(gè)錯(cuò),使用顯示等待都不行,在一頓百度操作后才知道是元素被刷新了

Web自動(dòng)化 —— Selenium元素定位與防踩坑,自動(dòng)化測(cè)試,技術(shù)分享,軟件測(cè)試,前端,自動(dòng)化,selenium,軟件測(cè)試,測(cè)試工具

我們發(fā)現(xiàn),僅僅是刷新了一下頁面,兩次的element id是不同的,這就說明這是兩個(gè)不同的元素,如果用之前的element,自然會(huì)報(bào)錯(cuò)

原因很明顯,你用別人的身份證id去找現(xiàn)在的人,哪怕這兩個(gè)人長(zhǎng)的很像,他也會(huì)告訴你,對(duì)不起,你找錯(cuò)人啦。

解決方法:

有時(shí)我們無法避免,不確定什么時(shí)候元素就會(huì)被刷新。頁面刷新后重新獲取元素的思路不變,這時(shí)可以使用python的異常處理語句:try…except…,異常出現(xiàn)時(shí)重新執(zhí)行,關(guān)鍵代碼如下
Web自動(dòng)化 —— Selenium元素定位與防踩坑,自動(dòng)化測(cè)試,技術(shù)分享,軟件測(cè)試,前端,自動(dòng)化,selenium,軟件測(cè)試,測(cè)試工具

如下圖:我在實(shí)際工作當(dāng)中編寫腳本時(shí)使用異常try捕獲異常后,頁面刷新后重新獲取元素,可以成功找到元素了

Web自動(dòng)化 —— Selenium元素定位與防踩坑,自動(dòng)化測(cè)試,技術(shù)分享,軟件測(cè)試,前端,自動(dòng)化,selenium,軟件測(cè)試,測(cè)試工具

踩坑二:ElementClickInterceptedException(元素點(diǎn)擊交互異常)

具體報(bào)錯(cuò):selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted is not clickable at point (1421, 283). Other element would receive the click:

E (Session info: chrome=104.0.5112.102)

意思是,元素定位相互覆蓋,元素已經(jīng)找到,但是無法點(diǎn)擊

解決方法:

方法一:使用強(qiáng)制等待,但是每次都有類似的元素?zé)o法點(diǎn)擊使用強(qiáng)制等待的話會(huì)延長(zhǎng)腳本執(zhí)行時(shí)間

time.sleep()

前言:之前便遇到過很多次該問題的報(bào)錯(cuò),就沒有管它,但是隨著越來越多的元素報(bào)該錯(cuò),每次使用強(qiáng)制等待會(huì)大大延長(zhǎng)腳本的執(zhí)行時(shí)間,于是便網(wǎng)上找各種方法解決該問題,最終發(fā)現(xiàn)是自己使用顯示等待的方法錯(cuò)了

如下是顯示等待的用法和區(qū)別

方法二:顯性等待

element_to_be_clickable--元素是否可點(diǎn)擊

vibility of element_ located--元素是否可見

presence_of_element_located--元素是否存在

如上:三種等待方法,最開始我一直使用的是presence_of_element_located,判斷元素是否存在,最終還是報(bào)錯(cuò),提示元素元素點(diǎn)擊攔截異常

element_to_be_clickable--等待元素出現(xiàn)可以點(diǎn)擊,便可以元素定位成功

需要先導(dǎo)包:

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
復(fù)制代碼
element = WebDriverWait(self.browser, 5).until(
    EC.element_to_be_clickable((By.XPATH, "http://input[@placeholder='請(qǐng)輸入會(huì)員手機(jī)號(hào)']")))
element.clcik()
復(fù)制代碼

Web自動(dòng)化 —— Selenium元素定位與防踩坑,自動(dòng)化測(cè)試,技術(shù)分享,軟件測(cè)試,前端,自動(dòng)化,selenium,軟件測(cè)試,測(cè)試工具

方法三:使用JS點(diǎn)擊

然而有時(shí)即使已經(jīng)顯式等待了,卻仍然會(huì)報(bào)錯(cuò): ElementClickInterceptedException,這多少有點(diǎn)奇怪,為什么 webdriver 有時(shí)就是無法點(diǎn)擊,我不知道,也許這和他首先執(zhí)行的一些驗(yàn)證檢查有關(guān),反正就在這一刻,它不給你點(diǎn)

代碼如下:

element = self.browser.find_element(By.XPATH, "(//span[@class='el-checkbox__inner'])[4]")
self.browser.execute_script("arguments[0].click();", element)
復(fù)制代碼

Web自動(dòng)化 —— Selenium元素定位與防踩坑,自動(dòng)化測(cè)試,技術(shù)分享,軟件測(cè)試,前端,自動(dòng)化,selenium,軟件測(cè)試,測(cè)試工具

這是通過 JavaScript 完成的點(diǎn)擊,js可以避開一些校驗(yàn)

??以上便是在編寫selenium自動(dòng)化時(shí)元素定位時(shí)踩的坑,以此分享防止踩坑

下面是配套資料,對(duì)于做【軟件測(cè)試】的朋友來說應(yīng)該是最全面最完整的備戰(zhàn)倉庫,這個(gè)倉庫也陪伴我走過了最艱難的路程,希望也能幫助到你!

Web自動(dòng)化 —— Selenium元素定位與防踩坑,自動(dòng)化測(cè)試,技術(shù)分享,軟件測(cè)試,前端,自動(dòng)化,selenium,軟件測(cè)試,測(cè)試工具

軟件測(cè)試面試小程序

被百萬人刷爆的軟件測(cè)試題庫!?。≌l用誰知道?。?!全網(wǎng)最全面試刷題小程序,手機(jī)就可以刷題,地鐵上公交上,卷起來!

涵蓋以下這些面試題板塊:

1、軟件測(cè)試基礎(chǔ)理論 ,2、web,app,接口功能測(cè)試 ,3、網(wǎng)絡(luò) ,4、數(shù)據(jù)庫?,5、linux

6、web,app,接口自動(dòng)化 ,7、性能測(cè)試?,8、編程基礎(chǔ),9、hr面試題 ,10、開放性測(cè)試題,11、安全測(cè)試,12、計(jì)算機(jī)基礎(chǔ)

?Web自動(dòng)化 —— Selenium元素定位與防踩坑,自動(dòng)化測(cè)試,技術(shù)分享,軟件測(cè)試,前端,自動(dòng)化,selenium,軟件測(cè)試,測(cè)試工具

?資料獲取方式 :

Web自動(dòng)化 —— Selenium元素定位與防踩坑,自動(dòng)化測(cè)試,技術(shù)分享,軟件測(cè)試,前端,自動(dòng)化,selenium,軟件測(cè)試,測(cè)試工具文章來源地址http://www.zghlxwxcb.cn/news/detail-703758.html

到了這里,關(guān)于Web自動(dòng)化 —— Selenium元素定位與防踩坑的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包