0


Selenium ActionChains

Actions接口

用于向 Web 浏览器提供虚拟化设备输入操作的低级接口.

除了高级元素交互之外, Actions 接口 还提供了对指定输入设备 可以执行的确切操作的精细控制. Selenium为3种输入源提供了接口: 键盘设备的键输入, 鼠标, 笔或触摸设备的输入, 以及滚轮设备的滚轮输入 (在Selenium 4.2中引入). Selenium允许您构建分配给特定输入的独立操作命令, 会将他们链接在一起, 并调用关联的执行方法以一次执行它们.

Action构造器

在从遗留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()

释放所有Actions

需要注意的重要一点是, 驱动程序会记住整个会话中所有输入项的状态. 即使创建actions类的新实例, 按下的键和指针的位置 也将处于以前执行的操作离开它们的任何状态.

有一种特殊的方法来释放所有当前按下的键和指针按钮. 此方法在每种语言中的实现方式不同, 因为它不会使用perform方法执行.

    ActionBuilder(driver).clear_actions()

键盘操作

一种适用于任何与网页交互的按键输入设备的表现形式.

只有 2 个操作可以使用键盘完成: 按下某个键,以及释放一个按下的键. 除了支持 ASCII 字符外,每个键盘按键还具有 可以按特定顺序按下或释放的表现形式.

按键

除了由常规unicode表示的按键, 其他键盘按键被分配了一些unicode值以用于操作Selenium 每种语言都有自己的方式来援引这些按键; 这里 可以找到完整列表

Python Keys class

按下按键

    ActionChains(driver)\
        .key_down(Keys.SHIFT)\
        .send_keys("abc")\
        .perform()

释放按键​​​​​​​​​​​​​​

    ActionChains(driver)\
        .key_down(Keys.SHIFT)\
        .send_keys("a")\
        .key_up(Keys.SHIFT)\
        .send_keys("b")\
        .perform()

键入

这是Actions API的一种便捷方法, 它将 keyDown 和 keyUp 命令组合在一个操作中. 执行此命令与使用 element 方法略有不同, 但这主要用于,需要在其他操作之间键入多个字符时使用.

活跃元素​​​​​​​​​​​​​​

    ActionChains(driver)\
        .send_keys("abc")\
        .perform()

指定元素​​​​​​​​​​​​​​

    text_input = driver.find_element(By.ID, "textInput")
    ActionChains(driver)\
        .send_keys_to_element(text_input, "abc")\
        .perform()

复制粘贴

下面是使用上述所有方法执行复制/粘贴操作的示例. 请注意, 用于此操作的键位会有所不同, 具体取决于它是否是 Mac OS. 此代码将以文本收尾:

SeleniumSelenium!

​​​​​​​​​​​​​​

    cmd_ctrl = Keys.COMMAND if sys.platform == 'darwin' else Keys.CONTROL

    ActionChains(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()

鼠标操作

用于与网页交互的任何指针设备的表示。

鼠标只能完成3个动作:按下按钮、释放按下的按钮和移动鼠标。Selenium提供了方便的方法,这些方法以最常见的方式结合了这些操作。

单击并按住

此方法将鼠标移动到元素的中心与按下鼠标左键相结合。这对于聚焦特定元素非常有用:​​​​​​​​​​​​​​

    clickable = driver.find_element(By.ID, "clickable")
    ActionChains(driver)\
        .click_and_hold(clickable)\
        .perform()

单击并释放

此方法将移动到元素的中心与按住并释放鼠标左键相结合。这也被称为“点击”:​​​​​​​​​​​​​

    clickable = driver.find_element(By.ID, "click")
    ActionChains(driver)\
        .click(clickable)\
        .perform()

交替单击按钮

鼠标总共有5个定义的按钮:
0-左键(默认)
1-中间按钮(当前不支持)
2-右按钮
3-X1(后退)按钮
4-X2(前进)按钮

上下文单击

此方法将移动到元素的中心与按下和释放鼠标右键(按钮2)相结合。这也被称为“右键单击”:​​​​​​​

    clickable = driver.find_element(By.ID, "clickable")
    ActionChains(driver)\
        .context_click(clickable)\
        .perform()

点击后退

没有方便的方法,只是按下并释放鼠标按钮3​​​​​​​​​​​​​​

Selenium v4.2

    action = ActionBuilder(driver)
    action.pointer_action.pointer_down(MouseButton.BACK)
    action.pointer_action.pointer_up(MouseButton.BACK)
    action.perform()

点击前进

没有方便的方法,只是按下并释放鼠标按钮4​​​​​​​​​​​​​​

​​​​​​​Selenium v4.2

    action = ActionBuilder(driver)
    action.pointer_action.pointer_down(MouseButton.FORWARD)
    action.pointer_action.pointer_up(MouseButton.FORWARD)
    action.perform()

双击

此方法将移动到元素的中心与按下并释放鼠标左键两次相结合。​​​​​​​

    clickable = driver.find_element(By.ID, "clickable")
    ActionChains(driver)\
        .double_click(clickable)\
        .perform()

移到元素

此方法将鼠标移动到元素的视图中心点。这也被称为“悬停”。请注意,元素必须在视口中,否则命令将出错。​​​​​​​

    hoverable = driver.find_element(By.ID, "hover")
    ActionChains(driver)\
        .move_to_element(hoverable)\
        .perform()

按偏移量移动

这些方法首先将鼠标移动到指定的原点,然后移动所提供偏移中的像素数。请注意,鼠标的位置必须在视口中,否则命令将出错。

与元素的偏移

此方法将鼠标移动到元素的视图中心点,然后按提供的偏移量移动。​​​​​​​​​​​​​​

    mouse_tracker = driver.find_element(By.ID, "mouse-tracker")
    ActionChains(driver)\
        .move_to_element_with_offset(mouse_tracker, 8, 0)\
        .perform()

与视口的偏移

此方法将鼠标从当前视口的左上角移动所提供的偏移量。

    action = ActionBuilder(driver)
    action.pointer_action.move_to_location(8, 0)
    action.perform()

与当前指针位置的偏移

此方法将鼠标从其当前位置移动用户提供的偏移量。如果以前没有移动过鼠标,则该位置将位于视口的左上角。请注意,当页面滚动时,指针位置不会改变。
请注意,第一个参数X指定在为正时向右移动,而第二个参数Y指定在为负时向下移动。因此,moveByOffset(30,-10)从当前鼠标位置向右移动30,向上移动10。

    ActionChains(driver)\
        .move_by_offset( 13, 15)\
        .perform()

在元素上拖放

该方法首先在源元素上单击并按住,移动到目标元素的位置,然后释放鼠标。

    draggable = driver.find_element(By.ID, "draggable")
    droppable = driver.find_element(By.ID, "droppable")
    ActionChains(driver)\
        .drag_and_drop(draggable, droppable)\
        .perform()

按偏移拖放

此方法首先在源元素上单击并按住,移动到给定的偏移量,然后释放鼠标

    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()

滚轮动作

用于与网页交互的滚轮输入设备的表示。

Selenium v4.2

Chromium Only

在一个页面上滚动有5种情况。

滚动到元素

这是最常见的情况。与传统的单击并发送关键帧方法不同,动作类不会自动将目标元素滚动到视图中,因此如果元素还不在视口中,则需要使用此方法。
此方法将web元素作为唯一参数。
无论元素是在当前视图屏幕的上方还是下方,视口都将滚动,因此元素的底部位于屏幕的底部。

    iframe = driver.find_element(By.TAG_NAME, "iframe")
    ActionChains(driver)\
        .scroll_to_element(iframe)\
        .perform()

按给定数量滚动

这是第二种最常见的滚动场景。输入一个delta x和delta y值,以确定向右和向下滚动的量。负值分别表示向左和向上。

    footer = driver.find_element(By.TAG_NAME, "footer")
    delta_y = footer.rect['y']
    ActionChains(driver)\
        .scroll_by_amount(0, delta_y)\
        .perform()

从一个元素滚动给定的量

这个场景实际上是上述两种方法的结合。
要执行此操作,请使用“Scroll From”方法,该方法需要3个参数。第一个表示原点,我们将其指定为元素,第二个表示delta x和delta y值。
如果元素在视口之外,它将滚动到屏幕底部,然后页面将按提供的delta x和delta 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()

从具有偏移的元素滚动

当您只需要滚动屏幕的一部分,并且屏幕位于视口之外时,将使用此场景。或者在视口内,并且屏幕上必须滚动的部分与特定元素的偏移量已知。
这再次使用“Scroll From”方法,除了指定元素外,还指定了一个偏移量来指示滚动的原点。偏移是从所提供元素的中心开始计算的。
如果元素在视口之外,它将首先滚动到屏幕底部,然后通过将偏移量添加到元素中心的坐标来确定滚动的原点,最后通过提供的delta x和delta 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()

从原点(元素)的偏移量滚动给定的量

当您只需要滚动屏幕的一部分,并且屏幕已经在视口中时,将使用最后的场景。
这将再次使用“从滚动”方法,但指定的是视口而不是元素。从当前视口的左上角指定偏移。确定原点后,页面将滚动所提供的delta x和delta y值。
请注意,如果与视口左上角的偏移位于屏幕之外,则会导致异常。

    scroll_origin = ScrollOrigin.from_viewport(10, 10)

    ActionChains(driver)\
        .scroll_from_origin(scroll_origin, 0, 200)\
        .perform()
标签: selenium

本文转载自: https://blog.csdn.net/TalorSwfit20111208/article/details/131426328
版权归原作者 知识的宝藏 所有, 如有侵权,请联系我们删除。

“Selenium ActionChains”的评论:

还没有评论