微軟出品自動化神器【Playwright+Java】系列(十)元素定位詳解

来源:https://www.cnblogs.com/longronglang/archive/2023/03/02/17173611.html
-Advertisement-
Play Games

一、寫在前面 又有很久沒更文了,真的是被催婚搞的整個人情緒特別不好,如果硬要形容的話,那就是沒法跟人正常溝通,一點就著,做什麼都沒耐心,看什麼都煩,簡直沒救了... 也是偶然發現的,自己居然沒寫關於Playwright的元素定位,這不是自動化測試的重中之重,怎麼可以忘,馬上安排! 二、元素定位 主要 ...


一、寫在前面

又有很久沒更文了,真的是被催婚搞的整個人情緒特別不好,如果硬要形容的話,那就是沒法跟人正常溝通,一點就著,做什麼都沒耐心,看什麼都煩,簡直沒救了...

也是偶然發現的,自己居然沒寫關於Playwright的元素定位,這不是自動化測試的重中之重,怎麼可以忘,馬上安排!

二、元素定位

主要支持定位方式有:css、xpath、text

示例代碼如下:

//選擇單個元素
page.querySelector("selector");
//選擇多個元素
page.querySelectorAll("selector");
//選擇單個元素,並且自動等待到元素可見、可操作
page.waitForSelector("selector");

三、CSS定位

1、css+定位值

可以理解為指定為:css方式定位+使用的定位方式(css選擇器語法)

示例代碼如下:

page.locator("css=[type='text']")

2、通過其文本內容匹配元素

元素標簽+:has-text()

:has-text()匹配任何包含指定文本的元素,在內部的某個地方,可能在子元素或後代元素中。匹配不區分大小寫,理解為模糊匹配,應註意與其他CSS說明符一起使用,否則將匹配所有包含指定文本的元素,包括<body>

示例代碼如下:

List<ElementHandle> elements = page.querySelectorAll("button:has-text("Button")");
System.out.println(elements.size());// 5
```html
#### 3、在指定元素中查找匹配文本的元素
`:text()`匹配包含指定文本的最小元素。匹配不區分大小寫,還是模糊匹配,就是指定範圍了。

**示例代碼如下:**
```java
page.querySelector("article .ant-row :text("Open Modal")").click();

4、文本通過正則表達式匹配

匹配文本內容與類似JavaScript的正則表達式匹配的最小元素。

示例代碼如下:

page.querySelector("article .ant-row :text-matches("Open M\o*dal", "i")")

5、僅匹配可見元素

示例dom:

<button style='display: none'>Invisible</button>
<button>Visible</button>

示例代碼如下:

page.locator("button:visible").click();

註意:
文本匹配會規範化空格。例如,它將多個空格變成一個,將換行符變成空格,並忽略前後空格。

6、在給定範圍內元素,匹配元素

給定元素的範圍的參數傳遞的任何選擇器至少匹配一個元素,它將返回一個元素,也是模糊匹配!
示例代碼如下:

page.navigate("http://localhost:8080/wait.html");
page.querySelector("#wait").click();
String content = page.waitForSelector("div:has(p)").textContent();
System.out.println(content);

7、匹配條件之一的元素

以逗號分隔,從CSS選擇器列表將匹配該列表中的選擇器之一可以選擇的所有元素,簡單說就是從這麼多列表中找到一個匹配的選擇器去選擇元素。
示例代碼如下:

page.navigate("https://antdv.com/components/modal-cn");
page.waitForSelector("#components-modal-demo-basic .code-box-demo span").click();
page.locator("button:has-text("取 消"), button:has-text("確定")").click();

8、基於佈局匹配定位元素

基於頁面佈局定位,上下左右之類的,會有當頁面佈局改變時,會出現找不到元素或者匹配其他元素的情況。

示例代碼如下:

//在promo-card附近的元素
page.locator("button:near(.promo-card)").click();
//獲取(promo-card2)元素右側元素文本
String textContent3 = page.waitForSelector("button:right-of(#card2)").textContent();
System.out.println("textContent3: "+textContent3);
//獲取(promo-card2)元素左側元素文本
String textContent1 = page.waitForSelector("button:left-of(#card2)").textContent();
System.out.println("textContent1: "+textContent1);
//獲取(promo-card2)元素上面元素屬性
String above = page.waitForSelector("button:above(#card2)").getAttribute("id");
System.out.println("above: "+above);
//獲取(promo-card2)元素下麵元素屬性
String below = page.waitForSelector("button:below(#card2)").getAttribute("id");
System.out.println("below: "+below);

9、從查詢結果中選擇第n個元素匹配

與: nth-child()不同,元素不必是兄弟姐妹,它們可以在頁面上的任何位置元素。

示例代碼如下:

page.waitForSelector(":nth-match(:text('promo-card'), 2)").click();

10、第N個元素定位器

選擇索引的的方式定位。

示例代碼如下:

//獲取第一個元素的文本
String first = page.locator("button").locator("nth=0").textContent();
//獲取最後一個元素的文本
String last = page.locator("button").locator("nth=-1").textContent();
System.out.println(first+"\n"+last);

11、僅定位可見元素

一個頁面有兩個按鈕,第一個不可見,第二個可見,示例:

<button style='display: none'>Invisible</button>
<button>Visible</button>

示例代碼如下:

page.locator("button").locator("visible=true").click();

三、XPath定位

任何以//或…開頭的選擇器被假定為xpath選擇器。例如,Playwright將'//html/body'轉換為'xpath=//html/body'。

1、XPath混合使用

特性就是管道符|的使用,在XPath中可指定多個選擇器。它將匹配該列表中的選擇器之一可以選擇的所有元素。

示例代碼如下:

page.navigate("https://antdv.com/components/modal-cn");
page.querySelector("#components-modal-demo-basic .code-box-demo span").click();
page.locator("//div[@id='vcDialogTitle0']|//div[@role='documentcontent']").waitFor();
System.out.println();

2、常見XPath定位使用

完全支持XPath定位和CSS語法,這裡沒法可說的,個人感覺是完美相容SeleniumCSS 、XPath定位定位方式的,參考學習CSS定位入門XPATH定位入門這兩篇。

四、使用文本定位

使用文本定位:以引號 "" 或者 ' 開頭的,可以判定為文本定為文本定位。

1、包含

示例代碼如下:

//包含
String content = page.textContent("button:text('card0')");

2、嚴格匹配

示例代碼如下:

//嚴格匹配
String content1 = page.textContent("button:text-is('card0')");

3、正則表達式匹配

示例代碼如下:

//正則
String content2 = page.textContent("button:text-matches("ca\r*d0")");

五、使用屬性選擇器定位

不是CSS選擇器,因此不支持任何特定於CSS的選項。

示例代碼如下:

page.fill("id=user","username1");
page.type("data-testid=testid","username2");

六、使用鏈式選擇器定位

選擇器被鏈接時,下一個選擇器相對於前一個選擇器的結果被查詢,個人感覺就是按照層級去定位元素。

示例代碼如下:

page.navigate("https://2x.antdv.com/components/modal-cn");
page.click("#components-modal-demo-basic .code-box-demo span");
page.click("div[role="dialog"] >> div[role="document"] >> text="取 消"");
System.out.println();

七、寫在最後

Playwright系列的第九篇文中說,一個不留神就更新API了,請大家原諒我哈!

不但英文不好,而且眼神也不好,尷尬,這是第一次,也是最後一次!

我會在後面的文章中陸續把落下的補上,隨著這幾天的熟悉使用,有時幫我覺得它比selenium更出色,不知道是不是我的幻覺?

優秀不夠,你是否無可替代

軟體測試交流QQ群:721256703,期待你的加入!!

歡迎關註我的微信公眾號:軟體測試君



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • <!DOCTYPE html> <html> <head> <title>Get Video Frame Example</title> </head> <body> <div id="result"></div> <script> // 獲取視頻第一幀的函數 function getVideoFi ...
  • 今天早上打開電腦,更新了日常工作的github倉庫,然後就是習慣性地執行了"npm install",發現報了下麵這個錯誤: Error: error:0308010C:digital envelope routines::unsupported 順便看了一下錯誤堆棧,發現是一個Node的內核文件拋 ...
  • 在許久之前,曾經寫過這樣一篇文章 -- 不定寬溢出文本適配滾動。我們實現了這樣一種效果: 文本內容不超過容器寬度,正常展示 文本內容超過容器的情況,內容可以進行跑馬燈來回滾動展示 像是這樣: 但是,之前的方案,有一個很明顯的缺點,如果我們事先知道了容器的寬度,那麼沒問題,但是如果沒法確定容器的寬度, ...
  • 客戶端和伺服器 客戶端與伺服器的通信 互聯網:錯綜複雜的網路,比如每個快遞車走的路. TCP/IP:定義數據如何傳輸的通信協議,比如快遞的包裝,發貨規則. DNS:功能變數名稱系統伺服器,輸入一個網址時,找到網頁的伺服器,才能發送 HTTP 請求到正確的地方。(功能變數名稱->IP),比如發貨地址. HTTP:超文 ...
  • 一起來看看大道至簡的一些基本設計思想,首先我們來看一下什麼是封裝。 封裝:也叫做信息隱藏,或者數據訪問保護。放到程式上來講,就是隱藏類的屬性,還有實現細節,僅對外公開一些介面。那麼外部,就只能通過這個類暴露的這些訪問介面,按照這個類提供的方式來訪問類的內部信息或者數據。這樣子的一種情況就叫做封裝。 ...
  • 這篇文章主要討論分散式系統中的故障恢復和常用的故障檢測方法,包括固定心跳檢測和根據歷史心跳信息預測故障檢測方法。 ...
  • 1. 概覽 1.1. 即時編譯器是Java虛擬機的核心 1.1.1. just-in-time compiler,簡稱JIT compiler 1.1.2. 即時編譯器會頻繁地使用寄存器 1.2. 編譯型語言 1.2.1. 程式是以二進位(編譯後的)代碼的形式發佈的 1.2.1.1. 彙編代碼是針對 ...
  • 最近演唱會還挺多的,都是大家喜歡的那些知名歌手,所以特地出一手教程給大家助力(主要是 表弟想追女神,所以教他自己搶票) 知識點 selenium 淘寶滑塊處理 搶購邏輯實現 必備環境 python 3.8 pycharm 專業版 谷歌瀏覽器+谷歌驅動+selenium3.141.0 stealth. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...