定位器
簡介
Locator 是 Playwright 自動等待和重試功能的核心部分。簡而言之,locators 代表了一種在任何時刻在頁面上找到元素的方法。
快速指南
這些是推薦的內建定位器。
- Page.GetByRole() 根據顯式和隱式的可及性屬性進行定位。
- Page.GetByText() 根據文本內容進行定位。
- Page.GetByLabel() 根據關聯標籤的文本定位表單控制項。
- Page.GetByPlaceholder() 根據佔位符定位輸入框。
- Page.GetByAltText() 根據文本替代項定位元素,通常是圖像。
- Page.GetByTitle() 根據標題屬性定位元素。
- Page.GetByTestId() 根據其
data-testid
屬性定位元素(其他屬性可以配置)。
await page.GetByLabel("User Name").FillAsync("John");
await page.GetByLabel("Password").FillAsync("secret-password");
await page.GetByRole(AriaRole.Button, new() { Name = "Sign in" }).ClickAsync();
await Expect(Page.GetByText("Welcome, John!")).ToBeVisibleAsync();
定位元素
Playwright 內建多個定位器。為了使測試具有彈性,我們建議優先考慮面向使用者的屬性和明確的合約,例如 Page.GetByRole。
例如,考慮以下的 DOM 結構。
<button>Sign in</button>
找到角色為 button
且名稱為 "Sign in" 的元素。
await page.GetByRole(AriaRole.Button, new() { Name = "Sign in" }).ClickAsync();
使用 程式碼產生器 來生成定位器,然後根據需要進行編輯。
每次使用定位器執行動作時,會在頁面中定位最新的 DOM 元素。在下面的程式碼片段中,基礎的 DOM 元素將被定位兩次,每次動作前各一次。這意味著如果在呼叫之間由於重新渲染而導致 DOM 發生變化,將使用與定位器對應的新元素。
var locator = page.GetByRole(AriaRole.Button, new() { Name = "Sign in" });
await locator.HoverAsync();
await locator.ClickAsync();
請注意,所有建立定位器的方法,例如 Page.GetByLabel(),也可在 Locator 和 FrameLocator 類別上使用,因此您可以鏈接它們並逐步縮小定位器的範圍。
var locator = page
.FrameLocator("#my-frame")
.GetByRole(AriaRole.Button, new() { Name = "Sign in" });
await locator.ClickAsync();
根據角色定位
Page.GetByRole() 定位器反映了使用者和輔助技術如何感知頁面,例如某個元素是按鈕還是複選框。當按角色定位時,通常應該同時傳遞可訪問名稱,以便定位器精確定位到具體元素。
例如,考慮以下的 DOM 結構。
註冊
<h3>Sign up</h3>
<label>
<input type="checkbox" /> Subscribe
</label>
<br/>
<button>Submit</button>
您可以通過其隱含角色定位每個元素:
await Expect(Page
.GetByRole(AriaRole.Heading, new() { Name = "Sign up" }))
.ToBeVisibleAsync();
await page
.GetByRole(AriaRole.Checkbox, new() { Name = "Subscribe" })
.CheckAsync();
await page
.GetByRole(AriaRole.Button, new() {
NameRegex = new Regex("submit", RegexOptions.IgnoreCase)
})
.ClickAsync();
角色定位器包括按鈕、複選框、標題、連結、清單、表格等,並遵循 W3C 的 ARIA 角色、ARIA 屬性和可訪問名稱規範。請注意,許多 html 元素如 <button>
具有隱式定義的角色,這些角色被角色定位器識別。
請注意,角色定位器不會取代可及性審計和符合性測試,而是提供有關 ARIA 指南的早期反饋。
我們建議優先使用角色定位器來定位元素, 因為這是最接近用戶和輔助技術感知頁面的方式。
Locate by label
大多數表單控制項通常都有專用的標籤,可以方便地用來與表單互動。在這種情況下,你可以使用 Page.GetByLabel() 根據其相關標籤定位控制項。
例如,考慮以下的 DOM 結構。
<label>Password <input type="password" /></label>
您可以在找到標籤文字後填寫輸入:
await page.GetByLabel("Password").FillAsync("secret");
當定位表單欄位時,使用此定位器。
Locate by placeholder
輸入可能具有 placeholder 屬性,以提示使用者應輸入的值。您可以使用 Page.GetByPlaceholder() 定位此類輸入。
例如,考慮以下的 DOM 結構。
<input type="email" placeholder="name@example.com" />
您可以在找到佔位符文字後填寫輸入:
await page
.GetByPlaceholder("name@example.com")
.FillAsync("playwright@microsoft.com");
當定位沒有標籤但有佔位符文本的表單元素時,使用此定位器。
根據文字定位
找到包含特定文字的元素。你可以使用子字串、精確字串或正則表達式來匹配 Page.GetByText()。
例如,考慮以下的 DOM 結構。