二、UI自動化測試02--元素定位方法

目錄

  • 一、定位?組元素?法
  • 二、XPath 定位?法
    • 1. 路徑策略
      • 1.1 路徑值獲取?法
    • 2. 利?元素屬性策略
      • 利?元素屬性策略的注意事項
    • 3. 屬性和邏輯結合
    • 4. 層級和屬性結合策略
    • 5. XPath 延伸?法
  • 三、CSS 定位?法
    • 1. CSS 策略: id選擇器/class選擇器/元素選擇器/屬性選擇器
    • 2. 屬性選擇器使?注意事項
    • 3. 層級選擇器
    • 4. CSS 延伸?法
  • 四、元素定位?法的另?種寫法

一、定位?組元素?法

# 1. 導?模塊
from time import sleepfrom selenium import webdriver# 2. 實例化瀏覽器對象
driver = webdriver.Chrome()
# 3. 打開??
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%8CA.html')# 通過 name 屬性值定位?戶名和密碼完成操作
driver.find_element_by_name('AAA').send_keys('admin')
# driver.find_element_by_name('AAA').send_keys('123456')
elements = driver.find_elements_by_name('AAA')
print(elements)
# 注意: 元素定位?法如果帶有 s, 則執?結果返回的是列表類型數據, ??的數據是多個元素對象
print(type(elements))# 說明: 可以通過列表的下標(索引)獲取對應的?標元素對象, 再執?操作
elements[1].send_keys('123456')# 其他定位?法也可以實?定義?組元素:
# 使?標簽名?法定位電話和郵箱并完成操作
new_els = driver.find_elements_by_tag_name('input')
new_els[2].send_keys('13800001111')
new_els[3].send_keys('123@qq.com')# 4. 展示效果
sleep(3)
# 5. 退出瀏覽器
driver.quit()

二、XPath 定位?法

  • 說明:
      1. XPath 即為 XML Path 的簡稱,它是??在 XML ?檔中查找元素信息的語?。
      1. HTML 可以看做是 XML 的?種實現,所以 Selenium ?戶可以使?這種強?的語?在 Web 應?中定位元素
  • 注意: ?論使?哪?種 XPath 策略(?法), 定位?法都是同?個, 不同策略只決定?法的參數的寫法
  • ?法: find_element_by_xpath(‘XPath策略’)

1. 路徑策略

  • 說明:
  • 絕對路徑: 從最外層元素到指定元素之間所有經過元素層級的路徑
    1). 絕對路徑以/html根節點開始,使?/來分隔元素層級;
  • 如: /html/body/div/fieldset/p[1]/input
    2). 絕對路徑對??結構要求?較嚴格,不建議使?
  • 相對路徑: 匹配任意層級的元素,不限制元素的位置
    1). 相對路徑以//開始
    2). 例如: //input 或者 //*

1.1 路徑值獲取?法

在這里插入圖片描述

# 1. 導?模塊
from time import sleepfrom selenium import webdriver# 2. 實例化瀏覽器對象
driver = webdriver.Chrome()
# 3. 打開??
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%8CA.html')# 需求:打開注冊A.html??,完成以下操作
# 1).使?絕對路徑定位?戶名輸?框,并輸?:admin
driver.find_element_by_xpath('/html/body/div/fieldset/form/p[1]/input').send_keys('admin')
# 2).暫停2秒
sleep(2)
# 3).使?相對路徑定位密碼輸?框,并輸?:123
# 注意: 使?相對路徑時, 需要注意?法參數的內外引號嵌套問題
driver.find_element_by_xpath('//*[@id="passwordA"]').send_keys('123')# 4. 展示效果
sleep(3)
# 5. 退出瀏覽器
driver.quit()

2. 利?元素屬性策略

# 1. 導?模塊
from time import sleepfrom selenium import webdriver# 2. 實例化瀏覽器對象
driver = webdriver.Chrome()
# 3. 打開??
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%8CA.html')# 利?元素屬性策略: 該?法可以使??標元素的任意?個屬性和屬性值(需要保證唯?性)
# 語法1: //標簽名[@屬性名='屬性值']
# 語法2: //*[@屬性名='屬性值']# 需求:打開注冊A.html??,完成以下操作
# 1).利?元素的屬性信息精確定位?戶名輸?框,并輸?:admin
# 注意: 使? XPath 策略, 需要在瀏覽器?具中根據策略語法, 組裝策略值, 驗證后再放?代碼中使?
# driver.find_element_by_xpath('//input[@placeholder="請輸??戶名"]').send_keys('admin')
driver.find_element_by_xpath('//*[@placeholder="請輸??戶名"]').send_keys('admin')# 4. 展示效果
sleep(3)
# 5. 退出瀏覽器
driver.quit()

利?元素屬性策略的注意事項

# 1. 導?模塊
from time import sleepfrom selenium import webdriver# 2. 實例化瀏覽器對象
driver = webdriver.Chrome()
# 3. 打開??
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%8CA.html')# //*[@屬性名='屬性值']
# 說明: // 任意層級 * 任意標簽名# 注意: ?標元素的有些屬性和屬性值, 可能存在多個相同特征的元素, 需要注意唯?性.
driver.find_element_by_xpath('//*[@type="text"]').send_keys('admin')# 注意: 與 class_name ?法不同的是, 如果使?具有多個值的 class 屬性, 則需要傳?全部的屬性值!
driver.find_element_by_xpath('//*[@class="emailA dzyxA"]').send_keys('123@qq.com')# 4. 展示效果
sleep(3)
# 5. 退出瀏覽器
driver.quit()

3. 屬性和邏輯結合

  • 屬性和邏輯集合: 解決?標元素單個屬性和屬性值?法定位為?個元素的問題時使?
  • 語法: //*[@屬性1=“屬性值1” and @屬性2=“屬性值2”]
  • 注意: 多個屬性值由 and 連接, 每?個屬性都要由@開頭, 可以根據需求使?更多屬性值
# 1. 導?模塊
from time import sleepfrom selenium import webdriver# 2. 實例化瀏覽器對象
driver = webdriver.Chrome()
# 3. 打開??
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%8CA.html')# 需求:打開注冊A.html??,完成以下操作
# 1).使?屬性與邏輯結合定位策略,在test1對應的輸?框?輸?:admin
driver.find_element_by_xpath('//*[@name="user" and @class="login"]').send_keys('admin')# 4. 展示效果
sleep(3)
# 5. 退出瀏覽器
driver.quit()

4. 層級和屬性結合策略

  • 層級與屬性結合: ?標元素?法直接定位, 可以考慮先定位其?層級或祖輩層級, 再獲取?標元素
  • 語法: ?層級定位策略/?標元素定位策略
# 1. 導?模塊
from time import sleepfrom selenium import webdriver# 2. 實例化瀏覽器對象
driver = webdriver.Chrome()
# 3. 打開??
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%8CA.html')# 需求:打開注冊A.html??,完成以下操作
# 1).使?層級與屬性結合定位策略,在test1對應的輸?框?輸?:admin
driver.find_element_by_xpath('//*[@id="p1"]/input').send_keys('admin')# 4. 展示效果
sleep(3)
# 5. 退出瀏覽器
driver.quit()

5. XPath 延伸?法

# 1. 導?模塊
from time import sleepfrom selenium import webdriver# 2. 實例化瀏覽器對象
driver = webdriver.Chrome()
# 3. 打開??
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%8CA.html')# //*[contains(@屬性名,'屬性值的部分內容')] : 通過給定屬性值的任意部
分內容進?元素定位
driver.find_element_by_xpath('//*[contains(@id,"ss")]').send_keys('123456')# //*[starts-with(@屬性名,'屬性值的開頭部分內容')] : 通過給定屬性值的開頭部分內容進?元素定位
driver.find_element_by_xpath('//*[starts-with(@id,"te")]').send_keys('13800001111')# //*[text()="?本信息"] : 通過?本信息定位?標元素(要求全部?本內容)
driver.find_element_by_xpath('//*[text()="訪問 新浪 ?站"]').click()# 4. 展示效果
sleep(3)
# 5. 退出瀏覽器
driver.quit()

三、CSS 定位?法

  • 說明: 通過 CSS 的選擇器語法定位元素
  • 注意:
    1. Selenium 框架官?推薦使? CSS, 因為其定位效率遠?于 XPath
    1. CSS 選擇器策略也有很多, 但是?論哪?個策略使?的都是同?個定位?法
  • ?法: find_element_by_css_selector(‘CSS策略’)

1. CSS 策略: id選擇器/class選擇器/元素選擇器/屬性選擇器

# 1. 導?模塊
from time import sleep
from selenium import webdriver# 2. 實例化瀏覽器對象
driver = webdriver.Chrome()
# 3. 打開??
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%8CA.html')# 需求:打開注冊A.html??,完成以下操作
# 1).使?CSS定位?式中id選擇器定位?戶名輸?框,并輸?:admin
# 語法: #id屬性值
driver.find_element_by_css_selector('#userA').send_keys('admin')# 2).使?CSS定位?式中屬性選擇器定位密碼輸?框,并輸?:123456
# 語法 1: [屬性名="屬性值"]
# 語法 2: 標簽名[屬性名="屬性值"]
# driver.find_element_by_css_selector('input[placeholder="請輸?密碼"]').send_keys('123456')
driver.find_element_by_css_selector('[placeholder="請輸?密碼"]').send_keys('123456')# 3).使?CSS定位?式中class選擇器定位電話號碼輸?框,并輸?:18600000000
# 語法: .class屬性值
driver.find_element_by_css_selector('.telA').send_keys('18600000000')
sleep(2)# 4).使?CSS定位?式中元素選擇器定位注冊按鈕,并點擊
# 說明: 元素選擇器?名標簽選擇器
# 語法: 標簽名
driver.find_element_by_css_selector('button').click()# 4. 展示效果
sleep(3)
# 5. 退出瀏覽器
driver.quit()

2. 屬性選擇器使?注意事項

# 1. 導?模塊
from time import sleepfrom selenium import webdriver# 2. 實例化瀏覽器對象
driver = webdriver.Chrome()
# 3. 打開??
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%
8CA.html')# 注意: 與 class_name ?法不同的是, 如果使?具有多個值的 class 屬性, 
則需要傳?全部的屬性值!
driver.find_element_by_css_selector('[class="emailA 
dzyxA"]').send_keys('123@qq.com')# 4. 展示效果
sleep(3)
# 5. 退出瀏覽器
driver.quit()

3. 層級選擇器

# 1. 導?模塊
from time import sleepfrom selenium import webdriver# 2. 實例化瀏覽器對象
driver = webdriver.Chrome()
# 3. 打開??
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%8CA.html')# 需求:打開注冊A.html??,完成以下操作
# 1).使?CSS定位?式中的層級選擇器定位?戶名輸?框,并輸?:admin# 層級選擇器
# ??層級關系: ?層級策略>?層級策略
driver.find_element_by_css_selector('#pa>input').send_keys('admin')
# 祖輩后代層級關系: 祖輩策略 后代策略
driver.find_element_by_css_selector('form [placeholder="請輸??戶名"]').send_keys('admin')# 注意: ??層級關系中也可以使?空格連接上下層級策略# 擴展: XPath 祖輩和后代關系: 只需要使?//連接祖輩和后代元素即可
driver.find_element_by_xpath('//form//*[@id="userA"]').send_keys('admin')# 4. 展示效果
sleep(3)
# 5. 退出瀏覽器
driver.quit()

4. CSS 延伸?法

# 1. 導?模塊
from time import sleepfrom selenium import webdriver# 2. 實例化瀏覽器對象
driver = webdriver.Chrome()
# 3. 打開??
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%8CA.html')# 標簽名[屬性名^="屬性值開頭部分內容"] : 根據給出的屬性值開頭部分內容
定位元素
driver.find_element_by_css_selector('[id^="pas"]').send_keys('123')# 標簽名[屬性名$="屬性值結尾部分內容"] : 根據給出的屬性值結尾部分內容定位元素
driver.find_element_by_css_selector('[id$="rdA"]').send_keys('123')# 標簽名[屬性名*="屬性值任意部分內容"] : 根據給出的屬性值任意部分內容
定位元素
driver.find_element_by_css_selector('[id*="ss"]').send_keys('123')# 注意: 標簽名可以省略!# 4. 展示效果
sleep(3)
# 5. 退出瀏覽器
driver.quit()

四、元素定位?法的另?種寫法

# 1. 導?模塊
from time import sleepfrom selenium import webdriver
from selenium.webdriver.common.by import By# 2. 實例化瀏覽器對象
driver = webdriver.Chrome()
# 3. 打開??
driver.get('file:///Users/comesoon/Desktop/page/%E6%B3%A8%E5%86%8CA.html')# 說明: 在 Selenium 框架中, 元素定位?法的另?種寫法
driver.find_element(By.ID, 'userA').send_keys('admin')# 注意: By 和 by ?法可以同時使?!
driver.find_element_by_id('passwordA').send_keys('123456')# 注釋: 說法 1: by ?法是 By ?法的封裝; 說法 2: By ?法是 by ?法的
底層實現(原理)
# 查看原始代碼?法: 按住 Ctrl 使??標左鍵點擊 by ?法即可# 應?場景: 使? PO 設計模式封裝代碼結構時需要使? By ?法# 4. 展示效果
sleep(3)
# 5. 退出瀏覽器
driver.quit()

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

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

相關文章

HotSpot的算法細節

可達性分析算法 以一系列“GC Roots”根對象作為起始節點集,從這些節點開始,根據引用關系向下搜索,搜索過程所走過的路徑稱為“引用鏈”(Reference Chain),如果某個對象到GC Roots間沒有任何引用鏈相連&am…

Transformer數學推導——Q27 證明時序注意力(Temporal Attention)在視頻模型中的幀間依賴建模

該問題歸類到Transformer架構問題集——注意力機制——跨模態與多模態。請參考LLM數學推導——Transformer架構問題集。 在視頻理解任務中,捕捉幀與幀之間的時間依賴關系(如動作的連貫性、物體的運動軌跡)是核心挑戰。時序注意力&#xff08…

服務器和數據庫哪一個更重要

在當今數字化的時代,服務器和數據庫都是構建和運行各種應用系統的關鍵組成部分,要說哪一個更重要,其實很難簡單地給出定論。 服務器就像是一個強大的引擎,為應用程序提供了穩定的運行環境和高效的計算能力。它負責接收和處理來自…

【Android】四大組件之Service

目錄 一、什么是Service 二、啟停 Service 三、綁定 Service 四、前臺服務 五、遠程服務擴展 六、服務保活 七、服務啟動方法混用 你可以把Service想象成一個“后臺默默打工的工人”。它沒有UI界面,默默地在后臺干活,比如播放音樂、下載文件、處理…

pytest 技術總結

目錄 一 pytest的安裝: 二 pytest有三種啟動方式: 三 用例規則: 四 配置框架: 一 pytest的安裝: pip install pytest # 安裝 pip install pytest -U # 升級到最新版 二 pytest有三種啟動方式: 1…

redis 有序集合zrange和zrangebyscore的區別

起因是查詢數據,用了zrangebyscore 但是一直顯示沒數據 具體命令zrangebyscore key 0 -1 withscores, 原有印象中一直是這么用的,但是突然查不出來了, 于是搜了下問題所在。 通過分數查看 不能用0和-1表示最小和最大,只能用分數來…

Tableau 基礎表制作

目錄 1.數據連接 2. 數據可視化 3. 基礎表制作 3.1 對比分析:比大小 1. 柱狀圖 2. 條形圖 3. 熱力圖 4. 氣泡圖 5. 詞云 3.2 變化分析:看趨勢 1. 折線圖 2. 面積圖 3.3 構成分析:看占比 1. 餅圖 2. 樹地圖 3. 堆積圖 3.4 關…

反序列化漏洞1

一、PHP類與對象 1. 類 概念理解: 類是共享相同結構和行為的對象的集合,可以理解為特征的提取。例如將耳朵長、尾巴短、紅眼睛、吃胡蘿卜、蹦跳行走的動物特征抽象為"兔子"類。代碼結構: 使用class關鍵字定義類類名遵循大駝峰命名法包含成員變量(屬性)和…

為什么要對 ACI 網絡進行升級?

一、硬件演進 1. 交換機接口 前面板接口由 1/10G 升級至 10/25/100G fabric 上行鏈路 40G 升級至 100/400G 2. 交換機角色 交換機可以是 spine 或者 leaf,而不是固定角色 3. EOS APIC-SERVER-M2/L2 2024年6月30日 EOS,替換設備為 APIC-SERVER-M4/L4 二、網絡升級參考文…

DeepSeek+Cline:開啟自動化編程新紀元

目錄 一、引言:AI 編程時代的曙光二、認識 DeepSeek 和 Cline2.1 DeepSeek 是什么2.2 Cline 詳解2.3 兩者結合的魅力 三、DeepSeek Cline 安裝與配置全流程3.1 安裝 VS Code3.2 安裝 Cline 插件3.3 獲取 DeepSeek API Key3.4 配置 Cline 與 DeepSeek 連接 四、實戰演…

【展位預告】正也科技將攜營銷精細化管理解決方案出席中睿營銷論壇

在醫藥行業面臨政策深化、技術迭代、全球化競爭的多重挑戰下,第二屆中睿醫藥健康生態生長力峰會暨第三十五屆中睿醫藥營銷論壇將于廣州盛大啟幕。5月19-20日本次峰會以“聚焦政策變革、把握產業趨勢、構建生態共贏”為核心,旨在通過全產業鏈資源整合與創…

【深度學習】評估模型復雜度:GFLOPs與Params詳解

評估模型復雜度:GFLOPs與Params詳解 在深度學習模型設計與優化過程中,GFLOPs和Params是論文中兩個重要的評估指標,它們分別衡量模型的計算復雜度和參數量。本文將詳細介紹這兩個概念及其在實踐中的應用。 1. Params:模型參數量 …

Go語言->練習6例

1.go語言的接口實現 接口(interface)是一種類型,它定義了一組方法的集合。任何類型只要實現了接口中定義的所有方法,就被認為實現了該接口。 在Go語言中,使用接口的最佳實踐可以提高代碼的可讀性、可維護性和靈活性。…

Drivestduio 代碼筆記與理解

Rigid Node: 表示 car或者trucks Deformable Node : 表示一些 分布之外的 non-rigid 的運動物體, 比如遠處的行人等和Cyclist。 在 load_objects 會讀取每一個 dynamic objects 的 bounding box’的信息,具體如下: frame_instances 記錄了每…

《算法筆記》10.5小節——圖算法專題->最小生成樹 問題 E: Jungle Roads

題目描述 The Head Elder of the tropical island of Lagrishan has a problem. A burst of foreign aid money was spent on extra roads between villages some years ago. But the jungle overtakes roads relentlessly, so the large road network is too expensive to mai…

【音視頻】SDL簡介

官網:官網 文檔:文檔 SDL(Simple DirectMedia Layer)是一套開放源代碼的跨平臺多媒體開發庫,使用C語言寫成。SDL提供數種控制圖像、聲音、輸出入的函數,讓開發者只 要用相同或是相似的代碼就可以開發出跨多…

SpringBoot + SSE 實時異步流式推送

前言 在當今數字化時代,實時數據處理對于企業的決策和運營至關重要。許多業務場景需要及時響應數據庫中的數據變化,例如電商平臺實時更新庫存、金融系統實時監控交易數據等。 本文將詳細介紹如何通過Debezium捕獲數據庫變更事件,并利用Serv…

ADS1299模擬前端(AFE)代替芯片——LHE7909

在現代醫療科技的飛速發展中,精確的生物電勢測量設備變得越來越重要。領慧立芯推出的LHE7909,是一款專為心電圖(ECG)和其他生物電勢測量設計的低噪聲24位模數轉換器(ADC),為醫療設備制造商提供了…

如何實現Redis和Mysql中數據雙寫一致性

一、引言 今天我們來聊聊一個在分布式系統中非常常見但又十分棘手的問題——Redis與MySQL之間的雙寫一致性。我們在項目中多多少少都遇到過類似的困擾,緩存是用Redis,數據庫是用MySQL,但如何確保兩者之間的數據一致性呢?接下來我…

面試篇 - Transformer前饋神經網絡(FFN)使用什么激活函數?

1. FFN結構分解 原始Transformer的FFN層 FFN(x) max(0, xW? b?)W? b? # 原始論文公式 輸入:自注意力層的輸出 x(維度 d_model512) 擴展層:xW? b?(擴展為 d_ff2048) 激活函數:Re…