当使用Selenium的click_and_hold方法时,究竟是什么条件或操作会导致鼠标单击释放?

问题描述 投票:0回答:2

在我的硒测试中,我曾多次在一些元素上使用Selenium的click_and_hold()source code here)方法。源代码使它看起来会无限期地保持按下,但肯定有一些动作,例如简单的点击,导致持有的点击被释放。显然,调用release也会释放持有的点击,但是有没有人能够准确掌握哪些操作/条件(来自脚本或页面本身)会导致持有的点击被释放?

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

selenium selenium-webdriver webdriver action dom-events
2个回答
2
投票

发布()

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

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)来释放修饰符。


4
投票

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

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

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

请记住,selenium只是将操作列表传递给使用JSON有线协议控制浏览器的驱动程序二进制文件。您在代码中使用的命令在通过线路传递之前会被转换为JavaScript操作,因此控制浏览器的驱动程序二进制文件可能没有太多关于原始命令在它们被分解之前的上下文的方式。

© www.soinside.com 2019 - 2024. All rights reserved.