Playwright 元素定位

一、get_by_XXXXX


1. get_by_role:根據元素角色進行定位, 常用的參數有兩個,第一個是角色名稱 role,第二個是元素的文本 name。其他參數的解釋大家可以參考源碼注釋。

# 獲取頁面名稱為確定的按鈕
page.get_bt_role('button', name='確定')?

playwright 有大量的角色可以供我們選擇,下面是源碼內的可定位的角色名稱:

    def get_by_role(self, role,name) -> Locator:''':param role: Literal["alert", "alertdialog", "banner","button", "caption", "cell", "checkbox","combobox", "dialog", "directory","document", "form",  "group", "heading", "img",  "link", "list", "listbox","menu", "menubar", "menuitem", progressbar", "radio", "radiogroup", "region", "row",  "scrollbar","search", "searchbox", "separator", "slider", "tab", "table",  "textbox", "time", "timer", "toolbar"]:param name::return:'''return self.page.get_by_role(role,name = name)

2. get_by_text:根據界面文本信息進行定位。包含兩個參數,一個是 text標識定位的文本內容,第二個是 exact 表示是否精確匹配。

# 定位文字信息為返回首頁的元素
page.get_by_text('返回首頁', exact=True)

3.?get_by_placeholder:根據placeholder進行定位,也就是我們輸入框的提示信息。他的參數和 get_by_text相同。

# 定位提示信息為 請輸入名稱 的輸入框
page.get_by_placeholder('請輸入名稱', exact=True).click

4. get_by_title:同上
5. get_by_lable:同上
6. get_by_alt_test: 同上
這一部分建議直接查看源碼,源碼每個方法的使用寫的挺清楚的。

二、locator


1. 根據元素 id 進行定位

# 定位id=user的元素
page.locator('#user')

2. 根據元素 css 進行定位

# 定位css為 homepage的元素
page.locator('.homepage')

3. 根據元素 xpath 進行定位

# 定位相對位置為/html/body/div[1]/div[3] 的元素
page.locator('/html/body/div[1]/div[3]')

以上是基礎版的元素定位方式,當遇到頁面樣式比較復雜的頁面時,會需要一些其他的定位方式


在 playwright中是支持多層篩選的,我們可以根據一個元素的信息來定位其子元素的信息。

三、nth()

根據元素索引來選擇元素,當符合定位信息的元素有多個時,我們通常要挑選出我們需要的元素,可以使用 nth()來進行挑選我們需要的是哪一個元素。索引是從 0 開始的

# 定位文本信息為 班級 的第三個元素
page.get_by_text('班級', exact=True).nth(2)

四、first 和 last


根據名稱我們就可以知道,這是定位的第一個和最后一個元素,這兩個是作為類屬性使用的,使用時不需要加()

# 定位第一個名稱為啟動的按鈕
page.get_by_role('button', name='啟動').first

五、filter()


是用來做篩選的。它的作用主要是在元素定位后,進行二次篩選。有利于在復雜的頁面當中,過濾出需要的元素。主要用到的參數有兩個,has_text: 包含的文本信息 has_not_text: 不包含的文本信息。

# 在 div 中定位文本信息為班級的元素
page.locator('div').filter(has_text='班級')

通常還會進一步進行篩選

# 在 div 中定位文本信息為班級的字段,并定位到其提示信息為請輸入的輸入框
page.locator('div').filter(has_text='班級').get_by_placeholder('請輸入')

六、鏈式選擇器


鏈式選擇器中的兩個符號,常用的是 >>

1.? >:? 定位子元素,定位和父級元素相鄰的元素,只能定位“親兒子”

2.? >>:??定位后代元素,定位父級元素下的所有元素,只要位于父元素下,都可以定位

鏈式選擇器用來根據多個 css 樣式定位元素。當元素沒有 id 并且 css 樣式又繁多的時候,可以通過使用鏈式選擇器,來根據多個 css 樣式進行元素定位。

# 定位 van-popover__wrapper 樣式下樣式為 MPMicon 的元素
page.locator('.van-popover__wrapper >> .MPMicon')


七、正則表達式


在根據文本信息進行元素定位時,有文本的部分內容會發生變化的情況,可以通過正則表達式,來根據某些固定的內容,進行元素定位。首先需要先了解一下正則表達式的知識

# 定位名稱由1-9數字開頭和“ 個 進行中” 文字結尾的按鈕
page.get_by_role("button", name=re.compile(r"[1-9]\d* 個 進行中$"))

以下是一些常用的page.locator()元素定位方法:

1. **CSS 選擇器**: 可以使用 CSS 選擇器定位元素。例如,`page.locator('.my-class')` 會定位到頁面上所有具有 "my-class" 類的元素。

2. **XPath**: 使用 XPath 表達式來定位元素。例如,`page.locator('//div[@id="my-id"]')` 會定位到頁面上所有 id 為 "my-id" 的 div 元素。

3. **文本內容**: 使用 `:text("my text")` 來定位包含特定文本的元素。例如,`page.locator(':text("Hello, World!")')` 會定位到頁面上所有包含 "Hello, World!" 文本的元素。

4. **特性選擇器**: 使用 `[attr=value]` 來定位具有特定屬性值的元素。例如,`page.locator('input[name="username"]')` 會定位到頁面上所有 name 屬性為 "username" 的 input 元素。

5. **ID 選擇器**: 使用 `#id` 來定位具有特定 id 的元素。例如,`page.locator('#my-id')` 會定位到頁面上 id 為 "my-id" 的元素。

6. **類選擇器**: 使用 `.class` 來定位具有特定類的元素。例如,`page.locator('.my-class')` 會定位到頁面上所有具有 "my-class" 類的元素。

7. **標簽名選擇器**: 使用 `tagname` 來定位特定類型的元素。例如,`page.locator('div')` 會定位到頁面上所有的 div 元素。

這些都是 Playwright 中 `page.locator()` 方法的常用定位方式。根據需要選擇合適的方法來定位元素。
----------

在 Playwright 中,`page.locator()` 方法返回一個元素定位器(Element Locator),這個定位器可以用于定位和操作頁面上的元素。以下是一些更深入的介紹:

1. **鏈式定位**:`page.locator()` 的返回值本身也有 `locator()` 方法,這意味著可以鏈式地定位元素。例如,`page.locator('.my-class').locator('.my-subclass')` 會定位到所有具有 "my-class" 類的元素中,再次具有 "my-subclass" 類的元素。

2. **操作元素**:定位器提供了一系列方法用于操作元素,例如 `click()`、`fill()`、`check()`、`uncheck()`、`selectOption()` 等。這些方法可以直接在定位器上調用,例如 `page.locator('#my-id').click()` 會點擊 id 為 "my-id" 的元素。

3. **獲取元素屬性和狀態**:定位器還提供了一些方法用于獲取元素的屬性和狀態,例如 `getAttribute()`、`innerText()`、`isVisible()`、`isChecked()` 等。例如,`page.locator('#my-id').getAttribute('value')` 會返回 id 為 "my-id" 的元素的 value 屬性值。

4. **等待元素**:定位器提供了 `waitFor()` 方法用于等待元素出現。例如,`page.locator('#my-id').waitFor()` 會等待直到 id 為 "my-id" 的元素出現。

5. **處理多個元素**:如果定位器定位到多個元素,你可以使用 `nth()` 方法來選擇其中的一個。例如,`page.locator('.my-class').nth(1)` 會選擇第二個具有 "my-class" 類的元素(索引從 0 開始)。

6. **元素計數**:你可以使用 `count()` 方法來獲取定位器定位到的元素數量。例如,`page.locator('.my-class').count()` 會返回頁面上具有 "my-class" 類的元素的數量。

這些都是 Playwright 中 `page.locator()` 方法的高級用法。你可以根據你的需要使用這些方法來定位和操作元素。
--------

更多高級用法和技巧:

1. **元素的文本內容**:`textContent()` 方法可以用于獲取元素的文本內容。例如,`page.locator('#my-id').textContent()` 會返回 id 為 "my-id" 的元素的文本內容。

2. **元素的 HTML**:`innerHTML()` 方法可以用于獲取元素的內部 HTML。例如,`page.locator('#my-id').innerHTML()` 會返回 id 為 "my-id" 的元素的內部 HTML。

3. **元素的外部 HTML**:`outerHTML()` 方法可以用于獲取元素的外部 HTML。例如,`page.locator('#my-id').outerHTML()` 會返回 id 為 "my-id" 的元素的外部 HTML。

4. **等待元素消失**:`waitFor({ state: 'detached' })` 方法可以用于等待元素消失。例如,`page.locator('#my-id').waitFor({ state: 'detached' })` 會等待直到 id 為 "my-id" 的元素消失。

5. **等待元素隱藏**:`waitFor({ state: 'hidden' })` 方法可以用于等待元素隱藏。例如,`page.locator('#my-id').waitFor({ state: 'hidden' })` 會等待直到 id 為 "my-id" 的元素隱藏。

6. **等待元素顯示**:`waitFor({ state: 'visible' })` 方法可以用于等待元素顯示。例如,`page.locator('#my-id').waitFor({ state: 'visible' })` 會等待直到 id 為 "my-id" 的元素顯示。

7. **等待元素可編輯**:`waitFor({ state: 'editable' })` 方法可以用于等待元素可編輯。例如,`page.locator('#my-id').waitFor({ state: 'editable' })` 會等待直到 id 為 "my-id" 的元素可編輯。

8. **等待元素被選中**:`waitFor({ state: 'checked' })` 方法可以用于等待元素被選中。例如,`page.locator('#my-id').waitFor({ state: 'checked' })` 會等待直到 id 為 "my-id" 的元素被選中。

這些都是 Playwright 中 `page.locator()` 方法的一些更高級的用法和技巧。通過熟練掌握這些方法,可以更有效地定位和操作網頁上的元素。
----------------------------------------------------------------------------------------

在 Playwright 中,Locator 是自動等待和重試機制的核心部分。簡單來說,Locator 提供了在任何時刻在頁面上找到元素的方法。可以使用 page.locator() 方法創建一個 Locator。

Locator 對象的主要優點是它們可以自動等待元素出現在頁面上。例如,如果你創建了一個 Locator,然后立即嘗試點擊它,但是這個元素還沒有出現在頁面上,Playwright 會自動等待這個元素出現,然后再執行點擊操作。

此外,Locator 對象還可以重試操作。例如,如果你嘗試點擊一個 Locator,但是這個元素在被點擊的瞬間消失了,Playwright 會自動重試點擊操作,直到操作成功或超時。
以下是一些使用 Locator 對象方法的示例:

# 創建一個 Locator
locator = page.locator('#my-id')# 點擊 Locator
locator.click()# 填充 Locator
locator.fill('Hello, world!')# 獲取 Locator 的文本
text = locator.text_content()# 獲取 Locator 的 HTML
html = locator.inner_html()# 等待 Locator 出現在頁面上
locator.wait_for()# 等待 Locator 從頁面上消失
locator.wait_for('hidden')


以下是 `Locator` 對象的方法和屬性的簡單解釋:

---Methods---

- `all`: 返回所有匹配的元素。
- `all_inner_texts`: 返回所有匹配元素的內部文本。
- `all_text_contents`: 返回所有匹配元素的文本內容。
- `and_`: 創建一個新的 `Locator`,它匹配同時滿足當前 `Locator` 和另一個條件的元素。
- `blur`: 讓匹配的元素失去焦點。
- `bounding_box`: 返回匹配元素的邊界框。
- `check`: 勾選匹配的元素(如果它是一個復選框或單選框)。
- `clear`: 清除匹配元素的輸入值(如果它是一個輸入元素)。
- `click`: 點擊匹配的元素。
- `count`: 返回匹配元素的數量。
- `dblclick`: 雙擊匹配的元素。
- `dispatch_event`: 在匹配的元素上分發一個事件。
- `drag_to`: 將匹配的元素拖動到另一個位置。
- `evaluate`: 在匹配的元素上執行一個 JavaScript 函數。
- `evaluate_all`: 在所有匹配的元素上執行一個 JavaScript 函數。
- `evaluate_handle`: 獲取一個可以在匹配的元素上執行 JavaScript 的句柄。
- `fill`: 填充匹配元素的輸入值(如果它是一個輸入元素)。
- `filter`: 創建一個新的 `Locator`,它匹配滿足一個函數的元素。
- `focus`: 讓匹配的元素獲取焦點。
- `frame_locator`: 返回匹配元素的 `FrameLocator`(如果它是一個 `iframe` 元素)。
- `get_attribute`: 獲取匹配元素的屬性值。
- `get_by_alt_text`: 創建一個新的 `Locator`,它匹配 `alt` 屬性包含指定文本的元素。
- `get_by_label`: 創建一個新的 `Locator`,它匹配 `label` 屬性包含指定文本的元素。
- `get_by_placeholder`: 創建一個新的 `Locator`,它匹配 `placeholder` 屬性包含指定文本的元素。
- `get_by_role`: 創建一個新的 `Locator`,它匹配 `role` 屬性包含指定文本的元素。
- `get_by_test_id`: 創建一個新的 `Locator`,它匹配 `data-testid` 屬性包含指定文本的元素。
- `get_by_text`: 創建一個新的 `Locator`,它匹配文本包含指定文本的元素。
- `get_by_title`: 創建一個新的 `Locator`,它匹配 `title` 屬性包含指定文本的元素。
- `highlight`: 高亮匹配的元素。
- `hover`: 將鼠標懸停在匹配的元素上。
- `inner_html`: 獲取匹配元素的內部 HTML。
- `inner_text`: 獲取匹配元素的內部文本。
- `input_value`: 獲取匹配元素的輸入值(如果它是一個輸入元素)。
- `is_checked`: 檢查匹配的元素是否被勾選(如果它是一個復選框或單選框)。
- `is_disabled`: 檢查匹配的元素是否被禁用。
- `is_editable`: 檢查匹配的元素是否可編輯。
- `is_enabled`: 檢查匹配的元素是否啟用。
- `is_hidden`: 檢查匹配的元素是否隱藏。
- `is_visible`: 檢查匹配的元素是否可見。
- `locator`: 創建一個新的 `Locator`,它匹配滿足一個定位器的元素。
- `nth`: 創建一個新的 `Locator`,它匹配第 n 個元素。
- `or_`: 創建一個新的 `Locator`,它匹配滿足當前 `Locator` 或另一個條件的元素。
- `press`: 在匹配的元素上按下一個鍵(如果它是一個輸入元素)。
- `press_sequentially`: 在匹配的元素上按下一系列的鍵(如果它是一個輸入元素)。
- `screenshot`: 對匹配的元素進行截圖。
- `scroll_into_view_if_needed`: 如果需要,將匹配的元素滾動到視圖中。
- `select_option`: 選擇匹配的元素的一個選項(如果它是一個 `select` 元素)。
- `select_text`: 選擇匹配的元素的文本(如果它是一個輸入元素或 `textarea` 元素)。
- `set_checked`: 設置匹配的元素的勾選狀態(如果它是一個復選框或單選框)。
- `set_input_files`: 設置匹配的元素的輸入文件(如果它是一個文件輸入元素)。
- `tap`: 在匹配的元素上進行觸摸操作。
- `text_content`: 獲取匹配元素的文本內容。
- `uncheck`: 取消勾選匹配的元素(如果它是一個復選框或單選框)。
- `wait_for`: 等待匹配的元素滿足一個條件。

---Properties---

- `first`: 返回第一個匹配的元素。
- `last`: 返回最后一個匹配的元素。
- `page`: 返回關聯的 `Page` 對象。

這些方法和屬性使 `Locator` 對象能夠執行各種操作,包括查找元素、與元素交互、獲取元素的信息等。

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

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

相關文章

cfa三級大神復習經驗分享系列(一)

教材還是Notes? 對于愚鈍如我之流,建議大家三級一定要看教材。Note很精華很濃縮,我覺得看過教材再看note感覺總結的很精辟,但是Note是以考點列的,而教材像小說一樣娓娓道來,有邏輯有情節,如果不follow很難…

Android MIPI屏配置

參考資料:RockChip發布的DRM Display Driver Development Guide手冊,以及網上大量相關博客資料 首先要拿到《屏幕硬件規格書》和《DataSheet》,軟件配置主要依靠DataSheet提供數據支持。 查閱DataSheet里面on sequence和off sequence說明&a…

機器學習之爬山算法(Hill Climbing Algorithm)

爬山算法(Hill Climbing Algorithm)是一種簡單而常見的啟發式搜索算法,通常用于解決優化問題。它的基本思想類似于登山過程中爬升到山頂的過程,即從一個起始點開始,不斷嘗試向鄰近的點移動,直到找到一個局部最優解。 下面是爬山算法的基本工作流程: 初始化:選擇一個初…

關于同一個地址用作兩個不同頁面時,列表操作欄按鈕混淆狀態

同一個地址用作兩個不同頁面時,列表頁的操作欄中有好多個按鈕,如果用了v-if,可能會導致按鈕混淆狀態如disabled等屬性混亂 解決方法1: 將v-if換成v-show,用了v-show之后意味著所有按鈕都在只是在頁面上隱藏了 解決方…

【python深度學習】——torch.min()

【python深度學習】——torch.min 1. torch.min()1.1 計算整個張量的最小值1.2 沿特定維度計算最小值1.3 比較兩個張量 1. torch.min() torch.min()接受的參數如下: input: 輸入的張量。dim: 沿指定維度尋找最小值。如果指定了該參數,返回一個元組,其中…

基于Vue+SpirngBoot的博客管理平臺的設計與實現(論文+源碼)_kaic

摘 要 隨著當下社會的發展,互聯網已經成為時代的主流,從此進入了互聯網時代,對大部分人來說,互聯網在日常生活中的應用是越來越頻繁,大家都在互聯網當中互相交流、學習、娛樂。博客正是扮演這樣一個角色。博客已成為當…

[Nodejs]使用adm-zip和fs-extra壓縮打包后的文件

在此之前,操作目錄、壓縮文件是通過scripts來實現的,在windows機器上多有不便,需要通過linux命令行來實現cp、rm命令: "cpdist": "cp -r ./dist/* ../../qw-portal/assetAllocation/", "rmdist": …

實驗八 單區域OSPF路由協議配置

一、實驗目的 掌握 OSPF 動態路由協議的配置、診斷方法。 二、實驗步驟 1、 運行Cisco Packet Tracer軟件,在邏輯工作區放入三臺路由器、兩臺工作站PC及一臺筆記本,分別點擊各路由器,打開其配置窗口,關閉電源,分別加…

如何選擇云服務器

云服務器選擇概述 在選擇合適的云服務器時,需要綜合考慮多個方面的因素,包括但不限于云服務器的類型、配置、價格、性能、安全性、可靠性、擴展性以及服務商的品牌信譽等。以下是根據搜索結果得出的詳細分析和建議。 云服務器選擇詳解 云服務器類型選…

Python裝飾器的應用

Python 中的裝飾器是一種語法糖,可以在運行時,動態的給函數或類添加功能。裝飾器本質上是一個函數,使用 函數名就是可實現綁定給函數的第二個功能 。它的作用就是在不修改被裝飾對象源代碼和調用方式的前提下為被裝飾對象添加額外的功能。 …

策略模式代碼

import java.util.*; enum TYPE { NORMAL,CASH_DISCOUNT,CASH_RETURN}; interface Cashsuper { public double acceptCash(double money); } class CashNormal implements CashSuper{// 正常收費子類 public double accptCash(double money){ return money; …

微信小程序如何在公共組件中改變某一個頁面的屬性值

需求 公共組件A改變頁面B的屬性isShow的值。 思路 首先目前我不了解可以直接在組件中改變頁面的值的方法,所以我通過監聽的方式在B頁面監聽app.js的某一屬性值的改變從而改變B頁面的值,眾所周知app.js的某一屬性值是很容易就能更改的。 app.js globa…

Ownips+Coze海外社媒數據分析實戰指南

目錄 一、引言二、ISP代理簡介三、應用實踐——基于Ownips和coze的社媒智能分析助手3.1、Twitter趨勢數據采集3.1.1、Twitter趨勢數據接口分析3.1.2、Ownips原生住宅ISP選取與配置3.1.3、數據采集 3.2、基于Ownips和Coze的社媒智能助手3.2.1、Ownips數據采集插件集成3.2.2、創建…

解鎖未標記圖像的力量:深入探索計算機視覺中無監督卷積神經網絡

引言 近年來,計算機視覺領域取得了顯著進步,這在很大程度上得益于深度學習,尤其是卷積神經網絡(CNN)的發展。這些強大的模型在圖像分類、目標檢測和分割等任務上表現出色,主要依靠大規模標記數據集進行監督…

Flutter 中的 FadeTransition 小部件:全面指南

Flutter 中的 FadeTransition 小部件:全面指南 在 Flutter 中,動畫是一種吸引用戶注意力并提供流暢用戶體驗的強大工具。FadeTransition 是 Flutter 提供的一個動畫小部件,它允許子組件在不透明度上進行漸變,從而實現淡入和淡出效…

git基礎 -- 判斷 Git 輸入名稱是分支名還是標簽名

判斷 Git 輸入名稱是分支名還是標簽名 背景 在使用 Git 進行版本控制時,有時需要判斷一個給定的名稱是分支名還是標簽名。分支和標簽在 Git 中是兩種不同的引用類型,但它們的名稱空間是獨立的,因此同一個名稱可以同時存在于分支和標簽中。為…

Linux備份腳本

作用 Linux文件備份的作用較多,推薦以下幾種: 保護文件:備份可以幫助用戶保護文件,防止文件被意外刪除或損壞。保證系統安全和應用安全:Linux系統管理人員對系統和業務應用要有一個合理的備份恢復策略,完…

【Unity入門】認識Unity編輯器

Unity 是一個廣泛應用于游戲開發的強大引擎,從 1.0 版本開始到現在,其編輯器的基本框架一直保持穩定。其基于組件架構的設計,使得界面使用起來直觀且高效。為了更好地理解 Unity 的界面,我們可以將其比喻為搭建一個舞臺。以下是對…

【AI+chat】推薦一款基于大模型的智能對話機器人,支持微信公眾號、企業微信應用、飛書、釘釘接入

之前寫了一篇文章, coze配置 kimichat集成到微信公眾號聊天 【AIchat】手把手配置kimichat集成到微信公眾號中對話聊天 。 有同學私信我有沒有開源項目, 這里推薦一款chatgpt-on-wechat。 官方git地址:https://github.com/zhayujie/ch…

Yann LeCun 和 Elon Musk 就 AI 監管激烈交鋒

🦉 AI新聞 🚀 Yann LeCun 和 Elon Musk 就 AI 監管激烈交鋒 摘要:昨天,Yann LeCun 和Elon Musk 在社交媒體就人工智能的安全性和監管問題展開激烈辯論。LeCun 認為目前對 AI 的擔憂和監管為時過早,主張開放和共享。而…