При использовании метода click_and_hold от Selenium, какие именно условия или действия вызывают отпускание мыши? - PullRequest
0 голосов
/ 12 марта 2019

У меня было несколько случаев в моих тестах на селен, когда я решил использовать метод click_and_hold() ( здесь ) Selenium для некоторого элемента.Исходный код заставляет его выглядеть так, как будто он будет нажиматься бесконечно, но есть определенные действия, такие как простой щелчок, который приводит к отпусканию удерживаемого щелчка.Очевидно, что вызов release также освободит удерживаемый щелчок, но кто-нибудь знает, какие именно действия / условия (из сценария или самой страницы) приведут к освобождению удерживаемого щелчка?

IЯ связался с документацией для привязок Python, но я предполагаю, что это будет то же самое, независимо от того, какой язык используется для написания скрипта.Пожалуйста, дайте мне знать, если это предположение неверно!

Ответы [ 2 ]

4 голосов
/ 22 марта 2019

Как правило, любое действие, в результате которого вызывается событие «вверх» мыши.

Клик вызовет событие нажатия мыши, а затем событие повышения мыши ( Как показано в коде )

Click_and_hold () будет выполнять только нижнюю часть мыши. Если вы затем вызовете что-нибудь еще, что вызовет событие «вверх», щелчок будет отпущен.

Помните, что selenium просто передает список действий двоичному файлу драйвера, который управляет браузером с помощью проводного протокола JSON. Команды, которые вы используете в коде, перед передачей по проводам преобразуются в действия JavaScript, поэтому двоичный файл драйвера, управляющий браузером, вероятно, не имеет особого смысла в контексте того, какими были исходные команды до их разбивки.

2 голосов
/ 22 марта 2019

выпуск ()

отпустить (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 () удерживает левую кнопку мыши на элементе.

Итак, вы все правильно поняли, исходный код подтверждает то же самое, что он будет оставаться нажатым бесконечно, пока release() не будет напрямую вызван или вызван другими методами. Однако могут быть другие действия / события , которые могут привести к тому, что нажатой левой кнопкой мыши будет неявно отпущено . Эти действия / события могут быть результатом любого из HTML DOM Events . События HTML DOM позволяют JavaScript / AjaxCalls регистрировать различные обработчики событий для элементов в документе HTML. Некоторые из наиболее часто встречающихся событий:

  • HTML DOM UiEvent : события, которые запускаются из пользовательского интерфейса, принадлежат объекту UiEvent.
    • Событие onload : Событие onload происходит, когда объект загружен.
    • Событие onresize : Событие onresize наступает при изменении размера окна браузера.
    • Событие onscroll : Событие onscroll наступает при прокрутке полосы прокрутки элемента.
  • HTML DOM FocusEvent : События, которые происходят, когда элементы получают или теряют фокус, принадлежат объекту FocusEvent.
  • Объект события : Все объекты события в DOM основаны на объекте события.
    • Событие onchange : Событие onchange наступает при изменении значения элемента.
  • HTML DOM MouseEvent : события, которые происходят, когда мышь взаимодействует с документом HTML, принадлежат объекту MouseEvent.
    • Событие onmousedown : Событие onmousedown наступает, когда пользователь нажимает кнопку мыши над элементом.
    • Событие onmouseup : Событие onmouseup возникает, когда пользователь отпускает кнопку мыши над элементом.
  • HTML DOM DragEvent : События, которые происходят, когда элементы перетаскиваются и / или удаляются, принадлежат объекту DragEvent.
    • Событие ondrag : Событие ondrag наступает при перетаскивании выделенного элемента или текста.
    • Событие ondragstart : Событие ondragstart наступает, когда пользователь начинает перетаскивать выделенный элемент или текст.
  • HTML DOM TransitionEvent : события, которые происходят при выполнении CSS-перехода, принадлежат объекту TransitionEvent.
    • transitionend Event : Событие происходит после завершения CSS-перехода

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) должны быть вызваны для освобождения модификатора.

...