在使用Selenium的click_and_hold方法时,究竟是什么情况或动作导致鼠标单击释放?

时间:2019-03-11 21:48:55

标签: selenium selenium-webdriver webdriver action dom-events

在硒测试中,有几次我决定在某些元素上使用Selenium的click_and_hold()source code here)方法。源代码使它看起来像将无限期地保持按下状态,但是肯定有一些动作(例如简单的单击)会导致释放所保持的单击。显然,调用release也会释放保留的点击,但是是否有人确切地知道什么动作/条件(从脚本或页面本身)将导致释放保留的点击?

我已经链接到python绑定的文档,但是无论使用哪种语言编写脚本,我都认为这是相同的。如果这个假设不正确,请告诉我!

2 个答案:

答案 0 :(得分:4)

通常会导致调用鼠标上移事件的任何操作。

点击将调用鼠标按下事件,然后调用鼠标按下事件(As shown in the Code

Click_and_hold()将仅执行鼠标按下部分。如果您随后调用触发鼠标向上事件的其他任何内容,则将释放鼠标单击。

记住硒只是将动作列表传递给使用JSON Wire协议控制浏览器的驱动程序二进制文件。您在代码中使用的命令在通过网络传递之前先转换为JavaScript操作,因此控制浏览器的二进制驱动程序可能在上下文中与原始命令被破坏之前的内容完全没有关系。

答案 1 :(得分:2)

release()

release(on_element) 在元素上释放一个按住的鼠标按钮。如果on_element None ,则会在当前鼠标位置上释放,定义为:

def release(self, on_element=None):
    """
    Releasing a held mouse button on an element.

    :Args:
     - on_element: The element to mouse up.
       If None, releases on current mouse position.
    """
    if on_element:
            self.move_to_element(on_element)
    if self._driver.w3c:
        self.w3c_actions.pointer_action.release()
        self.w3c_actions.key_action.pause()
    else:
        self._actions.append(lambda: self._driver.execute(Command.MOUSE_UP, {}))
    return self

release()默认由ActionChains实现的不同方法调用。其中一些如下:

  • release():释放元素上的鼠标键。
  • drag_and_drop(source, target):在源元素上按住鼠标左键,然后移动到目标元素并释放鼠标键。
  • drag_and_drop_by_offset(source, xoffset, yoffset):在源元素上按住鼠标左键,然后移至目标偏移并释放鼠标键。

click_and_hold()

click_and_hold()按住元素上的鼠标左键。

因此,您没看错,source code确认将无限期保持按下状态,除非直接release()被直接调用或通过其他方法调用。但是,可能还有其他操作 / 事件,可能会导致按住鼠标左键隐式释放。这些动作 / 事件可以是任何HTML DOM Events的结果。 HTML DOM事件允许 JavaScript / AjaxCalls 在HTML文档中的元素上注册不同的事件处理程序。一些最常遇到的事件是:


key_up()

key_up()方法还释放修饰键。例如:

ActionChains(driver).key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform()

此用例

对于实现click_and_hold()用例没有任何了解,请注意,key_down()是一种执行修改键,并且它不释放修饰键,并且随后的交互可能会假定一直按住。请注意,修饰键从不隐式释放。必须调用key_up(theKey)send_keys(Keys.NULL)才能释放修饰符。