Playwright 是一个用于自动化测试和网页操作的 Python 库,它提供了对浏览器的控制和操作的功能,包括 Chromium、Firefox 和 WebKit。使用 Playwright,您可以编写自动化测试、网页截图、网页数据提取以及网页交互等任务。
Playwright 具有以下特点:
跨浏览器支持: 支持多种主流浏览器,包括 Chromium、Firefox 和 WebKit。
强大的 API: 提供了丰富的 API,允许您模拟用户操作、获取和修改网页内容、执行 Javascript 等。
异步支持: 支持异步操作,可以更高效地管理并发任务。
自动等待和重试: 具有内置的自动等待和重试机制,使测试更稳定可靠。
Headless 和非 Headless 模式: 可以选择在 Headless 模式(无界面)或非 Headless 模式(有界面)下运行浏览器。
交互式调试: 提供交互式调试工具,方便定位和解决问题。
社区活跃: 由微软开发并开源,拥有活跃的社区支持和更新。
Python 的 Playwright 库提供了易于使用的 API,使得在 Python 中进行网页自动化变得简单而高效。您可以使用 Playwright 来执行各种任务,包括自动化测试、网页截图、网页爬取和数据提取等。
-----------------------------------
Playwright 中的`page.locator()`方法用于在网页上查找和交互操作。它返回一个 Locator 对象,该对象表示匹配指定选择器及任何额外约束(例如 has_text、has_not_text、has 和 has_not)的元素集合。
可以使用 Locator 对象在匹配元素上执行操作,例如点击按钮或填充表单字段。Locator 对象在执行操作之前立即解析为实际的 DOM 元素,因此如果在操作之间更改了 DOM 结构,则操作将在正确的元素上执行。
与其他用于查找元素的方法(如 query_selector_all)相比,locator 提供了更多高级功能,例如等待元素出现并检查它们是否可见。这可以使测试更加稳健和可维护。
此外,locator 允许您通过指定额外约束(例如 has_text 或 has)来缩小元素查找的范围。这在查找可能没有唯一选择器的特定元素时很有用。
总的来说,Playwright 中的 locator 方法是一个强大的工具,它允许开发人员轻松查找和与网页上的元素交互。使用 Playwright 时,建议使用 locator 查找元素。
下面是 `page.locator()` 方法的详细介绍:
page.locator(selector)
page.locator(selector, **kwargs)
### 语法
def locator(
self,
selector: str,
*,
has_text: typing.Optional[typing.Union[str, typing.Pattern[str]]] = None,
has_not_text: typing.Optional[typing.Union[str, typing.Pattern[str]]] = None,
has: typing.Optional["Locator"] = None,
has_not: typing.Optional["Locator"] = None
) -> "Locator":
"""Page.locator
### 参数
方法的第一个参数是selector,它是一个字符串,用于解析DOM元素。
该方法还接受可选的参数has_text、has_not_text、has和has_not。
has_text参数用于匹配包含指定文本的元素,该文本可能出现在元素的子元素或后代元素中。当传递一个字符串时,匹配是不区分大小写的,并搜索子字符串。例如,"Playwright"将匹配<article><div>Playwright</div></article>。
has_not_text参数用于匹配不包含指定文本的元素,该文本可能出现在元素的子元素或后代元素中。当传递一个字符串时,匹配是不区分大小写的,并搜索子字符串。
has参数用于限制方法的结果,仅包含与此相对定位器匹配的元素。例如,article,它有text=Playwright匹配<article><div>Playwright</div></article>。
has_not参数用于匹配不包含与内部定位器匹配的元素的元素。内部定位器查询与外部定位器匹配,而不是文档根。例如,您可以在<article><content><div>Playwright</div></content></article>中查找具有div的content。但是,查找具有article div的content将失败,因为内部定位器必须相对于外部定位器,不应使用外部定位器之外的任何元素。
请注意,外部和内部定位器必须属于同一框架。内部定位器不得包含frameLocators。
### 返回值: 一个 Locator对象(元素定位器),可以用于查找与给定选择器匹配的元素。
### 用法
可以使用 `locator` 对象(`page.locator()返回值)的以下方法来查找元素:
Locator是Playwright中自动等待和重试的核心部分。简而言之,Locator代表在任何时刻在页面上查找元素的方法。
可以使用page.locator()方法创建一个Locator对象实例。
**方法:**
- **all**: 查找所有匹配的元素。
* `first()`: 返回第一个匹配的元素。等价于 `nth(0)`。
* `last()`: 返回最后一个匹配的元素。
- **all_inner_texts**: 获取所有匹配元素的内部文本。
- **all_text_contents**: 获取所有匹配元素的文本内容。
- **and_**: 逻辑与操作符,可以与其他Locator组合使用。
- **blur**: 触发元素失焦事件。
- **bounding_box**: 获取元素的边界框。
- **check**: 选中复选框或单选框。
- **clear**: 清空输入框中的文本。
- **click**: 单击元素。
- **count**: 计算匹配的元素数量。
- **dblclick**: 双击元素。
- **dispatch_event**: 分发指定事件到元素。
- **drag_to**: 将元素拖动到指定位置。
- **evaluate**: 在元素上下文中执行Javascript代码。
- **evaluate_all**: 在所有匹配元素的上下文中执行Javascript代码。
- **evaluate_handle**: 获取元素的Javascript句柄。
- **fill**: 在输入框中输入文本。
- **filter**: 根据指定条件过滤匹配的元素。
- **focus**: 将焦点设置到元素。
- **frame_locator**: 在特定的iframe中查找元素。
- **get_attribute**: 获取元素的属性值。
- **get_by_alt_text**: 根据alt属性的值查找元素。
- **get_by_label**: 根据标签查找元素。
- **get_by_placeholder**: 根据placeholder属性的值查找元素。
- **get_by_role**: 根据角色查找元素。
- **get_by_test_id**: 根据测试ID查找元素。
- **get_by_text**: 根据文本内容查找元素。
- **get_by_title**: 根据标题查找元素。
- **highlight**: 在页面上突出显示匹配的元素。
- **hover**: 将鼠标悬停在元素上。
- **inner_html**: 获取元素的内部HTML。
- **inner_text**: 获取元素的内部文本。
- **input_value**: 获取输入框中的值。
- **is_checked**: 检查元素是否被选中。
- **is_disabled**: 检查元素是否被禁用。
- **is_editable**: 检查元素是否可编辑。
- **is_enabled**: 检查元素是否可用。
- **is_hidden**: 检查元素是否隐藏。
- **is_visible**: 检查元素是否可见。
- **locator**: 创建新的Locator实例。
- **nth**: 获取匹配元素中的第N个。
- **or_**: 逻辑或操作符,可以与其他Locator组合使用。
- **press**: 模拟按键操作。
- **press_sequentially**: 依次按下多个按键。
- **screenshot**: 对元素进行截图。
- **scroll_into_view_if_needed**: 将元素滚动到视图中。
- **select_option**: 选择下拉列表中的选项。
- **select_text**: 选择文本内容。
- **set_checked**: 设置复选框或单选框的选中状态。
- **set_input_files**: 设置输入文件的值。
- **tap**: 轻触元素。
- **text_content**: 获取元素的文本内容。
- **uncheck**: 取消选中复选框或单选框。
- **wait_for**: 等待匹配的元素出现。
### 示例
下面是一个使用 `page.locator()` 方法查找元素的示例:
-----------------------------------------------------------
# 要输出所有匹配元素的HTML内容,包括元素本身,循环遍历元素列表,并分别获取每个元素的HTML内容。
# 以下是示例代码:
# elements = await page.locator('input').all()
# for element in elements:
# html_content = await element.evaluate('(element) => element.outerHTML')
# print(html_content)
# 这将打印所有匹配的输入框元素的HTML内容,包括元素本身。
# Javascript箭头函数表达式的语法比普通函数表达式更简洁。
------------------
evaluate: 在元素上下文中执行Javascript代码。
evaluate_all: 在所有匹配元素的上下文中执行Javascript代码。
evaluate_handle: 获取元素的Javascript句柄。
这段代码中,我们使用了 函数和 来获取所有段落元素的 属性。同时,直接获取按钮元素的 属性,以便输出按钮的 HTML 元素。