[python][selenium] Web UI自動化8種頁面元素定位方式

測試工程師必備!Selenium自動化測試全攻略 | 手寫POM框架+數據驅動,輕松搞定UI自動化!


簡單的加個前置知識:

第一:webdriver.Chrome()這句話,通過WebDriver的構造方法,拿到瀏覽器驅動的對象,然后通過這個對象,就可以調用一系列操作瀏覽器的方法。

因為原理就是通過瀏覽器驅動做橋梁實現兩端通訊的。

第二:元素定位的方法find_element,是selenium中WebDriver類的方法。

find_element:返回的是單個元素對象。

find_elements:返回的是存放有多個元素對象的一個list。


定位頁面元素的8種方式 (不能定位瀏覽器彈窗):
1、id
2、class_name
3、name
4、link_text
5、partial_link_text
6、tag_name
7、css_selector
8、XPath


我概括下:

1、2、3:元素屬性,不是所有元素都有,還有可能是動態的,通常跟7、8去組合使用比較多。
4、5:是用可點擊的鏈接的文本去定位。
6:是根據元素標簽去定位。
7、8:最常用的方式,能結合前面6種方式組合去定位,我個人覺得理解后并不復雜,并且定位準確。
用什么定位方式,需要根據實際情況去選擇,才是最合適的,

注意:大家應該都知道網頁F12的開發者工具里右鍵復制,雖然快捷,但在復雜的頁面并不好用,不準確,有時生成的值還很長看著臃腫。
???我發現右鍵復制生成的路徑,根節點都是用 id,所以 id 動態的話就只能手寫定位了。

下面我用百度搜索來做demo,直接用代碼+注釋演示說明。


1、id

元素的id屬性定位,id在當前頁面是唯一的,但不是所有元素都有,有些頁面值是動態的

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://www.baidu.com")
# 操作:輸入框輸入"日歷",點擊搜索
driver.find_element(By.ID, "kw").send_keys("日歷")
driver.find_element(By.ID, "su").click()
sleep(3)
driver.quit()

2、class_name

元素的class屬性定位,大部分都有,但也有些沒有,有些頁面值是動態的

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://www.baidu.com")
# 操作:輸入框輸入"日歷",點擊搜索,點開年份下拉列表,把年份選擇1903年
driver.find_element(By.CLASS_NAME, "s_ipt").send_keys("日歷")
# 注意這里:有不少元素有多個class,它們之間會用空格隔開,但是代碼里不能用空格,有兩種方式
# 方法一:用.代替,比如:百度的這個搜索按鈕"bg s_btn",寫成"bg.s_btn"
driver.find_element(By.CLASS_NAME, "bg.s_btn").click()
sleep(2)
# 方法二:使用最后一個class,比如:年份下拉列表的class是:sc-icon cu-icon _toggle-icon_9e3yq_71 toggle-icon_1tMxP,用最后一個
driver.find_element(By.CLASS_NAME, "toggle-icon_1tMxP").click()
# 年份class是"_selectItem_9e3yq_23 ",用網頁F12檢查有152個,要拿到想要的數據:
# 1:在網頁F12的elements窗口搜索查找到數據位于152條中的哪個位置,找到后回到代碼里用find_elements方法直接加索引獲取
# 2:用下面的方法,用elements獲取所有年份數據再用if判斷我要的年份
elms = driver.find_elements(By.CLASS_NAME, "_selectItem_9e3yq_23 ")
# 先判斷列表是否為空,因為有時候卡頓或者加載慢是可能導致獲取元素失敗的
if elms:
for e in elms:
if e.text == "1903年":
e.click()
break
# 這里做了點擊操作后一定要結束循環,不然會報異常StaleElementReferenceException。
# 通過反復嘗試和根據代碼流程看,大致就是你循環過程中操作了元素,但是還繼續循環操作就有可能因為元素發生變化找不到了,
# 因為這里是點開下拉列表然后F12源碼才會顯示出年份元素,做了點擊操作后下拉列表就會隱藏,然后元素也沒了,操作自然報錯。
# 奇怪的是正常跑沒問題,我自己把for、if、click3行打斷點debug去看,跑到click就怎樣都會出異常,手速點再快也不行。
# 有大佬懂的話,不介意可以評論區指導下在下。
sleep(3)
driver.quit()

3、name

元素的name屬性定位,也是不是所有都有,有些頁面值是動態的

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://www.baidu.com")
# 操作:輸入框輸入"日歷"
driver.find_element(By.NAME, "wd").send_keys("日歷")
sleep(3)
driver.quit()

4、link_text

根據可點擊的鏈接的文本去定位

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://www.baidu.com")
# 操作:點擊頁面上的"關于百度"和"更多"
driver.find_element(By.LINK_TEXT, "關于百度").click()
driver.find_element(By.LINK_TEXT, "更多").click()
sleep(3)
driver.quit()

5、partial_link_text

也是根據可點擊的鏈接的文本去定位,但這是文本的模糊匹配,只要包含有關鍵字就可以匹配

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://www.baidu.com")
# 操作:點擊頁面上的"關于百度"和"更多"
driver.find_element(By.PARTIAL_LINK_TEXT, "于百").click()
driver.find_element(By.PARTIAL_LINK_TEXT, "更").click()
sleep(3)
driver.quit()

6、tag_name

根據元素標簽名定位

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://www.baidu.com")
# 操作:輸入框輸入"日歷"
elem = driver.find_elements(By.TAG_NAME, "input")
for e in elem:
if e.get_attribute("name") == "wd":
e.send_keys("日歷")
sleep(3)
driver.quit()

7、css_selector

根據css選擇器定位元素

7.1 常用屬性

 
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://www.baidu.com")
# 一:先看常用的屬性格式寫法,下面操作:輸入“日歷”,點擊搜索,等待3秒,在日歷上點擊上個月,輸入"1993"
# 1、html標簽:頁面上一般都有多個相同標簽,所以需要再加上父級標簽指明是哪個標簽下的,父級標簽也有多個就再往上找父級,如此類推
driver.find_element(By.CSS_SELECTOR, "span>input").send_keys("日")
# 2、name:[屬性名],例:[name='wd']
driver.find_element(By.CSS_SELECTOR, "[name='wd']").send_keys("歷")
# 3、id:#id,例:#su
driver.find_element(By.CSS_SELECTOR, "#su").click()
sleep(3)
# 4、class:.class,例:".calendar-prev-month_mlSD9 OP_LOG_BTN"
driver.find_element(By.CSS_SELECTOR, ".calendar-prev-month_mlSD9.OP_LOG_BTN").click()
# 5、組合使用:用標簽+屬性,下面是 input標簽 + class_name + name的組合
driver.find_element(By.CSS_SELECTOR, "input.s_ipt[name='wd']").send_keys("1993")
sleep(3)
driver.quit()

7.2 模糊匹配定位

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://www.baidu.com")
# 二:模糊匹配
# 這次用a標簽和href屬性來試,打開百度貼吧,下面代碼一共會打開6個百度貼吧頁面
driver.find_element(By.CSS_SELECTOR, "a[href='http://tieba.baidu.com/']").click()
# 1、模糊匹配-包含,只給出值的中間部分,可以匹配到開頭和結尾
driver.find_element(By.CSS_SELECTOR, "a[href*='tieba.bai']").click()
# 2、模糊匹配-匹配開頭,只給出值的開頭部分內容,可以匹配到后面
driver.find_element(By.CSS_SELECTOR, "a[href^='http://tie']").click()
# 3、模糊匹配-匹配結尾,只給出值的后面結尾內容,可以匹配到前面
driver.find_element(By.CSS_SELECTOR, "a[href$='ba.baidu.com/']").click()
# 4、模糊匹配-標簽,只給出值,可以匹配到標簽
driver.find_element(By.CSS_SELECTOR, "*[href='http://tieba.baidu.com/']").click()
# 娛樂一下,超級模糊。。
driver.find_element(By.CSS_SELECTOR, "*[href*='tieba']").click()
sleep(3)
driver.quit()

7.3 通過父元素定位子元素的方法

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://www.baidu.com")
# 三、通過父元素定位子元素的方法,這里用百度首頁左上角的一堆鏈接演示
# 1、定位某標簽下的第一個子元素::first-child,例:a:first-child,下面定位點擊的是新聞
driver.find_element(By.CSS_SELECTOR, "div#s-top-left>a:first-child").click()
# 2、定位某標簽下的指定位置的子元素::nth-child(n),例:a:nth-child(5),下面定位點擊的是視頻
driver.find_element(By.CSS_SELECTOR, "div#s-top-left>a:nth-child(5)").click()
# 還是定位點擊視頻,用elements拿到所有子元素,再用索引去獲取元素,結果也是一樣
driver.find_elements(By.CSS_SELECTOR, "div#s-top-left>a")[4].click()
# 3、定位某標簽下的最后一個子元素::last-child,例:a:last-child
# 注意:last-child它是只匹配父元素下的所有元素的最后一個子元素,如果最后一個子元素不是你要的那個標簽類型,那這個方法就沒用了
# 比如:現在演示的百度這里,在<div>下,第1個<a>新聞,第2個<a>hao123,第3個<a>地圖,最后一個標簽不是<a>,是<div>;那就不能用a:last-child定位到,但是可以用div:last-child定位到
# 結論:父元素下最后一個標簽是 x 就 x:last-child。可以在百度首頁,用網頁F12在Elements窗口,把那個<div>刪除或者移到其他位置去試試
driver.find_element(By.CSS_SELECTOR, "div#s-top-left>div:last-child").click()
sleep(3)
driver.quit()

8、XPath

根據元素路徑定位,css方式看完后,看XPath應該就很好理解了,這里暫時列舉出常用的

8.1 路徑

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://www.baidu.com")
# 一:路徑
# 路徑寫法,相對路徑://
driver.find_element(By.XPATH, "//span/input").send_keys("日歷")
# 路徑寫法,絕對路徑:/
driver.find_element(By.XPATH, "/html/body/div/div/div[5]/div/div/form/span/input").send_keys("日歷")
sleep(3)
driver.quit()

8.2 屬性

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://www.baidu.com")
# 二:屬性
# 根據屬性id、name、class定位,注意:class定位,class值有多個時,值需要全部填寫
# 格式://標簽名[@屬性名='屬性值']
driver.find_element(By.XPATH, "//input[@id='kw']").send_keys("日")
driver.find_element(By.XPATH, "//input[@name='wd']").send_keys("歷")
driver.find_element(By.XPATH, "//input[@class='bg s_btn']").click()
# 多個屬性定位
driver.find_element(By.XPATH, "//input[@name='wd' and @class='s_ipt']").send_keys("日歷")
sleep(3)
driver.quit()

8.3 其他

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://www.baidu.com")
# 三:其他
# 匹配標簽內的文本
driver.find_element(By.XPATH, "//a[text()='新聞']").click()
# 模糊匹配標簽內的文本
driver.find_element(By.XPATH, "//a[contains(text(),'新')]").click()
# 指定標簽內的屬性匹配標簽,例:百度首頁點擊貼吧
driver.find_element(By.XPATH, "//*[@href='http://tieba.baidu.com/']").click()
# 使用索引定位第幾個標簽,例:百度首頁點擊貼吧
driver.find_element(By.XPATH, '//div[@id="s-top-left"]/a[4]').click()
sleep(3)
driver.quit()

測試工程師必備!Selenium自動化測試全攻略 | 手寫POM框架+數據驅動,輕松搞定UI自動化!

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/91489.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/91489.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/91489.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

絲桿支撐座在電子裝配中的關鍵作用

絲桿支撐座是電子裝配過程中不可或缺的組件&#xff0c;主要用于支撐和固定絲桿&#xff0c;確保其穩定性和精度。在高速、高精度裝配場景中&#xff0c;絲桿支撐座的作用尤為突出。穩定性與精度保障&#xff1a;絲桿支撐座采用高品質鋼材制作&#xff0c;具有高剛性和高強度&a…

微信小程序頁面間通信的實現方式

微信小程序中頁面間的通信是指不同頁面之間的數據傳遞、狀態同步或交互操作&#xff0c;常見于多頁面協作場景。根據通信方向和場景不同&#xff0c;主要有以下幾種實現方式&#xff1a;一、基于頁面跳轉的參數傳遞1. 正向傳遞&#xff08;A頁面到B頁面&#xff09;通過URL參數…

uniapp開發微信小程序(新舊版本對比:授權手機號登錄、授權頭像和昵稱)

目錄標題授權手機號新舊版本核心差異對比強制使用新版的情況代碼實現方案特殊處理邏輯企業賬號要求最佳實踐建議授權頭像和昵稱新舊版本核心差異對比強制使用新版的情況代碼實現方案最佳實踐建議注意事項授權手機號 新舊版本核心差異對比 觸發方式 舊版&#xff08;2023年前&…

Java函數式編程之【Stream終止操作】【下】【三】【收集操作collect()與分組分區】【下游收集器】

分組收集器groupingBy()&#xff1a;groupingBy()收集器用于按條件對元素象進行分組&#xff0c;并將結果存儲在Map實例中。其作用與數據庫的SQL語句的group by的用法有異曲同工之妙。 分區收集器partitioningBy()&#xff1a;partitioningBy()可以看作是分組groupingBy()的特殊…

python設計模式-工廠模式

工廠模式的核心思想&#xff1a;封裝對象創建過程、解耦對象使用與創建 。示例代碼&#xff1a;from enum import Enum# 基類&#xff1a;人類 class Person:species Homo sapiensdef __init__(self, name):self.name namedef __str__(self):return f"{self.__class__._…

Rust:anyhow::Result 與其他 Result 類型轉換

當函數返回的不是 anyhow::Result 而是其他 Result 類型時&#xff08;如 std::io::Result、serde_json::Result 或自定義 Result&#xff09;&#xff0c;可通過以下方法統一處理錯誤類型&#xff0c;確保與 anyhow 兼容或實現錯誤傳播&#xff1a;&#x1f6e0;? 一、錯誤類…

PLC-梯形圖編程

1.位運算,比較 如&#xff1a;>,<,, 2.定時器 生成脈沖TP&#xff0c;常開觸點閉合觸發&#xff0c;賦值10秒時長&#xff0c;PT配置參數&#xff0c;ET運行時已PT計時 接通延時TON&#xff0c;常開觸點閉合觸發&#xff0c;延時10秒后賦值 關斷延時TOF&#xff0c;常開觸…

LLM學習筆記5——InstructGPT

系列文章目錄 參考文獻 參考文獻 參考文獻 參考視頻 文章目錄系列文章目錄前言目前大模型不同的技術流派與框架路線&#xff1a;1. ??BERT&#xff1a;Encoder-only架構????1&#xff09; 架構特點????2&#xff09; 訓練目標??3&#xff09; ????應用場景2. …

熱能小車cad【12張】三維圖+設計說明書

摘要 無碳小車來自全國大學生工程能力訓練大賽題目&#xff0c;根據“節能減排&#xff0c;綠色出行”的環保理念&#xff0c;提出了一種基于熱力驅動的具有方向自動控制的無碳小車。 本文設計的無碳小車主要是將熱能轉化成機械能&#xff0c;用來驅動小車前進的裝置&#xff0…

云原生 DevOps 實戰之Jenkins+Gitee+Harbor+Kubernetes 構建自動化部署體系

技術背景? 在云原生生態中&#xff0c;工具鏈的選擇直接決定 CI/CD 流水線的效率與穩定性。本次方案的工具組合并非偶然&#xff0c;而是基于各組件的核心優勢與生態適配性&#xff1a;? 代碼管理層&#xff1a;Gitee 作為國內主流的代碼托管平臺&#xff0c;支持 Git 分布…

二建機電工程專業都考哪些知識點?

二建機電工程專業需要考《建設工程施工管理》《建設工程法規及相關知識》和《機電工程管理與實務》三個科目。其中《機電工程管理與實務》是專業科目&#xff0c;也是考試重點&#xff0c;主要考查機電工程技術、機電工程相關法規與標準、機電工程項目管理實務等內容。具體如下…

React + ts + react-webcam + CamSplitter 實現虛擬攝像頭解決win攝像頭獨占的問題

一、安裝 CamSplitter 這塊網上有很多教程了&#xff0c;這里不再贅述&#xff0c;就一點&#xff0c;需要分幾個虛擬攝像頭&#xff0c;就要在CamSplitter 的安裝目錄下 driver_install.cmd 執行幾次。二、React ts react-webcam 調用虛擬攝像頭import { useState, useEffec…

【深度學習①】 | Numpy數組篇

0 序言 本文為NumPy數組庫的系統學習筆記&#xff0c;將自己先前的筆記做一個總結歸納。內容涵蓋數組基礎、創建、索引、變形、運算、函數、布爾型數組及與張量的銜接等內容。通過具體示例解析核心概念與操作&#xff0c;幫助讀者掌握NumPy的使用邏輯與方法&#xff0c;為后續深…

5.實現 call

call 是 JavaScript 中非常核心的函數方法之一。它能改變函數的執行上下文&#xff08;也就是 this 的指向&#xff09;&#xff0c;在日常開發和面試中都極其常見。本文將帶你一步步實現一個 Function.prototype.call 的自定義版本&#xff0c;真正理解它的底層原理。? 一、c…

Go語言中的盲點:競態檢測和互斥鎖的錯覺

&#x1f9e0; Go語言中的盲點&#xff1a;競態檢測和互斥鎖的錯覺 使用 -race 就能發現所有并發問題&#xff1f;加了 mutex 就萬無一失&#xff1f; 這篇文章揭示了 Go 并發編程中的一個“危險盲區” —— 互斥鎖并不能總能保護你免受數據競爭的影響&#xff0c;尤其是在 -ra…

從文件到文件描述符:理解程序與文件的交互本質

一、理解文件 拋一個概念&#xff1a; 文件 內容 屬性。 1. 那么&#xff0c;空文件有大小嗎&#xff1f;答案是有的。因為空文件指的是文件內容為空&#xff0c;文件屬性也要占據大小啊。 將來對文件操作&#xff0c;無非分為兩類&#xff1a; 1.對文件內容做修改。 2.對文件…

優化算法專欄——閱讀導引

前言 提醒&#xff1a; 文章內容為方便作者自己后日復習與查閱而進行的書寫與發布&#xff0c;其中引用內容都會使用鏈接表明出處&#xff08;如有侵權問題&#xff0c;請及時聯系&#xff09;。 其中內容多為一次書寫&#xff0c;缺少檢查與訂正&#xff0c;如有問題或其他拓展…

[ The Missing Semester of Your CS Education ] 學習筆記 Vim篇

“Writing English words and writing code are very different activities. When programming, you spend more time switching files, reading, navigating, and editing code compared to writing a long stream.” —— < The Missing Semester of Your CS Education &g…

Linux 系統中定時執行指定命令 crontab 定時任務配置

crontab 定時任務配置是 Linux/Unix 系統中用于自動、周期性執行指定命令或腳本的工具&#xff0c;相當于系統的 “定時鬧鐘”。它可以讓系統在預設的時間&#xff08;如每天凌晨、每周一、每月 1 號等&#xff09;自動完成重復性工作&#xff0c;無需人工干預。自動化運維定期…

[ Leetcode ]---快樂數

題目鏈接 Leetcode快樂數 題目描述 如下圖&#xff1a; 題目解析&#xff1a; 1.雙指針法 算法核心思路 判斷快樂數的關鍵挑戰是如何檢測是否進入無限循環。這里使用了快慢指針法&#xff08;Floyd 循環檢測算法&#xff09;&#xff0c;這是一種高效檢測循環的技巧&#…