代码之家  ›  专栏  ›  技术社区  ›  C. Peck

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

  •  0
  • C. Peck  · 技术社区  · 5 年前

    我在硒测试中有过几次决定使用硒 click_and_hold() ( source code here )方法。源代码使它看起来像是无限期地保持按下状态,但肯定有一些操作,例如简单的单击,会导致保持的单击被释放。显然是打电话来的 release 也将释放保留的单击,但是否有人确切了解哪些操作/条件(来自脚本或页面本身)将导致释放保留的单击?

    我已经链接到了Python绑定的文档,但是我假设不管使用什么语言来编写脚本,这都是相同的。如果这个假设不正确,请告诉我!

    0 回复  |  直到 5 年前
        1
  •  2
  •   undetected Selenium    5 年前

    释放()

    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 实施。其中一些如下:

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

    单击“保持”()

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

    所以你看得很对, source code 确认它将无限期地保持按下状态,除非 释放() 直接调用或通过其他方法调用。但是还有其他的 行动 / 事件 这可能导致 按住鼠标左键 成为 隐式释放 . 这些 行动 / 事件 可能是任何 HTML DOM Events . HTML DOM事件允许 javascript / 阿贾克斯球 在HTML文档中的元素上注册不同的事件处理程序。一些最常遇到的事件是:


    键上移()

    这个 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) 必须调用以释放修饰符。

        2
  •  4
  •   Ardesco Dmitri T    5 年前

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

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

    单击_和_hold()将只执行鼠标向下部分。如果您随后调用任何其他触发鼠标向上移动事件的方法,则将释放鼠标单击。

    记住,Selenium只是将一系列操作传递给驱动程序二进制文件,驱动程序二进制文件使用JSON Wire协议控制浏览器。您在代码中使用的命令在通过连接之前被转换为javascript操作,因此控制浏览器的驱动程序二进制文件可能没有太多与原始命令完全相同的上下文。