Playwright系列(9):常见操作HTML 元素方式

简介: Playwright系列(9):常见操作HTML 元素方式

大家好,我是阿萨。Playwright 可以和HTML 输入控件进行交互。比如文本框,复选框,单选框,按钮,下拉框等控件 。它可以输入文本,选择选项,鼠标点击,敲字符或者快捷键,上传文件也可以。今天就详细列举常见HTML 远速速操作方式。


文本框


使用 locator.fill(value, **kwargs) 方式是最快填充内容的函数。它首先把光标放到一个元素上,人然后触发输入时间并且输入文本。 它对控件输入框,多行文本框,或者可编辑内容的元素都可以快速生效。

同步代码:


# 文本输入page.get_by_role("textbox").fill("阿萨")# 日期输入page.get_by_label("Birth date").fill("2020-02-02")# 时间输入page.get_by_label("Appointment time").fill("13:15")# 日期和时间时输入page.get_by_label("Local time").fill("2020-03-02T05:15")

异步代码:

# 文本输入await page.get_by_role("textbox").fill("阿萨")
# 日期输入await page.get_by_label("Birth date").fill("2020-02-02")
# 时间输入await page.get_by_label("Appointment time").fill("13:15")
# 当地日期和时间输入await page.get_by_label("Local time").fill("2020-03-02T05:15")
复选框和单选框

使用 locator.set_checked(checked, **kwargs)方法可以选中或者取消选中一个复选框或者单选框。这个方式可以用在复选框,单选框等元素上。

同步代码:


# 选中复选框page.get_by_label('我同意以上内容').check()#校验复选状态assert page.get_by_label('订阅更新').is_checked() is True# 选择单选框page.get_by_label('XL').check()


异步代码:

# 选中复选框await page.get_by_label('我同意以上内容').check()
# 校验复选状态assert await page.get_by_label('订阅更新').is_checked() is True
# 选择单选框await page.get_by_label('XL').check()


下拉框


在下拉框里选择选项可以用方法 locator.select_option(**kwargs)。它可以指定选项值,或者标签来选择值。同时支持多选。

同步代码:


# Single selection matching the valuepage.get_by_label('Choose a color').select_option('blue')# Single selection matching the labelpage.get_by_label('Choose a color').select_option(label='Blue')# Multiple selected itemspage.get_by_label('Choose multiple colors').select_option(['red', 'green', 'blue'])


异步代码:


# Single selection matching the valueawait page.get_by_label('Choose a color').select_option('blue')
# Single selection matching the labelawait page.get_by_label('Choose a color').select_option(label='Blue')
# Multiple selected itemsawait page.get_by_label('Choose multiple colors').select_option(['red', 'green', 'blue'])


鼠标点击


执行点击操作。

同步代码:


# Generic clickpage.get_by_role("button").click()# Double clickpage.get_by_text("Item").dblclick()# Right clickpage.get_by_text("Item").click(button="right")# Shift + clickpage.get_by_text("Item").click(modifiers=["Shift"])# Hover over elementpage.get_by_text("Item").hover()# Click the top left cornerpage.get_by_text("Item").click(position={ "x": 0, "y": 0})


异步代码:


# Generic clickawait page.get_by_role("button").click()
# Double clickawait page.get_by_text("Item").dblclick()
# Right clickawait page.get_by_text("Item").click(button="right")
# Shift + clickawait page.get_by_text("Item").click(modifiers=["Shift"])
# Hover over elementawait page.get_by_text("Item").hover()
# Click the top left cornerawait page.get_by_text("Item").click(position={ "x": 0, "y": 0})


在底层,这个方法和其他与指针相关的方法的底层处理逻辑是:

  • 等待具有给定选择器的元素进入DOM
  • 等待它显示,即非空,无显示:none,无可见性:隐藏
  • 等待它停止移动,例如,直到CSS过渡完成
  • 滚动元素进入可见区域
  • 等待它在操作点接收指针事件,例如,等待直到元素变得不被其他元素遮挡
  • 如果在上述任何检查期间分离了元素,则重试


强制点击


有时,应用程序使用非平凡的逻辑,悬停元素会覆盖另一个元素,以拦截单击。这种行为与元素被覆盖并且点击被分派到其他地方的bug没有什么区别。如果你知道发生了这种情况,你可以绕过操作检查并强制点击:

同步代码:


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

异步代码:

await page.get_by_role("button").click(force=True)
程序化的点击
如果你不想在真实情况下测试你的应用程序,而想用任何可能的方法来
模拟点击,你可以通过在具有定位器的元素上分派一个点击事件locator.dispatch_event(type, **kwargs):来触发HTMLElement.click()行为
同步代码:
page.get_by_role("button").dispatch_event('click')
异步代码:
await page.get_by_role("button").dispatch_event('click')
输入字符


使用该方法 locator.type(text, **kwargs) 给指定控件输入字符。

同步代码:

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


异步代码:

# Type character by characterawait page.locator('#area').type('Hello World!')
这个方法会触发所有必要的键盘事件,包括keydown、keyup和keypress事件。甚至可以指定可选的按键之间的延迟,以模拟真实的用户行为。
请注意
大多数时候,page.fill(selector, value, **kwargs)都可以正常工作。如果
页面上有特殊的键盘操作,您只需要键入字符。


快捷键


同步代码:


# Hit Enterpage.get_by_text("Submit").press("Enter")# Dispatch Control+Rightpage.get_by_role("textbox").press("Control+ArrowRight")# Press $ sign on keyboardpage.get_by_role("textbox").press("$")

异步代码:


# Hit Enterawait page.get_by_text("Submit").press("Enter")
# Dispatch Control+Rightawait page.get_by_role("textbox").press("Control+ArrowRight")
# Press $ sign on keyboardawait page.get_by_role("textbox").press("$")


locator.press(key, **kwargs)方法聚焦所选元素并生成单个击键。它接受keyboardEvent中发出的逻辑键名。□键盘事件的Key属性:反引号,减,等于,反斜杠,退格,制表符,删除,转义,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')


异步代码:

# <input id=name>await page.locator('#name').press('Shift+A')
# <input id=name>
await page.locator('#name').press('Shift+ArrowLeft')
也支持“Control+o”或“Control+Shift+T”等快捷键。当用修饰符指定时,修饰符被按下,并且在按下下一个键时保持不变。 
注意,要生成大写字符,仍然需要在Shift-A中指定大写字母A。Shift-a会生成一个小写字母,就像切换了大写字母一样。 
上传文件 
你可以使用locator.set_input_files(files, **kwargs)选择输入文件上传。
它期望第一个参数指向类型为"file"的输入元素。
可以在数组中传递多个文件。如果一些文件路径是相对的,它们将相对于
当前工作目录进行解析。清空选中的文件。

同步代码:


# Select one filepage.get_by_label("Upload file").set_input_files('myfile.pdf')# Select multiple filespage.get_by_label("Upload files").set_input_files(['file1.txt', 'file2.txt'])# Remove all the selected filespage.get_by_label("Upload file").set_input_files([])# Upload buffer from memorypage.get_by_label("Upload file").set_input_files(    files=[        {"name": "test.txt", "mimeType": "text/plain", "buffer": b"this is a test"}    ],)


异步代码:

# Select one fileawait page.get_by_label("Upload file").set_input_files('myfile.pdf')
# Select multiple filesawait page.get_by_label("Upload files").set_input_files(['file1.txt', 'file2.txt'])
# Remove all the selected filesawait page.get_by_label("Upload file").set_input_files([])
# Upload buffer from memoryawait page.get_by_label("Upload file").set_input_files(    files=[        {"name": "test.txt", "mimeType": "text/plain", "buffer": b"this is a test"}    ],
)
如果手头没有input元素(它是动态创建的),可以处理page.on("filechooser")事件,或者在操作时使用相应的等待方法:


同步代码:


with page.expect_file_chooser() as fc_info:    page.locator("upload").click()file_chooser = fc_info.valuefile_chooser.set_files("myfile.pdf")

异步代码:

async with page.expect_file_chooser() as fc_info:    await page.locator("upload").click()file_chooser = await fc_info.value
await file_chooser.set_files("myfile.pdf")
让元素获得焦点

对于处理焦点事件的动态页面,可以用焦点来聚焦给定的元素locator.focus(**kwargs)。


同步代码:


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



异步代码:


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


拖放


你可以使用 locator.drag_to(target, **kwargs)进行拖放操作。这个方法将:

  • 将要拖动的元素悬停。
  • 按鼠标左键。
  • 将鼠标移动到将要接收放入的元素上。
  • 松开鼠标左键。


同步代码:


page.locator("#item-to-be-dragged").drag_to(page.locator("#item-to-drop-at"))


异步代码:


await page.locator("#item-to-be-dragged").drag_to(page.locator("#item-to-drop-at"))


手动拖拽


如果你想精确控制拖动操作,可以使用更低级别的方法,比如 locator.hover(**kwargs), mouse.down(**kwargs), mouse.move(x, y, **kwargs) 和 mouse.up(**kwargs).

同步代码:


page.locator("#item-to-be-dragged").hover()page.mouse.down()page.locator("#item-to-drop-at").hover()page.mouse.up()


异步代码:


 
await page.locator("#item-to-be-dragged").hover()await page.mouse.down()await page.locator("#item-to-drop-at").hover()await page.mouse.up()


请注意

如果页面依赖于dragover事件被分派,那么在所有浏览器中至少需要两次鼠标移动才能触发该事件。为了可靠地发出第二次鼠标移动,重复方法mouse.move(x, y, **kwargs) 或者 locator.hover(**kwargs)两次。操作的顺序是:鼠标悬停拖动元素,鼠标向下,鼠标悬停放置元素,鼠标第二次悬停放置元素,鼠标向上。

如果觉得阿萨的内容对你有帮助,欢迎围观点赞。

相关文章
|
1月前
|
移动开发 开发者 UED
HTML5 语义元素详解
HTML5引入了诸多语义元素
WK
|
1月前
|
存储 移动开发 前端开发
HTML5新增了哪些其他元素和属性
这段文字介绍了HTML5中新增的多种元素和属性,包括页面布局元素如header、nav等,表单元素如email、tel输入框等,以及其他元素如canvas、svg等。此外,还介绍了全局及表单属性,例如contenteditable、placeholder等,这些新功能显著增强了HTML5在现代网页设计与开发中的实用性与灵活性。
WK
46 1
|
2月前
|
JavaScript 前端开发 容器
用HTML DOM实现有条件地渲染网页元素(上)
用HTML DOM实现有条件地渲染网页元素(上)
|
2月前
|
存储 JavaScript 前端开发
用HTML DOM实现有条件地渲染网页元素(下)
用HTML DOM实现有条件地渲染网页元素(下)
|
10天前
HTML 元素
HTML文档由HTML元素定义,元素包括开始标签、内容和结束标签。某些元素内容为空,可在开始标签中关闭。大多数元素可拥有属性,且元素间可相互嵌套,形成复杂结构。
|
2月前
|
移动开发 前端开发 HTML5
Twaver-HTML5基础学习(8)拓扑元素(Element)_网元(Element)、节点(Node)
本文介绍了Twaver HTML5中的拓扑元素(Element),包括网元(Element)、节点(Node)和连线(Link)的基本概念和使用方法。文章详细解释了Element的属性和方法,并通过示例代码展示了如何在React组件中创建节点、设置节点属性和样式。
37 1
Twaver-HTML5基础学习(8)拓扑元素(Element)_网元(Element)、节点(Node)
|
2月前
|
移动开发 前端开发 JavaScript
Twaver-HTML5基础学习(7)Layer图层元素
本文介绍了Twaver HTML5中的图层元素(Layer),包括图层的属性和使用方法。文章详细解释了如何创建图层、设置图层属性(如可见性、可编辑性、可移动性和可旋转性),并通过示例代码展示了如何在React组件中使用图层。
32 1
Twaver-HTML5基础学习(7)Layer图层元素
|
2月前
|
移动开发 JavaScript 前端开发
Twaver-HTML5基础学习(6)告警元素(Alarm)闪烁效果
本文介绍了在Twaver HTML5中如何为告警元素(Alarm)创建闪烁效果,以提醒用户注意。文章通过示例代码展示了如何通过定时器间隔性地改变告警标签的颜色,从而实现闪烁提示效果。
35 1
Twaver-HTML5基础学习(6)告警元素(Alarm)闪烁效果
|
2月前
|
移动开发 前端开发 HTML5
Twaver-HTML5基础学习(2)基本数据元素(Data)
本文介绍了Twaver HTML5中的基本数据元素,包括Data、Element、Alarm和Layer等,它们分别用来描述拓扑的网元、告警和图层。文章详细解释了Data类的基本属性和方法,并提供了如何在React组件中使用Twaver创建节点和连线的示例代码。
41 1
Twaver-HTML5基础学习(2)基本数据元素(Data)
|
1月前
|
移动开发 数据安全/隐私保护 UED
HTML5 表单元素详解
HTML5 引入了新的表单元素和属性,如 `&lt;form&gt;、&lt;input&gt;、&lt;textarea&gt;、&lt;select&gt;` 和 `&lt;button&gt;`,以及 `required、min、max` 等属性,增强了表单的创建与交互。其中,`&lt;input&gt;` 支持多种类型如 `email、url、date` 等,提供了更好的用户体验和数据验证。此外,HTML5 还新增了原生表单验证功能,简化了开发流程并提升了安全性。