大数跨境

Playwright元素实战操作

Playwright元素实战操作 慧测
2023-03-09
1

Playwright可以与HTML输入元素交互,例如文本输入框、复选框、单选按钮、选择选项、鼠标点击、键盘输入和快捷键,以及上传文件和聚焦元素。

文本输入

使用locator.fill()是填写表单字段最简单的方法。它将焦点放在元素上,并触发输入事件,输入文本。它适用于<input>、<textarea>和[contenteditable]元素。

# 这行代码的作用是在页面中查找一个文本框元素,并向其中填入文本值 "Peter"。get_by_role是一个查找页面元素的方法,它接受一个字符串参数,代表要查找的元素的角色或类型。在这里,我们查找的是一个 "textbox" 类型的文本框元素page.get_by_role("textbox").fill("Peter")# 日期输入page.get_by_label("Birth date").fill("2020-02-02")# 时间输入page.get_by_label("Appointment time").fill("13:15")# Local datetime inputpage.get_by_label("Local time").fill("2020-03-02T05:15")

可以使用 get_by_label 方法来定位具有特定标签(即 label 元素)的输入元素。

通常情况下,一个标签元素(<label>)会与一个表单元素(如输入框、下拉列表、单选框等)相关联,通过 for 属性或将表单元素包含在标签内部的方式建立关联。这样,当用户单击标签时,关联的表单元素就会获得焦点。在自动化测试中,可以使用 get_by_label 方法来查找具有特定标签的表单元素,从而模拟用户操作。

需要注意的是,使用 get_by_label 方法前提是标签元素和表单元素之间需要正确建立了关联。如果标签元素没有与表单元素相关联,或者使用了其他方式建立关联(如 aria-labelledby 属性),则无法使用 get_by_label 方法来查找对应的表单元素。

复选框和单选按钮 

使用 locator.set_checked() 是选中和取消选中复选框或单选按钮的最简单方法。此方法可用于input[type=checkbox]、input[type=radio] 和[role=checkbox] 元素。

# 选中复选框page.get_by_label('I agree to the terms above').check()# 断言选中状态assert page.get_by_label('Subscribe to newsletter').is_checked() is True# 选择单选按钮page.get_by_label('XL').check()

选择选项 

使用 locator.select_option() 在 <select> 元素中选择一个或多个选项。您可以指定选项值或标签进行选择。可以选择多个选项。

# 单个选项匹配值page.get_by_label('Choose a color').select_option('blue')# 单个选项匹配标签page.get_by_label('Choose a color').select_option(label='Blue')# 选择多个项目page.get_by_label('Choose multiple colors').select_option(['red', 'green', 'blue'])

鼠标点击

执行简单的鼠标点击操作。

# 一般点击page.get_by_role("button").click()# 双击page.get_by_text("Item").dblclick()# 右击page.get_by_text("Item").click(button="right")# Shift + 点击page.get_by_text("Item").click(modifiers=["Shift"])# 鼠标悬停在元素上page.get_by_text("Item").hover()# 点击左上角page.get_by_text("Item").click(position={ "x": 0, "y": 0})

在幕后,这个方法和其他与指针相关的方法:

  • 等待具有给定选择器的元素出现在DOM中

  • 等待它显示出来,即不为空,没有 display:none,没有 visibility:hidden

  • 等待它停止移动,例如,直到 CSS 转换完成

  • 滚动元素到视图中

  • 等待它在操作点接收指针事件,例如等到元素不被其他元素遮挡

  • 如果在上述任何检查期间元素被分离,则重试



强制点击(Forcing the click)

有时,应用程序使用复杂逻辑,悬停在元素上会将其覆盖另一个拦截点击的元素。这种行为与元素被覆盖并将点击派发到其他位置的错误不可区分。如果您知道正在发生这种情况,则可以绕过可操作性检查并强制点击:

page.get_by_role("button").click(force=True)

程序化点击(Programmatic click)

如果您不想在真实条件下测试您的应用程序,并且想以任何可能的方式模拟点击,则可以通过使用 locator.dispatch_event() 在元素上触发 HTMLElement.click() 行为来触发点击事件:

page.get_by_role("button").dispatch_event('click')

输入字符 

像真正的键盘一样,逐个字符地键入字段,使用locator.type()。

# 逐个字符输入page.locator('#area').type('Hello World!')

此方法将发出所有必要的键盘事件,所有的keydown、keyup和keypress事件都会有。你甚至可以指定可选的按键之间的延迟,以模拟真实的用户行为。

注意:大多数时候,page.fill()只需要正常工作。只有在页面上存在特殊的键盘处理时,才需要键入字符。

键和快捷键

# 按Enter键page.get_by_text("Submit").press("Enter")# 发送Control+Rightpage.get_by_role("textbox").press("Control+ArrowRight")# 在键盘上按$符号page.get_by_role("textbox").press("$codeholder_7amp;quot;)

locator.press()方法将选定的元素设置为焦点,并生成一个单独的按键。它接受键盘事件的keyboardEvent.key属性中发出的逻辑键名:

Backquote、Minus、Equal、Backslash、Backspace、Tab、Delete、Escape、 ArrowDown、End、Enter、Home、Insert、PageDown、PageUp、ArrowRight、 ArrowUp、F1 - F12、Digit0 - Digit9、KeyA - KeyZ等。

你也可以指定一个你想要生成的单个字符,如"a"或"#"。还支持以下修改快捷键:Shift、Control、Alt、Meta。简单版本产生一个单个字符。这个字符是大小写敏感的,所以"a"和"A"会产生不同的结果。

# <input id=name>page.locator('#name').press('Shift+A')# <input id=name>page.locator('#name').press('Shift+ArrowLeft')

支持"Control+o"或"Control+Shift+T"等快捷键。当与修饰符一起指定时,修饰符被按下并保持按下状态,同时后续的键被按下。

请注意,你仍然需要指定Shift-A中的大写A来产生大写字符。Shift-a会产生一个小写字母,就像你切换了CapsLock一样。

上传文件 

你可以使用locator.set_input_files()方法选择要上传的输入文件。它希望第一个参数指向类型为"file"的输入元素。可以在数组中传递多个文件。如果某些文件路径是相对的,它们相对于当前工作目录解析。空数组清除所选文件。

# 获取网页元素并聚焦page.get_by_label('password').focus()# 上传文件# 选择单个文件page.get_by_label("Upload file").set_input_files('myfile.pdf')# 选择多个文件page.get_by_label("Upload files").set_input_files(['file1.txt', 'file2.txt'])# 删除所有选中文件page.get_by_label("Upload file").set_input_files([])# 从内存中上传缓冲区page.get_by_label("Upload file").set_input_files(    files=[        {"name": "test.txt", "mimeType": "text/plain", "buffer": b"this is a test"}    ],)# 处理动态页面上的焦点事件page.get_by_label('password').focus()# 拖拽元素page.locator("#item-to-be-dragged").drag_to(page.locator("#item-to-drop-at"))

如果你没有手头上的输入元素(因为它是动态创建的),你可以处理

page.on("filechooser") 事件或者在你的操作上使用相应的等待方法:

with page.expect_file_chooser() as fc_info:    page.get_by_label("Upload file").click()file_chooser = fc_info.valuefile_chooser.set_files("myfile.pdf")

聚焦元素

对于处理聚焦事件的动态页面,你可以使用 locator.focus() 聚焦到给定的元素。

page.get_by_label('password').focus()

拖放

你可以使用 locator.drag_to() 执行拖放操作。此方法将:

1、悬停将被拖动的元素。

2、按下鼠标左键。

3、将鼠标移动到将接收拖放的元素上。

4、释放鼠标左键。

page.locator("#要拖动的项目").drag_to(page.locator("#要放置的项目"))

手动拖放

如果你想精确控制拖放操作,请使用低级别的方法,如 locator.hover()、mouse.down()、mouse.move() 和 mouse.up()。

page.locator("#要拖动的项目").hover()page.mouse.down()page.locator("#要放置的项目").hover()page.mouse.up()

注意:

如果你的页面依赖于 dragover 事件的触发,在所有浏览器中都需要至少两次鼠标移动才能触发它。为了可靠地发出第二个鼠标移动,请将你的 mouse.move() 或 locator.hover() 重复两次。操作序列应为:悬停拖动元素,按下鼠标,悬停放置元素,第二次悬停放置元素,释放鼠标。

每天来学习

视频号直播进行中

如果觉得有帮助,点个赞呗

点击此处查看Playwright系列中文教程

【声明】内容源于网络
0
0
慧测
专注人工智能前沿技术落地企业实战应用
内容 0
粉丝 0
慧测 专注人工智能前沿技术落地企业实战应用
总阅读0
粉丝0
内容0