定位器是playwright自动等待和重试能力的核心部分,代表了一种随时在页面上查找元素的方法。
Locator | Playwright Python
当locator指向一组元素时,这个方法返回locator对应的数组,指向它们代表的元素
for li in page.get_by_role('listitem').all():
li.click();
返回元素的文本内容
texts = page.get_by_role("link").all_text_contents()
返回元素节点的innerText
texts = page.get_by_role("link").all_inner_texts()
创建一个与此定位器和参数定位器相匹配的定位器。
button = page.get_by_role("button").and_(page.getByTitle("Subscribe"))
在 Playwright 中,`blur()` 方法用于将焦点从当前元素移除,即触发元素的 `blur` 事件。它可以用于模拟用户手动离开输入框或其他具有焦点的元素的操作。
以下是 `blur()` 方法的使用示例:
```python
from playwright.sync_api import sync_playwright
with sync_playwright() as playwright:
# 启动浏览器
browser = playwright.chromium.launch()
# 创建一个新的上下文
context = browser.new_context()
# 在上下文中创建一个新的页面
page = context.new_page()
# 打开一个示例页面
page.goto('https://example.com')
# 获取目标元素的选择器(locator)
locator = page.locator('#my-input')
# 聚焦到目标元素
locator.focus()
# 将焦点从目标元素移除
locator.blur()
# 关闭浏览器
browser.close()
```
在上述示例中,首先通过 `page.locator('#my-input')` 获取了目标输入框元素的 locator。然后使用 `focus()` 方法将焦点聚焦到该元素,再使用 `blur()` 方法将焦点从该元素移除,触发 `blur` 事件。
请注意,`blur()` 方法需要目标元素具有焦点,并且在调用此方法之前必须先调用 `focus()` 方法。另外,`blur()` 方法可以触发 `blur` 事件,但并不会模拟用户离开该元素的鼠标操作。
`bounding_box()` 方法是 Playwright 中页面元素(ElementHandle)对象的一个方法,用于获取元素的边界框信息。
`bounding_box()` 方法返回一个表示元素边界框的字典对象,包含以下属性:
- `x`:元素左边缘相对于视口的 x 坐标。
- `y`:元素上边缘相对于视口的 y 坐标。
- `width`:元素的宽度。
- `height`:元素的高度。
以下是一个使用 `bounding_box()` 方法获取元素边界框信息的示例:
```python
from playwright.sync_api import sync_playwright
with sync_playwright() as playwright:
# 启动浏览器
browser = playwright.chromium.launch()
# 创建一个新的上下文
context = browser.new_context()
# 在上下文中创建一个新的页面
page = context.new_page()
# 跳转到示例页面
page.goto('https://example.com')
# 获取元素的选择器(locator)
locator = page.locator('h1')
# 获取元素的边界框信息
bounding_box = locator.bounding_box()
# 打印边界框信息
print(bounding_box)
# 关闭浏览器
browser.close()
```
在上述示例中,我们使用 `bounding_box()` 方法获取 `h1` 元素的边界框信息,并将其打印出来。在实际使用中,你可以根据需要使用边界框信息进行各种操作,例如确定元素的位置、大小或进行页面截图等。
请注意,如果元素对应的 DOM 节点在文档中不可见(例如在隐藏的区域,如滚动容器里或 `display: none` 的元素),`bounding_box()` 返回的边界框会为空(null)。因此,在调用 `bounding_box()` 方法之前,你可以先确保元素在 DOM 中是可见的。
page.get_by_role("checkbox").check() 选中一个checkbox或者radio元素
page.get_by_role("textbox").clear() 清空
page.get_by_role("button").click() 点击元素
Shift-right-click at a specific position on a canvas:
page.locator("canvas").click(
button="right", modifiers=["Shift"], position={"x": 23, "y": 32}
)
返回定位到的元素个数
count = page.get_by_role("listitem").count()
双击元素
locator.dblclick()
locator.dblclick(**kwargs)
locator.dispatch_event("click")
将元素拖到目标元素并放下
source = page.locator("#source")
target = page.locator("#target")source.drag_to(target)
# or specify exact positions relative to the top-left corners of the elements:
source.drag_to(
target,
source_position={"x": 34, "y": 7},
target_position={"x": 10, "y": 20}
)
方 法 | 作 用 | 语 法 |
evaluate | 在页面执行js方法 | tweets = page.locator(".tweet .retweets") assert tweets.evaluate("node => node.innerText") == "10 retweets" |
evaluate_all | 执行js脚本,参数为所有匹配到的元素 | |
evaluate_handle | 执行js脚本,返回JSHandle | |
fill | 为input元素设置value | |
filter | 缩小定位范围 | row_locator = page.locator("tr") # ... row_locator.filter(has_text="text in column 1").filter( has=page.get_by_role("button", name="column 2 button") ).screenshot() |
focus | 聚焦元素 | locator.focus() locator.focus(**kwargs) |
frame_locator |
定位frame | locator = page.frame_locator("iframe").get_by_text("Submit") locator.click() |
get_attribute |
获取属性值 | locator.get_attribute(name) locator.get_attribute(name, **kwargs) |
get_by_alt_text |
通过alt的文本进行定位 | page.get_by_alt_text("Playwright logo").click() |
get_by_label |
通过label定位 | page.get_by_label("Username").fill("john") page.get_by_label("Password").fill("secret") |
get_by_placeholder |
通过占位符定位 | page.get_by_placeholder("[email protected]").fill("[email protected]") |
get_by_role | 通过角色定位元素 | expect(page.get_by_role("heading", name="Sign up")).to_be_visible() |
get_by_test_id |
通过测试id定位 | page.get_by_test_id("directions").click() |
get_by_text |
通过text定位 | page.get_by_text("world") |
get_by_title |
通过text定位 | expect(page.get_by_title("Issues count")).to_have_text("25 issues") |
highlight |
高亮元素 | locator.highlight() |
hover |
模拟鼠标在元素上悬停 | page.get_by_role("link").hover() |
inner_html |
返回元素的内在html | locator.inner_html() locator.inner_html(**kwargs) |
inner_text |
返回元素的内部text | locator.inner_text() locator.inner_text(**kwargs) |
input_value |
返回元素的value | value = page.get_by_role("textbox").input_value() |
press |
按键方法 | page.get_by_role("textbox").press("Backspace") |
screenshot |
对元素进行截屏 | page.get_by_role("link").screenshot() |
scroll_into_view_if_needed |
此方法等待可操作性检查,然后尝试将元素滚动到视图中,除非它按照IntersectionObserver的定义完全可见 | locator.scroll_into_view_if_needed() locator.scroll_into_view_if_needed(**kwargs) |
select_option |
选择option | # single selection matching the value or label element.select_option("blue") # single selection matching the label element.select_option(label="blue") # multiple selection for blue, red and second option element.select_option(value=["red", "green", "blue"]) |
or_ |
创建一个与两个定位器中的任何一个匹配的定位器。 | |
nth | 返回第 n 个匹配元素的定位器。它是从零开始的,nth(0) 选择第一个元素。 |
banana = page.get_by_role("listitem").nth(2) |
select_text |
选择文本 | locator.select_text() locator.select_text(**kwargs) |
set_checked |
设置checkbox和radio为选中状态 | page.get_by_role("checkbox").set_checked(True) |
set_input_files |
上传文件 | page.get_by_label("Upload file").set_input_files('myfile.pdf') |
tap |
元素执行tap | locator.tap() locator.tap(**kwargs) |
text_content |
返回元素的text内容 | locator.text_content() locator.text_content(**kwargs) |
type |
元素输入 | element.type("hello") # types instantly element.type("world", delay=100) # types slower, like a user |
uncheck |
确保checkbox和radio元素是未选中的 | page.get_by_role("checkbox").uncheck() |
wait_for |
当定位器指定的元素满足 如果目标元素已经满足条件,该方法立即返回。否则,最多等待几 |
order_sent = page.locator("#order-sent") order_sent.wait_for() |
方法 | 作用 | 用法 |
is_checked |
判断checkbox/radio是否被选中 | checked = page.get_by_role("checkbox").is_checked() |
is_disabled |
判断元素是否可用 | disabled = page.get_by_role("button").is_disabled() |
is_editable |
返回元素是否可编辑 | editable = page.get_by_role("textbox").is_editable() |
is_enabled |
返回元素是否启用 | enabled = page.get_by_role("button").is_enabled() |
is_hidden |
返回元素是否隐藏 | hidden = page.get_by_role("button").is_hidden() |
is_visible |
返回元素是否可见 | visible = page.get_by_role("button").is_visible() |
该方法在定位器的子树中查找与指定选择器匹配的元素。它还接受过滤器选项,类似于locator.filter()方法