| 定位策略 | 语法 |
| -------- | ----------------------------------------------- |
| ID | `page.locator("#id")` |
| 类名 | `page.locator(".className")` |
| 标签 | `page.locator("tagName")` |
| 属性选择器 | `page.locator("div[attribute='value']")` |
| 组合选择器 | `page.locator("div > span")` |
| 多类名 | `page.locator(".class1.class2")` |
| 通配符选择器 | `page.locator("*")` |
| 选择器列表 | `page.locator("div, span")` |
| 属性包含 | `page.locator("[attribute*='value']")` |
| 属性开始于 | `page.locator("[attribute^='value']")` |
| 属性结束于 | `page.locator("[attribute$='value']")` |
| 属性包含单词 | `page.locator("[attribute~='value']")` |
| 属性精确匹配 | `page.locator("[attribute]")` |
| nth 元素 | `page.locator("div:nth-of-type(2)")` |
| 子元素 | `page.locator("div >> span")` |
| 兄弟元素 | `page.locator("div + span")` |
| 后代元素 | `page.locator("div span")` |
| 选择器和文本 | `page.locator("span:has-text('text')")` |
| 选择器或文本 | `page.locator("span:text('text')")` |
| 角色 | `page.locator("role=button")` |
| 布尔属性 | `page.locator("input[checked]")` |
| 包含文本 | `page.locator("span:has-text('text')")` |
| 精确匹配文本 | `page.locator("span:text-is('text')")` |
| 包含部分文本 | `page.locator("span:has-text('partial text')")` |
| 精确匹配部分文本 | `page.locator("span:text-is('exact text')")` |
| 定位方法名称 | 描述 | 示例 |
| ----------------- | ------------------------------------ | ----------------------------------------- |
| getByRole | 根据元素的角色(role)属性来定位 | `page.getByRole('button')` |
| getByLabel | 根据元素的 `label` 或相关联的 `label` 元素的文本来定位 | `page.getByLabel('Username')` |
| getByPlaceholder | 根据元素的 `placeholder` 属性来定位 | `page.getByPlaceholder('Enter password')` |
| getByTestId | 根据元素的 `data-testid` 或类似的自定义数据属性来定位 | `page.getByTestId('product-id')` |
| getByAltText | 根据元素的 `alt` 文本来定位 | `page.getByAltText('image description')` |
| getByTitle | 根据元素的 `title` 属性来定位 | `page.getByTitle('Download')` |
| getByValue | 根据输入元素的值来定位 | `page.getByValue('example')` |
| getByText | 根据元素的可见文本来定位 | `page.getByText('Sign in')` |
| getByDisplayValue | 根据输入元素的显示值来定位 | `page.getByDisplayValue('example')` |
| getBySelectText | 根据 `<select>` 元素中选中的文本来定位 | `page.getBySelectText('Option 1')` |
| getByTooltipText | 根据元素的 tooltip 文本来定位 | `page.getByTooltipText('Add to cart')` |
| getByURL | 根据元素的 `href` 属性中的 URL 片段来定位 | `page.getByURL('/path/*')` |
| getByButtonText | 根据按钮元素的文本来定位 | `page.getByButtonText('Submit')` |
| getByInputValue | 根据输入元素的值来定位 | `page.getByInputValue('example')` |
| 断言方法 | 描述 | 示例 |
| ----------------------------------------------------- | ------------------------ | -------------------------------------------------------- |
| `expect(page).to_have_title()` | 确保页面具有给定的标题。 | `expect(page).to_have_title(re.compile(r".*checkout"))`2 |
| `expect(page).not_to_have_title()` | 确保页面不具有给定的标题。 | `expect(page).not_to_have_title("Unexpected Title")` |
| `expect(page).to_have_url()` | 确保页面导航到给定的 URL。 | `expect(page).to_have_url(re.compile(".*checkout"))`2 |
| `expect(page).not_to_have_url()` | 确保页面没有导航到给定的 URL。 | `expect(page).not_to_have_url("http://example.com")` |
| `expect(locator).to_be_checked()` | 验证复选框是否被选中。 | `expect('#checkbox').to_be_checked()` |
| `expect(locator).to_be_disabled()` | 验证元素是否被禁用。 | `expect('#submit').to_be_disabled()` |
| `expect(locator).to_be_editable()` | 验证元素是否可编辑。 | `expect('#input').to_be_editable()` |
| `expect(locator).to_be_empty()` | 验证容器是否为空。 | `expect('#table').to_be_empty()` |
| `expect(locator).to_be_enabled()` | 验证元素是否启用。 | `expect('#button').to_be_enabled()` |
| `expect(locator).to_be_focused()` | 验证元素是否获得焦点。 | `expect('#input').to_be_focused()` |
| `expect(locator).to_be_hidden()` | 验证元素是否隐藏。 | `expect('#element').to_be_hidden()` |
| `expect(locator).to_be_visible()` | 验证元素是否可见。 | `expect('#element').to_be_visible()` |
| `expect(locator).to_contain_text()` | 验证元素是否包含指定的文本。 | `expect('#element').to_contain_text('Text')` |
| `expect(locator).to_have_attribute(attributeName)` | 验证元素是否具有指定的属性。 | `expect('#element').to_have_attribute('class')` |
| `expect(locator).to_have_class(className)` | 验证元素是否具有指定的类名。 | `expect('#element').to_have_class('class-name')` |
| `expect(locator).to_have_count(count)` | 验证元素个数是否与期望值相等。 | `expect('.element').to_have_count(5)` |
| `expect(locator).to_have_css(cssProperty)` | 验证元素是否具有指定的CSS属性。 | `expect('#element').to_have_css('color', 'blue')` |
| `expect(locator).to_have_id(id)` | 验证元素是否具有指定的ID。 | `expect('#element').to_have_id('my-id')` |
| `expect(locator).to_have_js_property(jsPropertyName)` | 验证元素是否具有指定的JavaScript属性。 | `expect('#element').to_have_js_property('checked')` |
| `expect(locator).to_have_text(text)` | 验证元素是否具有指定的文本内容。 | `expect('#element').to_have_text('some text')` |
| `expect(locator).to_have_value(value)` | 验证表单元素是否具有指定的值。 | `expect('#element').to_have_value('some-value')` |
| `expect(locator).to_have_values(values)` | 验证表单元素是否具有指定的值集合。 | `expect(['#el1', '#el2']).to_have_values(['v1', 'v2'])` |
| `expect(page).to_have_title(title)` | 验证页面标题是否与期望值相等。 | `expect(page).to_have_title('expected-title')` |
| `expect(page).to_have_url(url)` | 验证页面URL是否与期望值相等。 | `expect(page).to_have_url('expected-url')` |
| `expect(api_response).to_be_ok()` | 验证API响应状态码是否为200(OK)。 | `expect(api_response).to_be_ok()` |
| 操作(Action) | 描述 | 示例 |
| ------------------------------------------------------ | ------------------------------- | ---------------------------------------------- |
| `page.mouse.click(x, y)` | 在页面上的特定坐标点击。 | `page.mouse.click(100, 100)` |
| `page.mouse.dblclick(x, y)` | 在页面上的特定坐标双击。 | `page.mouse.dblclick(100, 100)` |
| `page.mouse.down(options)` | 在页面上的特定位置按下鼠标按钮(默认是主按钮)。 | `page.mouse.down()` |
| `page.mouse.up(options)` | 在页面上的当前位置释放鼠标按钮。 | `page.mouse.up()` |
| `page.mouse.move(x, y, options)` | 将鼠标指针移动到页面上的特定坐标。 | `page.mouse.move(100, 100)` |
| `page.mouse.drag(startX, startY, endX, endY, options)` | 将鼠标拖动从一个坐标到另一个坐标。 | `page.mouse.drag(100, 100, 200, 200)` |
| `page.mouse.dragAndDrop(source, target, options)` | 从一个元素拖动鼠标到另一个元素。 | `page.mouse.dragAndDrop('.source', '.target')` |
| `page.keyboard.down(key)` | 按下键盘上的一个键。 | `page.keyboard.down('Shift')` |
| `page.keyboard.up(key)` | 释放键盘上的一个键。 | `page.keyboard.up('Shift')` |
| `page.keyboard.type(text, options)` | 在当前键盘焦点所在的元素中输入文本。 | `page.keyboard.type('Hello World')` |
| `page.keyboard.press(key, options)` | 按顺序按下一系列键。(例如,可以组合 Shift+Arrow) | `page.keyboard.press('Shift+ArrowDown')` |
| `page.keyboard.insertText(text)` | 将文本直接插入到当前的键盘焦点中,不涉及键盘事件。 | `page.keyboard.insertText('Hello')` |
| `page.touchscreen.tap(x, y)` | 在触摸屏幕上的特定坐标进行一次点击。 | `page.touchscreen.tap(100, 100)` |
| `page.accessibility.snapshot(options)` | 获取页面的可访问性树的快照。 | `page.accessibility.snapshot()` |
| 方法名称 | 描述 | 返回值类型 |
| ----------------------------------- | -------------------------- | --------------- |
| `page.waitForSelector` | 等待页面出现指定的 CSS 选择器。 | `ElementHandle` |
| `page.waitForFunction` | 等待页面上的某个条件函数返回 `true`。 | `null` |
| `page.waitForTimeout` | 设置一个等待超时。 | `null` |
| `page.waitForURL` | 等待页面的 URL 变为指定的字符串。 | `null` |
| `page.waitForNavigation` | 等待页面导航到新 URL。 | `null` |
| `page.waitForLoadState` | 等待页面达到特定的加载状态。 | `null` |
| `page.waitForEvent` | 等待页面上的某个事件被触发。 | `Event` |
| `elementHandle.waitForSelector` | 等待元素内部出现指定的选择器。 | `ElementHandle` |
| `elementHandle.waitForElementState` | 等待元素达到特定的状态。 | `ElementHandle` |
| `frameLocator.waitForSelector` | 在指定的 iframe 中等待出现 CSS 选择器。 | `ElementHandle` |