本文翻译整理自:https://www.selenium.dev/documentation/webdriver/actions_api/
文章目录
- 一、行动建设者
- 二、暂停
- 三、释放所有操作
- 四、键盘动作
- 1、钥匙
- 2、钥匙放下
- 3、钥匙打开
- 4、发送钥匙
- 活性元素
- 指定元素
- 5、复制和粘贴
- 五、鼠标动作
- 1、点击并按住
- 2、点击并释放
- 3、备用按钮点击
- 上下文点击
- 后退点击
- 转发点击
- 4、双击
- 5、移动到元素
- 6、偏移移动
- 元素偏移量
- 视口偏移量
- 与当前指针位置的偏移量
- 7、元素上的拖放
- 8、按偏移量拖放
- 六、钢笔动作
- 1、使用钢笔
- 2、添加指针事件属性
- 七、滚轮动作
- 1、滚动到元素
- 2、按给定数量滚动
- 3、从元素滚动给定的量
- 4、从具有偏移量的元素滚动
- 5、从原点(元素)的偏移量滚动给定的量
用于向Web浏览器提供虚拟化设备输入操作的低级界面。
除了高级元素相互作用, 这个动作API提供了对 正是指定的输入设备可以做什么。
Selenium为3种输入源提供接口: 键盘设备的键输入,鼠标、笔或触摸设备的指针输入, 和滚轮设备的滚轮输入(在Selenium 4.2中引入)。
Selenium允许您构建分配给特定 输入并将它们链接在一起并调用相关的执行方法一次执行它们。
一、行动建设者
在从传统的JSON Wire协议到新的W3C WebDriver协议的过程中,操作的低级构建块变得特别详细。
它非常强大,但是每个输入设备都有多种使用方式,如果您需要管理多个设备,您有责任确保它们之间的正确同步。
值得庆幸的是,您可能不需要学习如何直接使用低级命令,因为 几乎所有你可能想做的事情都有一个方便的方法,它结合了 较低级别的命令。
这些都记录在 键盘、鼠标、笔和滚轮页面。
二、暂停
指针移动和滚轮滚动允许用户设置动作的持续时间,但有时您只需要在动作之间等待一拍即可正常工作。
clickable = driver.find_element(By.ID, "clickable")
ActionChains(driver)\.move_to_element(clickable)\.pause(1)\.click_and_hold()\.pause(1)\.send_keys("abc")\.perform()
在GitHub上查看完整示例
三、释放所有操作
需要注意的重要一点是,驱动程序会在整个会话中记住所有输入项的状态。
即使您创建了一个操作类的新实例,按下的键和指针的位置将处于先前执行的操作留给它们的任何状态。
有一种特殊的方法可以释放所有当前按下的键和指针按钮。
此方法在每种语言中的实现方式都不同,因为它不会使用执行方法执行。
ActionBuilder(driver).clear_actions()
在GitHub上查看完整示例
四、键盘动作
用于与网页交互的任何键输入设备的表示。
使用键盘只能完成2个动作:按下一个键和释放一个按下的键。
除了支持ASCII字符之外,每个键盘键都有一个表示,可以按指定的顺序按下或释放。
1、钥匙
除了常规unicode表示的键之外, Unicode值已分配给其他键盘键以与Selenium一起使用。
每种语言都有自己引用这些键的方式;可以找到完整的列表 这里。
使用Python密钥类
2、钥匙放下
ActionChains(driver)\.key_down(Keys.SHIFT)\.send_keys("abc")\.perform()
在GitHub上查看完整示例
3、钥匙打开
ActionChains(driver)\.key_down(Keys.SHIFT)\.send_keys("a")\.key_up(Keys.SHIFT)\.send_keys("b")\.perform()
在GitHub上查看完整示例
4、发送钥匙
这是Actions API中的一种方便方法,它将keyDown和keyUp命令组合在一个操作中。
执行此命令与使用元素方法略有不同,但主要用于需要在其他操作中间键入多个字符时。
活性元素
ActionChains(driver)\.send_keys("abc")\.perform()
在GitHub上查看完整示例
指定元素
text_input = driver.find_element(By.ID, "textInput")
ActionChains(driver)\.send_keys_to_element(text_input, "abc")\.perform()
在GitHub上查看完整示例
5、复制和粘贴
下面是使用上述所有方法进行复制/粘贴操作的示例。
请注意,用于此操作的键将根据它是否是Mac OS而有所不同。
这段代码将以文本结束:SeleniumSelenium!
cmd_ctrl = Keys.COMMAND if sys.platform == 'darwin' else Keys.CONTROLActionChains(driver)\.send_keys("Selenium!")\.send_keys(Keys.ARROW_LEFT)\.key_down(Keys.SHIFT)\.send_keys(Keys.ARROW_UP)\.key_up(Keys.SHIFT)\.key_down(cmd_ctrl)\.send_keys("xvv")\.key_up(cmd_ctrl)\.perform()
在GitHub上查看完整示例
五、鼠标动作
用于与网页交互的任何指针设备的表示。
只有3个动作可以用鼠标完成:按下按钮、释放按下的按钮和移动鼠标。
Selenium提供了以最常见的方式组合这些动作的便捷方法。
1、点击并按住
此方法将鼠标移动到元素的中心与按下鼠标左键相结合。
这对于聚焦特定元素很有用:
clickable = driver.find_element(By.ID, "clickable")
ActionChains(driver)\.click_and_hold(clickable)\.perform()
在GitHub上查看完整示例
2、点击并释放
此方法将移动到元素中心与按下和释放鼠标左键相结合。
这也称为“单击”:
clickable = driver.find_element(By.ID, "click")
ActionChains(driver)\.click(clickable)\.perform()
在GitHub上查看完整示例
3、备用按钮点击
鼠标总共有5个定义的按钮:
- 0-左按钮(默认)
- 1-中间按钮(当前不支持)
- 2-右按钮
- 3-X1(返回)按钮
- 4-X2(前进)按钮
上下文点击
此方法将移动到元素中心与按下和释放鼠标右键(按钮2)相结合。
这也称为“右键单击”:
clickable = driver.find_element(By.ID, "clickable")
ActionChains(driver)\.context_click(clickable)\.perform()
在GitHub上查看完整示例
后退点击
这没有方便的方法,只是按下和释放鼠标按钮3
Selenium v4.2
action = ActionBuilder(driver)
action.pointer_action.pointer_down(MouseButton.BACK)
action.pointer_action.pointer_up(MouseButton.BACK)
action.perform()
在GitHub上查看完整示例
转发点击
这没有方便的方法,只是按下和释放鼠标按钮4
Selenium v4.2
action = ActionBuilder(driver)
action.pointer_action.pointer_down(MouseButton.FORWARD)
action.pointer_action.pointer_up(MouseButton.FORWARD)
action.perform()
在GitHub上查看完整示例
4、双击
此方法将移动到元素中心与按下和释放鼠标左键两次相结合。
clickable = driver.find_element(By.ID, "clickable")
ActionChains(driver)\.double_click(clickable)\.perform()
在GitHub上查看完整示例
5、移动到元素
此方法将鼠标移动到元素的视图中心点。
这也称为“悬停”。
请注意,元素必须在视口中,否则命令将出错。
hoverable = driver.find_element(By.ID, "hover")
ActionChains(driver)\.move_to_element(hoverable)\.perform()
在GitHub上查看完整示例
6、偏移移动
这些方法首先将鼠标移动到指定的原点,然后通过提供的偏移量中的像素数。
请注意,鼠标的位置必须在视口中,否则命令将出错。
元素偏移量
此方法将鼠标移动到元素的视图中心点,然后移动提供的偏移量。
mouse_tracker = driver.find_element(By.ID, "mouse-tracker")
ActionChains(driver)\.move_to_element_with_offset(mouse_tracker, 8, 0)\.perform()
在GitHub上查看完整示例
视口偏移量
此方法将鼠标从当前视口的左上角移动提供的偏移量。
action = ActionBuilder(driver)
action.pointer_action.move_to_location(8, 0)
action.perform()
在GitHub上查看完整示例
与当前指针位置的偏移量
此方法通过用户提供的偏移量将鼠标从当前位置移动。
如果鼠标之前没有移动过,则该位置将在视口的左上角。
请注意,滚动页面时指针位置不会改变。
请注意,第一个参数X指定在为正时向右移动,而第二个参数 Y指定当为正时向下移动。
所以moveByOffset(30, -10)
向右移动30,向上移动10 当前鼠标位置。
ActionChains(driver)\.move_by_offset( 13, 15)\.perform()
在GitHub上查看完整示例
7、元素上的拖放
此方法首先对源元素执行单击并按住,移动到目标元素的位置,然后释放鼠标。
draggable = driver.find_element(By.ID, "draggable")
droppable = driver.find_element(By.ID, "droppable")
ActionChains(driver)\.drag_and_drop(draggable, droppable)\.perform()
在GitHub上查看完整示例
8、按偏移量拖放
此方法首先对源元素执行单击并按住,移动到给定的偏移量,然后释放鼠标。
draggable = driver.find_element(By.ID, "draggable")
start = draggable.location
finish = driver.find_element(By.ID, "droppable").location
ActionChains(driver)\.drag_and_drop_by_offset(draggable, finish['x'] - start['x'], finish['y'] - start['y'])\.perform()
在GitHub上查看完整示例
六、钢笔动作
用于与网页交互的笔指示笔类型的指针输入的表示。
仅Chromium
Pen是一种指针输入,其行为与鼠标基本相同,但也可以具有触控笔独有的事件属性。
此外,虽然鼠标有5个按钮,但笔有3个等效的按钮状态:
- 0-触摸联系人(默认;相当于左键单击)
- 2-桶按钮(相当于右键单击)
- 5-橡皮擦按钮(当前驱动程序不支持)
1、使用钢笔
Selenium v4.2
pointer_area = driver.find_element(By.ID, "pointerArea")
pen_input = PointerInput(POINTER_PEN, "default pen")
action = ActionBuilder(driver, mouse=pen_input)
action.pointer_action\.move_to(pointer_area)\.pointer_down()\.move_by(2, 2)\.pointer_up()
action.perform()
在GitHub上查看完整示例
2、添加指针事件属性
Selenium v4.2
pointer_area = driver.find_element(By.ID, "pointerArea")
pen_input = PointerInput(POINTER_PEN, "default pen")
action = ActionBuilder(driver, mouse=pen_input)
action.pointer_action\.move_to(pointer_area)\.pointer_down()\.move_by(2, 2, tilt_x=-72, tilt_y=9, twist=86)\.pointer_up(0)
action.perform()
在GitHub上查看完整示例
七、滚轮动作
用于与网页交互的滚轮输入设备的表示。
Selenium v4.2
仅Chromium
在页面上滚动有5种场景。
1、滚动到元素
这是最常见的场景。
与传统的单击和发送键方法不同,action类不会自动将目标元素滚动到视图中,因此如果元素尚未在视口中,则需要使用此方法。
此方法将Web元素作为唯一参数。
无论元素是在当前视屏上方还是下方,视口都将滚动,因此元素的底部位于屏幕底部。
iframe = driver.find_element(By.TAG_NAME, "iframe")
ActionChains(driver)\.scroll_to_element(iframe)\.perform()
在GitHub上查看完整示例
2、按给定数量滚动
这是滚动的第二个最常见的场景。
传入增量x和增量y值,表示在右方向和向下方向滚动多少。
负值分别代表左和上。
footer = driver.find_element(By.TAG_NAME, "footer")
delta_y = footer.rect['y']
ActionChains(driver)\.scroll_by_amount(0, delta_y)\.perform()
在GitHub上查看完整示例
3、从元素滚动给定的量
这种情况实际上是上述两种方法的组合。
要执行此操作,请使用“Scroll From”方法,该方法接受3个参数。
第一个表示起始点,我们将其指定为元素,后两个是delta x和delta y值。
如果元素在视口之外,它将滚动到屏幕底部,然后页面将通过提供的增量x和增量y值滚动。
iframe = driver.find_element(By.TAG_NAME, "iframe")
scroll_origin = ScrollOrigin.from_element(iframe)
ActionChains(driver)\.scroll_from_origin(scroll_origin, 0, 200)\.perform()
在GitHub上查看完整示例
4、从具有偏移量的元素滚动
当您只需要滚动屏幕的一部分并且它在视口之外时,使用此方案。
或者在视口内,必须滚动的屏幕部分是远离特定元素的已知偏移量。
这再次使用了“Scroll From”方法,除了指定元素外,还指定了一个偏移量来指示滚动的原点。
偏移量是从提供的元素的中心计算的。
如果元素在视口之外,它首先会滚动到屏幕底部,然后通过将偏移量添加到元素中心的坐标来确定滚动的原点,最后页面将通过提供的增量x和增量y值进行滚动。
请注意,如果元素中心的偏移量落在视口之外,则会导致异常。
footer = driver.find_element(By.TAG_NAME, "footer")
scroll_origin = ScrollOrigin.from_element(footer, 0, -50)
ActionChains(driver)\.scroll_from_origin(scroll_origin, 0, 200)\.perform()
在GitHub上查看完整示例
5、从原点(元素)的偏移量滚动给定的量
当您只需要滚动屏幕的一部分并且它已经在视口内时,将使用最后一个场景。
这再次使用“Scroll From”方法,但指定了视口而不是元素。
从当前视口的左上角指定偏移量。
确定原点后,页面将按提供的增量x和增量y值滚动。
请注意,如果视口左上角的偏移量落在屏幕之外,则会导致异常。
scroll_origin = ScrollOrigin.from_viewport(10, 10)ActionChains(driver)\.scroll_from_origin(scroll_origin, 0, 200)\.perform()
在GitHub上查看完整示例
2024-06-17(一)