背景:前端开发,公司项目要写ui自动化,没测试经验,过了一遍Python语法,然后开始了自动化测试的学习,这里记录一下使用中用的到的知识点
引言
在较长的产品周期中,自动化测试是确保应用质量和性能的关键步骤。这里记录了一个前端开发者从零开始,学习Python和Playwright来构建自动化测试的过程。Playwright 是一个强大的自动化测试工具,支持多种浏览器,本文将从基础安装到脚本编写的每一个步骤进行详细介绍,重点是示例。
建议:等你遇到问题再来查,或许会帮助你解决
测试大佬勿喷,欢迎指正
playWright 自带的元素获取工具
效果展示:
playwright codegen 是 Playwright 测试框架的一个功能,它可以自动记录您在浏览器中的操作并生成相应的测试代码。这是一个非常有用的工具,尤其是对于快速开始编写测试或者为现有的用户操作创建自动化测试脚本。
使用 playwright codegen 的步骤如下:
安装 Playwright:如果您还没有安装 Playwright,可以通过下面命令安装
1 | 复制代码npm install playwright |
运行 Codegen:在命令行中输入 npx playwright codegen 后跟您想要测试的网站的 URL。例如:
1 | arduino复制代码npx playwright codegen https://www.baidu.com |
如果您不提供 URL,codegen 会打开一个空白的浏览器窗口,您可以在其中输入您想要测试的网站的 URL。
记录操作: 在打开的浏览器窗口中执行您想要测试的操作。Playwright 会监视您的操作并生成相应的测试代码。
生成断言: 您可以通过点击 Playwright Inspector 窗口中的图标来生成断言,然后点击页面上的元素来对其进行断言。
停止记录: 完成操作后,点击“停止记录”按钮。然后,您可以使用“复制”按钮将生成的代码复制到您的编辑器中。
编辑和保存测试: 您可以在编辑器中进一步编辑和完善生成的测试代码,然后将其保存为测试文件。 playwright codegen 是快速生成测试代码的强大工具,它可以节省时间并确保测试准确录制了用户的实际操作。
元素获取示例
语法page.locator()
page.locator(".menu-delete-modal")
是 Playwright 测试库中的一个语法,用于定位页面上的元素,并且可以链式调用多种操作。这里,.menu-delete-modal
是一个CSS类,它会选择页面上所有具有 menu-delete-modal
类的元素。page.locator
方法返回一个 Locator
对象,代表了页面上的一个或多个DOM元素,您可以对这些元素执行各种操作,比如点击、填写表单等。
以下是一些 Python 示例,展示了获取元素的常用方法page.locator()
:
- 定位元素:使用 CSS 选择器或 XPath 来定位页面上的元素。
1 | bash复制代码page.locator('.example').click() # 点击类名为example的元素 |
- 文本内容定位:通过元素的文本内容来定位。
1 | bash复制代码page.locator('text="登录"').click() # 点击文本为“登录”的元素 |
- 属性定位:通过元素的属性来定位。
1 | bash复制代码page.locator('[name="email"]').fill('example@example.com') # 填写name属性为email的输入框 |
- 等待元素:等待元素出现在页面上。
1 | ini复制代码page.locator('.loading').wait_for(state="hidden") # 等待加载元素消失,默认等待元素出现 |
- 获取元素属性:获取元素的属性值。
1 | ini复制代码href = page.locator('.link').get_attribute('href') # 获取链接的href属性 |
- 处理多个元素:对页面上的一组元素进行操作。
1 | ini复制代码items = page.locator('.list-item').element_handles() |
- 元素的父级元素: 拿到父级,获取父级下其他数据是。
1 | ini复制代码parent_element = page.locator('text="登录"').locator('xpath=..') |
示例-> 获取类名 menu-delete-modal 弹框下一个按钮
1 | arduino复制代码page.locator(".menu-delete-modal").get_by_role("button", name="确定") |
示例-> 使用locator选择器来点击一个确定按钮
1 | scss复制代码page.locator(".menu-delete-modal").click() |
注意:在严格模式,返回的是一个或多个元素,存在差异。如果是一个元素,可以直接执行Locator
对象上的元素操作方法,一些静态方法,如:click(), inner_html()…;多个元素的情况不能执行click(),inner_html()…;通过count() 可以查看有多少元素。如图
一个元素:
多个元素:
想要点击其中一个元素可以使用.nth(index)
,其中 index
是从 0 开始的索引:
1 | scss复制代码page.locator(".el-button").nth(0).click() # 点击第一个按钮 |
如果需要对所有匹配的元素执行操作,可以遍历它们:
1 | ini复制代码# 方式1 |
page.get_by_role()
get_by_role
是 Playwright 测试库中的一个功能,它允许您根据元素的 ARIA 角色 来定位页面上的元素。当您使用 get_by_role
时,通常也会传递一个可访问名称,以便精确地定位到特定元素。
例如,如果您想定位并且点击页面上名为“登录”的按钮,可以使用以下代码:
1 | arduino复制代码page.locator(".menu-delete-modal").get_by_role("button", name="确定").click() |
这里按钮在浏览器的元素界面是button下包裹 span,确定文字在span内,如下:
name的值采用的是模糊匹配,name为:确,也可以正常执行
对前端开发者来说,直接使用 HTML 元素和类名选择器更直观和方便。ARIA 角色主要是为了提高网页的无障碍性,帮助使用辅助技术的用户更好地理解和导航网页内容。
示例-> get_by_text 精准获取一个元素
界面:
代码如下:
1 | arduino复制代码page.locator('.menu-config-dropdown-menu').get_by_text('员工') |
执行发现会获取两个元素
{Error}strict mode violation: locator(“.menu-config-dropdown-menu”).get_by_text(“员工”) resolved to 2 elements:
…
aka get_by_text(“员工”, exact=True)…
aka get_by_text(“全部员工”)
想要精准匹配,如下哦
1 | ini复制代码page.locator('.menu-config-dropdown-menu').get_by_text('员工', exact=True) |
示例-> 获取元素的父级元素
期望的效果是通过标题名称获取到包装元素,最终调用如下:
1 | scss复制代码menu_form_design_page.get_component_by_comp_name('单行输入333').click() |
场景如下:
函数如下:
1 | python复制代码def get_component_by_comp_name(self, comp_name: str) -> ComponentWrapper: |
ComponentWrapper
类如下:
1 | python复制代码from playwright.async_api import Locator, Page |
元素操作
示例-> 拖拽元素
1 | ini复制代码# 向指定子表组件中添加指定类型组件,传入指定子表名称和组件类型列表 |
示例-> Python playWright 执行浏览器JavaScript脚本代码
- 点击元素
1 | python复制代码def click_element(self, element: Locator): |
- 有的时候playWright的click()方法会有问题,点击不到目标元素,可以使用JavaScript代码来执行点击操作
下面是一个组件的封装类,里面覆盖了点击元素的方法,使用了evaluate
方法执行JavaScript
代码:
1 | python复制代码from playwright.async_api import Locator, Page |
附件上传
1 | python复制代码class AddImportTemplateUploadInput: |
元素断言
常用语法
以下是一些Playwright测试框架中常用的断言方法:
to_be_visible()
:验证元素是否可见。这是最常用的断言之一,因为它可以快速检查元素的显示状态。
1 | scss复制代码# 验证元素是否隐藏 |
to_have_text(text)
:验证元素是否包含特定的文本内容。这个断言也很常用,因为它可以确认元素中的文本是否符合预期。
1 | bash复制代码# 验证元素是否包含特定的文本内容 |
to_be_editable()
:验证元素是否可编辑。这个断言对于表单元素来说非常重要,确保用户可以输入数据。
1 | scss复制代码# 验证元素是否可编辑 |
to_have_class(class_name)
:验证元素是否具有特定的类名。类名通常与元素的视觉和功能特性相关联。
1 | bash复制代码# 验证元素是否具有特定的类名 |
to_have_attribute(name, value)
:验证元素是否具有特定的属性和值。属性值可以提供关于元素状态的重要信息。
1 | csharp复制代码# 验证元素是否具有特定的属性和值 |
to_have_css(property, value)
:验证元素是否具有特定的CSS属性和值。CSS属性影响元素的布局和外观。
1 | bash复制代码# 验证元素是否具有特定的CSS属性和值 |
to_have_js_property(name, value)
:验证元素是否具有特定的JavaScript属性和值。这些属性可能会影响元素的行为和状态。
1 | python复制代码# 验证元素是否具有特定的JavaScript属性和值 |
to_have_id(id)
:验证元素是否具有特定的ID。ID是元素的唯一标识符,通常用于精确定位。
1 | bash复制代码# 验证元素是否具有特定的ID |
to_have_count(count)
:验证页面上特定元素的数量是否符合预期。这个断言用于检查元素集合的大小。
1 | scss复制代码# 验证页面上特定元素的数量是否符合预期 |
to_be_focused()
:验证元素是否获得焦点。焦点状态对于交互元素来说非常重要。
1 | scss复制代码# 验证元素是否获得焦点 |
to_be_hidden()
:验证元素是否隐藏。这与to_be_visible()
相对,用于检查元素是否未显示。
1 | scss复制代码# 验证元素是否隐藏 |
to_be_empty()
:验证容器元素是否为空。这个断言用于确认容器类元素中没有子元素。
1 | scss复制代码# 验证容器元素是否为空 |
判断 是否有 某个元素
1 | python复制代码async def element_exists(page, selector): |
工具方法
示例-> Python中的指定文件夹压缩,类似于鼠标右键 -> 压缩该文件夹📂
1 | lua复制代码def compress_directory(file_path, zip_file_path): |
使用示例:
1 | ini复制代码file_path = '/Users/xxx/Documents/tests/app_test_assets/xxx系统场景测试模版' |
避坑📢:mac解压会自动包裹一层文件夹
小白经验,欢迎指正
本文转载自: 掘金