playwright

| 定位策略 | 语法 |

| -------- | ----------------------------------------------- |

| 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` |

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容