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選擇器定位法二
- 瀏覽器完整的打開-關(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),證明一下為啥需要用到句柄:
以百度新聞為例:
# -*- 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的方式返回
?
到這里,我們?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 )
我們會(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)然找不到之前頁面的元素,就算是后退回來的頁面也是不一樣的。
在編寫腳本時(shí)一直報(bào)這個(gè)錯(cuò),使用顯示等待都不行,在一頓百度操作后才知道是元素被刷新了
我們發(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)鍵代碼如下
如下圖:我在實(shí)際工作當(dāng)中編寫腳本時(shí)使用異常try捕獲異常后,頁面刷新后重新獲取元素,可以成功找到元素了
踩坑二: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ù)制代碼
方法三:使用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ù)制代碼
這是通過 JavaScript 完成的點(diǎn)擊,js可以避開一些校驗(yàn)
??以上便是在編寫selenium自動(dòng)化時(shí)元素定位時(shí)踩的坑,以此分享防止踩坑
下面是配套資料,對(duì)于做【軟件測(cè)試】的朋友來說應(yīng)該是最全面最完整的備戰(zhàn)倉庫,這個(gè)倉庫也陪伴我走過了最艱難的路程,希望也能幫助到你!
軟件測(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ǔ)
?
?資料獲取方式 :文章來源:http://www.zghlxwxcb.cn/news/detail-703758.html
文章來源地址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)!