其他定位器
簡介
查看主要的定位器指南,了解最常見和推薦的定位器。
除了推薦的定位器如 page.get_by_role() 和 page.get_by_text() 外,Playwright 還支援本指南中描述的各種其他定位器。
CSS 定位器
我們建議優先考慮使用 使用者可見的定位器,例如文字或可訪問的角色,而不是使用與實作綁定的 CSS,因為當頁面變更時可能會失效。
Playwright 可以透過 CSS 選擇器定位元素。
- Sync
- Async
page.locator("css=button").click()
await page.locator("css=button").click()
Playwright 增強了標準 CSS 選擇器的兩種方式:
- CSS 選擇器穿透開放的 shadow DOM。
- Playwright 添加了自訂偽類,如
:visible
,:has-text()
,:has()
,:is()
,:nth-match()
等。
CSS: 根據文字匹配
Playwright 包含許多 CSS 偽類別來根據其文 字內容匹配元素。
-
article:has-text("Playwright")
-:has-text()
匹配包含指定文字的任何元素,可能在子元素或後代元素內部。匹配不區分大小寫,會去除空白並搜索子字串。例如,
article:has-text("Playwright")
匹配<article><div>Playwright</div></article>
。注意,
:has-text()
應與其他 CSS 指定符一起使用,否則它會匹配包含指定文字的所有元素,包括<body>
。- Sync
- Async
# 錯誤,將匹配許多元素,包括 <body>
page.locator(':has-text("Playwright")').click()
# 正確,只匹配 <article> 元素
page.locator('article:has-text("All products")').click()# 錯誤,將匹配許多元素,包括 <body>
await page.locator(':has-text("Playwright")').click()
# 正確,只匹配 <article> 元素
await page.locator('article:has-text("Playwright")').click() -
#nav-bar :text("Home")
-:text()
偽類匹配包含指定文字的最小元素。匹配不區分大小寫,會去除空白並搜索子字串。例如,這將在
#nav-bar
元素內找到包含文字 "Home" 的元素:- Sync
- Async
page.locator("#nav-bar :text('Home')").click()
await page.locator("#nav-bar :text('Home')").click()
-
#nav-bar :text-is("Home")
-:text-is()
偽類匹配具有精確文字的最小元素。精確匹配區分大小寫,會去除空白並搜索完整字串。例如,
:text-is("Log")
不匹配<button>Log in</button>
,因為<button>
包含的單個文字節點"Log in"
不等於"Log"
。然而,:text-is("Log")
匹配<button> Log <span>in</span></button>
,因為<button>
包含一個文字節點" Log "
。同樣,
:text-is("Download")
不會匹配<button>download</button>
,因為它是區分大小寫的。
-
#nav-bar :text-matches("reg?ex", "i")
-:text-matches()
偽類別匹配具有與 JavaScript-like regex 相匹配的文本內容的最小 元素。例如,
:text-matches("Log\s*in", "i")
匹配<button>Login</button>
和<button>log IN</button>
。
文字匹配總是會正規化空白。例如,它會將多個空格變成一個空格,將換行符變成空格,並忽略前後的空白。
Input 元素類型 button
和 submit
是通過它 們的 value
而不是文本內容來匹配的。例如,:text("Log in")
匹配 <input type=button value="Log in">
。
CSS: 僅匹配可見元素
Playwright 支援 CSS 選擇器中的 :visible
偽類別。例如,css=button
匹配頁面上的所有按鈕,而 css=button:visible
只匹配可見的按鈕。這對於區分非常相似但在可見性上有所不同的元素非常有用。
考慮一個有兩個按鈕的頁面,第一個不可見,第二個可見。
<button style='display: none'>Invisible</button>
<button>Visible</button>
-
這將會找到兩個按鈕並拋出嚴格性違規錯誤:
- Sync
- Async
page.locator("button").click()
await page.locator("button").click()
-
這將只會找到第二個按鈕,因為它是可見的,然後點擊它。
- Sync
- Async
page.locator("button:visible").click()
await page.locator("button:visible").click()
CSS: 包含其他元素的元素
:has()
偽類別是一個實驗性的 CSS 偽類別。如果任何作為參數傳遞的選擇器相對於給定元素的 :scope
匹配至少一個元素,它會返回一個元素。
以下程式碼片段返回具有 <div class=promo>
的 <article>
元素的文本內容。
- Sync
- Async
page.locator("article:has(div.promo)").text_content()
await page.locator("article:has(div.promo)").text_content()