mirror of
				https://github.com/microsoft/playwright.git
				synced 2025-06-26 21:40:17 +00:00 
			
		
		
		
	
							parent
							
								
									0f72ef0584
								
							
						
					
					
						commit
						7bd8032439
					
				| @ -833,26 +833,83 @@ element should intersect viewport at any positive ratio. Defaults to `0`. | |||||||
| 
 | 
 | ||||||
| Ensures that [Locator] points to an [attached](../actionability.md#attached) and [visible](../actionability.md#visible) DOM node. | Ensures that [Locator] points to an [attached](../actionability.md#attached) and [visible](../actionability.md#visible) DOM node. | ||||||
| 
 | 
 | ||||||
|  | To check that at least one element from the list is visible, use [`method: Locator.first`]. | ||||||
|  | 
 | ||||||
| **Usage** | **Usage** | ||||||
| 
 | 
 | ||||||
| ```js | ```js | ||||||
|  | // A specific element is visible. | ||||||
| await expect(page.getByText('Welcome')).toBeVisible(); | await expect(page.getByText('Welcome')).toBeVisible(); | ||||||
|  | 
 | ||||||
|  | // At least one item in the list is visible. | ||||||
|  | await expect(page.getByTestId('todo-item').first()).toBeVisible(); | ||||||
|  | 
 | ||||||
|  | // At least one of the two elements is visible, possibly both. | ||||||
|  | await expect( | ||||||
|  |     page.getByRole('button', { name: 'Sign in' }) | ||||||
|  |         .or(page.getByRole('button', { name: 'Sign up' })) | ||||||
|  |         .first() | ||||||
|  | ).toBeVisible(); | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| ```java | ```java | ||||||
|  | // A specific element is visible. | ||||||
| assertThat(page.getByText("Welcome")).isVisible(); | assertThat(page.getByText("Welcome")).isVisible(); | ||||||
|  | 
 | ||||||
|  | // At least one item in the list is visible. | ||||||
|  | asserThat(page.getByTestId("todo-item").first()).isVisible(); | ||||||
|  | 
 | ||||||
|  | // At least one of the two elements is visible, possibly both. | ||||||
|  | asserThat( | ||||||
|  |   page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("Sign in")) | ||||||
|  |     .or(page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("Sign up"))) | ||||||
|  |     .first() | ||||||
|  | ).isVisible(); | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| ```python async | ```python async | ||||||
|  | # A specific element is visible. | ||||||
| await expect(page.get_by_text("Welcome")).to_be_visible() | await expect(page.get_by_text("Welcome")).to_be_visible() | ||||||
|  | 
 | ||||||
|  | # At least one item in the list is visible. | ||||||
|  | await expect(page.get_by_test_id("todo-item").first).to_be_visible() | ||||||
|  | 
 | ||||||
|  | # At least one of the two elements is visible, possibly both. | ||||||
|  | await expect( | ||||||
|  |     page.get_by_role("button", name="Sign in") | ||||||
|  |     .or_(page.get_by_role("button", name="Sign up")) | ||||||
|  |     .first | ||||||
|  | ).to_be_visible() | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| ```python sync | ```python sync | ||||||
|  | # A specific element is visible. | ||||||
| expect(page.get_by_text("Welcome")).to_be_visible() | expect(page.get_by_text("Welcome")).to_be_visible() | ||||||
|  | 
 | ||||||
|  | # At least one item in the list is visible. | ||||||
|  | expect(page.get_by_test_id("todo-item").first).to_be_visible() | ||||||
|  | 
 | ||||||
|  | # At least one of the two elements is visible, possibly both. | ||||||
|  | expect( | ||||||
|  |     page.get_by_role("button", name="Sign in") | ||||||
|  |     .or_(page.get_by_role("button", name="Sign up")) | ||||||
|  |     .first | ||||||
|  | ).to_be_visible() | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| ```csharp | ```csharp | ||||||
|  | // A specific element is visible. | ||||||
| await Expect(Page.GetByText("Welcome")).ToBeVisibleAsync(); | await Expect(Page.GetByText("Welcome")).ToBeVisibleAsync(); | ||||||
|  | 
 | ||||||
|  | // At least one item in the list is visible. | ||||||
|  | await Expect(Page.GetByTestId("todo-item").First).ToBeVisibleAsync(); | ||||||
|  | 
 | ||||||
|  | // At least one of the two elements is visible, possibly both. | ||||||
|  | await Expect( | ||||||
|  |   Page.GetByRole(AriaRole.Button, new() { Name = "Sign in" }) | ||||||
|  |     .Or(Page.GetByRole(AriaRole.Button, new() { Name = "Sign up" })) | ||||||
|  |     .First | ||||||
|  | ).ToBeVisibleAsync(); | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| ### option: LocatorAssertions.toBeVisible.visible | ### option: LocatorAssertions.toBeVisible.visible | ||||||
|  | |||||||
| @ -1171,13 +1171,13 @@ For example, consider a scenario where you'd like to click on a "New email" butt | |||||||
| 
 | 
 | ||||||
| :::note | :::note | ||||||
| If both "New email" button and security dialog appear on screen, the "or" locator will match both of them, | If both "New email" button and security dialog appear on screen, the "or" locator will match both of them, | ||||||
| possibly throwing the ["strict mode violation" error](#strictness). | possibly throwing the ["strict mode violation" error](#strictness). In this case, you can use [`method: Locator.first`] to only match one of them. | ||||||
| ::: | ::: | ||||||
| 
 | 
 | ||||||
| ```js | ```js | ||||||
| const newEmail = page.getByRole('button', { name: 'New' }); | const newEmail = page.getByRole('button', { name: 'New' }); | ||||||
| const dialog = page.getByText('Confirm security settings'); | const dialog = page.getByText('Confirm security settings'); | ||||||
| await expect(newEmail.or(dialog)).toBeVisible(); | await expect(newEmail.or(dialog).first()).toBeVisible(); | ||||||
| if (await dialog.isVisible()) | if (await dialog.isVisible()) | ||||||
|   await page.getByRole('button', { name: 'Dismiss' }).click(); |   await page.getByRole('button', { name: 'Dismiss' }).click(); | ||||||
| await newEmail.click(); | await newEmail.click(); | ||||||
| @ -1186,7 +1186,7 @@ await newEmail.click(); | |||||||
| ```java | ```java | ||||||
| Locator newEmail = page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("New")); | Locator newEmail = page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("New")); | ||||||
| Locator dialog = page.getByText("Confirm security settings"); | Locator dialog = page.getByText("Confirm security settings"); | ||||||
| assertThat(newEmail.or(dialog)).isVisible(); | assertThat(newEmail.or(dialog).first()).isVisible(); | ||||||
| if (dialog.isVisible()) | if (dialog.isVisible()) | ||||||
|   page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("Dismiss")).click(); |   page.getByRole(AriaRole.BUTTON, new Page.GetByRoleOptions().setName("Dismiss")).click(); | ||||||
| newEmail.click(); | newEmail.click(); | ||||||
| @ -1195,7 +1195,7 @@ newEmail.click(); | |||||||
| ```python async | ```python async | ||||||
| new_email = page.get_by_role("button", name="New") | new_email = page.get_by_role("button", name="New") | ||||||
| dialog = page.get_by_text("Confirm security settings") | dialog = page.get_by_text("Confirm security settings") | ||||||
| await expect(new_email.or_(dialog)).to_be_visible() | await expect(new_email.or_(dialog).first).to_be_visible() | ||||||
| if (await dialog.is_visible()): | if (await dialog.is_visible()): | ||||||
|   await page.get_by_role("button", name="Dismiss").click() |   await page.get_by_role("button", name="Dismiss").click() | ||||||
| await new_email.click() | await new_email.click() | ||||||
| @ -1204,7 +1204,7 @@ await new_email.click() | |||||||
| ```python sync | ```python sync | ||||||
| new_email = page.get_by_role("button", name="New") | new_email = page.get_by_role("button", name="New") | ||||||
| dialog = page.get_by_text("Confirm security settings") | dialog = page.get_by_text("Confirm security settings") | ||||||
| expect(new_email.or_(dialog)).to_be_visible() | expect(new_email.or_(dialog).first).to_be_visible() | ||||||
| if (dialog.is_visible()): | if (dialog.is_visible()): | ||||||
|   page.get_by_role("button", name="Dismiss").click() |   page.get_by_role("button", name="Dismiss").click() | ||||||
| new_email.click() | new_email.click() | ||||||
| @ -1213,7 +1213,7 @@ new_email.click() | |||||||
| ```csharp | ```csharp | ||||||
| var newEmail = page.GetByRole(AriaRole.Button, new() { Name = "New" }); | var newEmail = page.GetByRole(AriaRole.Button, new() { Name = "New" }); | ||||||
| var dialog = page.GetByText("Confirm security settings"); | var dialog = page.GetByText("Confirm security settings"); | ||||||
| await Expect(newEmail.Or(dialog)).ToBeVisibleAsync(); | await Expect(newEmail.Or(dialog).First).ToBeVisibleAsync(); | ||||||
| if (await dialog.IsVisibleAsync()) | if (await dialog.IsVisibleAsync()) | ||||||
|   await page.GetByRole(AriaRole.Button, new() { Name = "Dismiss" }).ClickAsync(); |   await page.GetByRole(AriaRole.Button, new() { Name = "Dismiss" }).ClickAsync(); | ||||||
| await newEmail.ClickAsync(); | await newEmail.ClickAsync(); | ||||||
|  | |||||||
							
								
								
									
										14
									
								
								packages/playwright/types/test.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								packages/playwright/types/test.d.ts
									
									
									
									
										vendored
									
									
								
							| @ -5455,10 +5455,24 @@ interface LocatorAssertions { | |||||||
|    * Ensures that {@link Locator} points to an [attached](https://playwright.dev/docs/actionability#attached) and
 |    * Ensures that {@link Locator} points to an [attached](https://playwright.dev/docs/actionability#attached) and
 | ||||||
|    * [visible](https://playwright.dev/docs/actionability#visible) DOM node.
 |    * [visible](https://playwright.dev/docs/actionability#visible) DOM node.
 | ||||||
|    * |    * | ||||||
|  |    * To check that at least one element from the list is visible, use | ||||||
|  |    * [locator.first()](https://playwright.dev/docs/api/class-locator#locator-first).
 | ||||||
|  |    * | ||||||
|    * **Usage** |    * **Usage** | ||||||
|    * |    * | ||||||
|    * ```js
 |    * ```js
 | ||||||
|  |    * // A specific element is visible.
 | ||||||
|    * await expect(page.getByText('Welcome')).toBeVisible(); |    * await expect(page.getByText('Welcome')).toBeVisible(); | ||||||
|  |    * | ||||||
|  |    * // At least one item in the list is visible.
 | ||||||
|  |    * await expect(page.getByTestId('todo-item').first()).toBeVisible(); | ||||||
|  |    * | ||||||
|  |    * // At least one of the two elements is visible, possibly both.
 | ||||||
|  |    * await expect( | ||||||
|  |    *     page.getByRole('button', { name: 'Sign in' }) | ||||||
|  |    *         .or(page.getByRole('button', { name: 'Sign up' })) | ||||||
|  |    *         .first() | ||||||
|  |    * ).toBeVisible(); | ||||||
|    * ``` |    * ``` | ||||||
|    * |    * | ||||||
|    * @param options |    * @param options | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Dmitry Gozman
						Dmitry Gozman