最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python中playwright實現(xiàn)定位和點擊的多種方法

 更新時間:2026年01月23日 09:27:45   作者:本質(zhì)后于存在  
Playwright 提供了多種元素定位和點擊方法,如按角色、文本、標(biāo)簽文本、占位符文本、測試ID、CSS選擇器和XPath,下面就來介紹一下使用方法,感興趣的可以了解一下

在 Playwright 中,實現(xiàn)定位 (Locating)點擊 (Clicking) 是最基本也是最重要的操作。你需要先準(zhǔn)確地找到頁面上的目標(biāo)元素,然后才能對其執(zhí)行點擊操作。

Playwright 提供了多種強大的定位器 (Locators) 來幫助你準(zhǔn)確地找到元素,并且它有智能的自動等待 (Auto-wait) 機制,這意味著你通常不需要手動添加等待元素出現(xiàn)的代碼。

定位 (Locating) 元素

Playwright 推薦使用其內(nèi)置的可見性定位器,它們更健壯,更接近用戶感知,并且與可訪問性最佳實踐對齊。

以下是幾種常用的定位方法:

1.按角色定位 (get_by_role)-推薦!

這是 Playwright 最推薦的定位方式。它基于元素的可訪問性角色 (ARIA Role) 來定位,模擬用戶如何感知頁面。例如,一個按鈕就是 role='button',一個鏈接是 role='link'。

  • 優(yōu)點: 最健壯,不易受頁面 HTML 結(jié)構(gòu)變化影響,與用戶感知最接近。
  • 用法: page.get_by_role("role", name="text", exact=False)
    • role:元素的 ARIA 角色(如 “button”, “link”, “textbox”, “checkbox”, “heading” 等)。
    • name:元素的可訪問名稱,通常是用戶在界面上看到的文本。
    • exact=False:如果為 True,則名稱必須精確匹配;如果為 False (默認),則允許部分匹配。

示例:

# 定位一個文本為 "登錄" 的按鈕
page.get_by_role("button", name="登錄").click()

# 定位一個文本為 "用戶協(xié)議" 的鏈接
page.get_by_role("link", name="用戶協(xié)議").click()

# 定位一個文本框,其關(guān)聯(lián)的標(biāo)簽文本為 "用戶名"
page.get_by_role("textbox", name="用戶名").fill("your_username")

# 定位一個層級為 h1 的標(biāo)題,文本包含 "Playwright"
page.get_by_role("heading", name="Playwright", level=1)

2.按文本定位 (get_by_text)

根據(jù)元素顯示的文本內(nèi)容來定位。

  • 優(yōu)點: 直觀,適用于文本是唯一標(biāo)識的情況。
  • 用法: page.get_by_text("text_content", exact=False)

示例:

# 定位文本為 "提交" 的任意元素
page.get_by_text("提交").click()

# 定位文本包含 "商品詳情" 的元素
page.get_by_text("商品詳情").click()

3.按標(biāo)簽文本定位 (get_by_label)

主要用于定位與 <label> 元素關(guān)聯(lián)的輸入框input, textarea, select 等)。

  • 優(yōu)點: 健壯,當(dāng)輸入框沒有 idname 屬性時很有用。
  • 用法: page.get_by_label("label_text", exact=False)

示例:

# 定位一個被 <label>Username:</label> 關(guān)聯(lián)的輸入框
page.get_by_label("Username:").fill("my_user")

4.按占位符文本定位 (get_by_placeholder)

通過輸入框的 placeholder 屬性值來定位。

  • 優(yōu)點: 簡單直接,適用于輸入框有明確占位符的情況。
  • 用法: page.get_by_placeholder("placeholder_text", exact=False)

示例:

# 定位 placeholder 為 "請輸入手機號" 的輸入框
page.get_by_placeholder("請輸入手機號").fill("13812345678")

5.按測試 ID 定位 (get_by_test_id)

如果你的項目在 HTML 中使用了 data-test-id 或其他自定義測試 ID 屬性,這是最可靠的定位方式。需要開發(fā)者在頁面中預(yù)置。

  • 優(yōu)點: 最穩(wěn)定,不易受 UI 或內(nèi)容變化影響。
  • 用法: page.get_by_test_id("my_test_id")

示例:

HTML: <button data-test-id="submit-button">提交</button>

# 定位 data-test-id="submit-button" 的元素
page.get_by_test_id("submit-button").click()

6.CSS 選擇器定位 (locator("CSS_SELECTOR"))-次要選擇

當(dāng)你無法使用更語義化的定位器時,可以使用傳統(tǒng)的 CSS 選擇器。

  • 優(yōu)點: 靈活,前端開發(fā)者熟悉。
  • 缺點: 依賴 HTML 結(jié)構(gòu),結(jié)構(gòu)變化容易失效。
  • 用法: page.locator("CSS_SELECTOR")

示例:

# 定位 id 為 "username" 的輸入框
page.locator("#username").fill("my_username")

# 定位 class 為 "login-btn" 的按鈕
page.locator(".login-btn").click()

# 定位父元素為 div,且 class 為 "item" 的第3個 span
page.locator("div.parent .item:nth-child(3) span")

7.XPath 定位 (locator("xpath=XPATH_EXPRESSION"))-最后選擇

XPath 是一種非常強大的定位語言,但通常比 CSS 選擇器更復(fù)雜,且可讀性較差。在其他定位器都無法滿足需求時使用。

  • 優(yōu)點: 極其靈活,可以定位任何元素。
  • 缺點: 語法復(fù)雜,可讀性差,同樣依賴 HTML 結(jié)構(gòu)。
  • 用法: page.locator("xpath=XPATH_EXPRESSION")

示例:

# 定位文本為 "登錄" 的按鈕 (與 get_by_role("button", name="登錄") 類似)
page.locator("xpath=//button[text()='登錄']").click()

# 定位所有 div 元素中的第一個
page.locator("xpath=//div[1]")

點擊 (Clicking) 元素

一旦你使用上述方法定位到了一個元素,你就可以直接對其調(diào)用 .click() 方法。

Playwright 的 .click() 方法是智能的,它會自動等待

  • 元素出現(xiàn)在 DOM 中。
  • 元素變得可見(不是隱藏的)。
  • 元素變得可用(未禁用)。
  • 元素在點擊位置沒有被其他元素遮擋。
  • 元素變得穩(wěn)定(不再移動)。

只有當(dāng)所有這些條件都滿足時,Playwright 才會嘗試點擊。

基本用法:

# 定位并點擊一個按鈕
page.get_by_role("button", name="提交").click()

# 定位一個 CSS 選擇器,并點擊它
page.locator(".my-custom-button").click()

示例:定位并點擊一個登錄按鈕

假設(shè)你有一個登錄頁面,上面有一個用戶名輸入框、密碼輸入框和一個“登錄”按鈕。

from playwright.sync_api import Playwright, sync_playwright, expect

def login_example(playwright: Playwright):
    browser = playwright.chromium.launch(headless=False)
    page = browser.new_page()

    # 導(dǎo)航到示例登錄頁 (請?zhí)鎿Q為實際的登錄頁URL)
    page.goto("https://example.com/login")

    # 1. 定位并填充用戶名輸入框
    # 假設(shè)輸入框的 placeholder 是 "請輸入用戶名"
    # 或者其關(guān)聯(lián)的 label 文本是 "用戶名"
    page.get_by_placeholder("請輸入用戶名").fill("myusername")
    # 或者如果有一個 label:
    # page.get_by_label("用戶名").fill("myusername")

    # 2. 定位并填充密碼輸入框
    # 假設(shè)輸入框的 placeholder 是 "請輸入密碼"
    page.get_by_placeholder("請輸入密碼").fill("mypassword")
    # 或者如果有一個 label:
    # page.get_by_label("密碼").fill("mypassword")

    # 3. 定位并點擊登錄按鈕
    # 假設(shè)登錄按鈕的文本是 "登錄" 并且它是一個 button 角色
    page.get_by_role("button", name="登錄").click()

    # (可選) 驗證登錄是否成功,例如等待頁面跳轉(zhuǎn)或特定元素出現(xiàn)
    expect(page).to_have_url("https://example.com/dashboard")
    print("登錄成功并跳轉(zhuǎn)到 Dashboard 頁面")

    browser.close()

with sync_playwright() as playwright:
    login_example(playwright)

調(diào)試輔助:Playwright Inspector

在不確定如何定位元素時,Playwright Inspector 是你最好的朋友。

  1. 運行你的腳本,并加上 PWDEBUG=1
    PWDEBUG=1 python your_script.py
    
  2. 你的腳本會在每一步操作前暫停,并彈出一個 Inspector 窗口。
  3. 在 Inspector 窗口中,你可以點擊頁面上的元素,它會自動生成多種定位器供你選擇,包括推薦的 get_by_role、get_by_text 等。這能極大地幫助你編寫正確的定位代碼。

通過這些方法,你將能夠高效地在 Playwright 中定位和點擊頁面上的任意元素!

在 Playwright 中,role(角色)是 Web 可訪問性(Accessibility) 中一個非常重要的概念,也是 Playwright 推薦的首選定位策略之一。它指的是 HTML 元素所扮演的語義角色,用來描述該元素在用戶界面中的用途和行為。

什么是 Web 可訪問性中的role?

想象一下,你正在瀏覽一個網(wǎng)頁。作為有視力的用戶,你可以看到一個按鈕,上面寫著“提交”,或者一個鏈接,上面寫著“了解更多”。但是,對于使用屏幕閱讀器(Screen Reader)的視障用戶來說,他們無法“看”到這些視覺元素。屏幕閱讀器需要依靠網(wǎng)頁的語義信息來告訴用戶:“這里有一個按鈕,它的文本是‘提交’”,或者“這里有一個鏈接,它的文本是‘了解更多’”。

這個“按鈕”、“鏈接”就是元素的角色。

在 HTML 中,一些元素天生就帶有明確的角色(隱式角色):

  • <button> 元素:其角色就是 button。
  • <a> 元素:其角色通常是 link。
  • <input type="text">:其角色是 textbox
  • <h1><h6>:其角色是 heading。

對于沒有內(nèi)置語義的通用元素(如 <div><span>),開發(fā)者可以使用 ARIA (Accessible Rich Internet Applications) 屬性來明確地賦予它們角色,例如 <div role="button">。

Playwright 中的get_by_role()定位器

Playwright 利用了這種可訪問性信息,提供了 page.get_by_role() 這個強大的定位器。

為什么get_by_role()是首選?

  1. 健壯性 (Robustness):

    • 不依賴 HTML 結(jié)構(gòu): 與 CSS 選擇器或 XPath 不同,get_by_role() 不依賴于 DOM 元素的 idclass 或具體的嵌套結(jié)構(gòu)。即使頁面的 CSS 或 HTML 布局發(fā)生變化,只要元素的語義角色和可訪問名稱不變,定位器依然有效。
    • 模擬真實用戶: 它是最接近真實用戶與網(wǎng)站交互的方式。用戶不會關(guān)心按鈕的 class 是什么,他們關(guān)心的是“這是一個按鈕,上面寫著什么”。
  2. 可維護性 (Maintainability):

    • 代碼更易讀,更直觀。page.get_by_role("button", name="提交")page.locator(".submit-btn.large") 更清晰地表達了你想要點擊的是什么。
    • 減少了因前端重構(gòu)而導(dǎo)致的測試中斷(flaky tests)。
  3. 可訪問性 (Accessibility):

    • 鼓勵編寫更具可訪問性的 Web 應(yīng)用。當(dāng)你的測試使用 get_by_role() 時,實際上是在驗證應(yīng)用程序?qū)ζ聊婚喿x器用戶是否友好。如果 get_by_role() 找不到元素,很可能意味著該元素對于輔助技術(shù)來說不夠清晰。

get_by_role()的用法

page.get_by_role(role, name, ...) 主要需要兩個參數(shù):

  • role (角色名): 元素的 ARIA 角色。常見的角色有:

    • "button": 按鈕
    • "link": 鏈接
    • "textbox": 文本輸入框(包括 input type="text", textarea 等)
    • "checkbox": 復(fù)選框
    • "radio": 單選按鈕
    • "heading": 標(biāo)題(如 <h1>, <h2> 等)
    • "combobox": 下拉選擇框(帶有文本輸入功能的)
    • "listbox": 列表選擇框(如 <select size="multiple">
    • "option": 列表或下拉框中的選項
    • "tab": 選項卡
    • "dialog": 對話框/模態(tài)框
    • …等等,完整的列表請參考 ARIA 規(guī)范或 Playwright 文檔。
  • name (可訪問名稱): 這是用戶在視覺上或通過屏幕閱讀器聽到的元素文本。

    • 對于按鈕和鏈接,通常是它們內(nèi)部的文本。
    • 對于輸入框,通常是與之關(guān)聯(lián)的 <label> 元素的文本或 aria-label 屬性的值。
    • name 參數(shù)可以使用字符串,也可以使用正則表達式 (re.compile) 進行部分匹配或更復(fù)雜的匹配。

示例:

# 定位一個文本是 "提交" 的按鈕
page.get_by_role("button", name="提交").click()

# 定位一個文本為 "隱私政策" 的鏈接
page.get_by_role("link", name="隱私政策").click()

# 定位一個標(biāo)題為 "歡迎來到我的網(wǎng)站" 的 h1 標(biāo)簽
page.get_by_role("heading", name="歡迎來到我的網(wǎng)站", level=1).click()

# 定位一個與標(biāo)簽 "用戶名" 關(guān)聯(lián)的文本輸入框,并填充
page.get_by_role("textbox", name="用戶名").fill("your_username")

# 定位一個包含 "Playwright" 字樣的按鈕 (使用正則表達式進行部分匹配)
import re
page.get_by_role("button", name=re.compile("Playwright")).click()

何時使用get_by_role()?

始終嘗試優(yōu)先使用 get_by_role()。

只有當(dāng)以下情況發(fā)生時,才考慮使用其他定位器(如 get_by_text, get_by_label, get_by_test_id 或最后的 CSS/XPath):

  • 元素沒有明確的可訪問性角色或名稱。
  • 頁面上的多個元素具有相同的角色和名稱,導(dǎo)致 get_by_role() 定位不唯一。
  • 你需要根據(jù)元素的特定視覺屬性或復(fù)雜層級關(guān)系進行定位(這通常是糟糕的測試實踐,但有時無法避免)。

到此這篇關(guān)于python中playwright實現(xiàn)定位和點擊的多種方法的文章就介紹到這了,更多相關(guān)playwright 定位和點擊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python腳本實現(xiàn)驗證碼識別

    python腳本實現(xiàn)驗證碼識別

    這篇文章主要為大家詳細介紹了python腳本實現(xiàn)驗證碼識別的實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • pytorch torch運算操作示例詳解

    pytorch torch運算操作示例詳解

    這篇文章主要介紹了pytorch torch運算的相關(guān)知識,本文通過示例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • Python對圖片和js前端進行加密解密的技術(shù)實現(xiàn)

    Python對圖片和js前端進行加密解密的技術(shù)實現(xiàn)

    Python可以對圖片進行加密,前端JS進行解密,但需滿足算法兼容性、密鑰安全傳遞、數(shù)據(jù)格式處理三大核心條件,這篇文章從技術(shù)實現(xiàn)、安全性、典型方案三方面詳細說明,需要的朋友可以參考下
    2025-09-09
  • Python處理JSON的完全指南:從基礎(chǔ)到實戰(zhàn),掌握數(shù)據(jù)交換核心技能

    Python處理JSON的完全指南:從基礎(chǔ)到實戰(zhàn),掌握數(shù)據(jù)交換核心技能

    本文將從?JSON?與?Python?的類型映射講起,帶你理解序列化與反序列化的底層邏輯,然后通過實戰(zhàn)案例演示如何解析?API?數(shù)據(jù)、處理自定義對象,最后總結(jié)出?3?個避坑技巧
    2026-06-06
  • Django中ORM外鍵和表的關(guān)系詳解

    Django中ORM外鍵和表的關(guān)系詳解

    這篇文章主要介紹了Django中ORM外鍵和表的關(guān)系詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • Django2.1集成xadmin管理后臺所遇到的錯誤集錦(填坑)

    Django2.1集成xadmin管理后臺所遇到的錯誤集錦(填坑)

    這篇文章主要介紹了Django2.1集成xadmin管理后臺所遇到的錯誤集錦(填坑),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • Python基于FastAPI和WebSocket實現(xiàn)實時聊天應(yīng)用

    Python基于FastAPI和WebSocket實現(xiàn)實時聊天應(yīng)用

    這篇文章主要為大家詳細介紹了Python如何基于FastAPI和WebSocket實現(xiàn)實時聊天應(yīng)用,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-04-04
  • 利用python代碼管理Word文檔屬性信息

    利用python代碼管理Word文檔屬性信息

    在Word文檔管理中,文檔屬性包含與文檔有關(guān)的關(guān)鍵信息,如標(biāo)題、作者、創(chuàng)建日期等,是進行文檔管理的重要工具,本文將展示如何利用Python代碼來靈活操控Word文檔的屬性信息,從而滿足個性化與批量化文檔處理的需求,需要的朋友可以參考下
    2024-05-05
  • Python截取字符串的簡單方法實例

    Python截取字符串的簡單方法實例

    字符串切片也就是截取字符串,取子串,下面這篇文章主要給大家介紹了關(guān)于Python截取字符串的簡單方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • 簡單談?wù)凱ython中的json與pickle

    簡單談?wù)凱ython中的json與pickle

    下面小編就為大家?guī)硪黄唵握務(wù)凱ython中的json與pickle。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07

最新評論

荃湾区| 彭山县| 延安市| 浑源县| 四川省| 伊吾县| 孝感市| 乐至县| 武隆县| 牙克石市| 克东县| 九龙城区| 太湖县| 利津县| 潮州市| 嘉善县| 建始县| 怀仁县| 盐亭县| 安吉县| 安多县| 仁寿县| 清水河县| 和平区| 凌海市| 大足县| 二连浩特市| 仪征市| 若尔盖县| 桦川县| 靖安县| 临潭县| 德化县| 东阿县| 社会| 阿巴嘎旗| 丹江口市| 普兰店市| 湖州市| 富阳市| 个旧市|