Невозможно использовать команду mouse_down_at в Selenium

Я занят UI-автоматизацией приложения, где можно сделать рисунок в стиле, сравнимом с Paint-приложением. В тестируемом приложении эта область создается с помощью элемента canvas.

Моя цель - сделать своего рода рисунок на этом холсте с помощью Selenium и Robot Framework, например. как нарисовать линию:

  1. нажатие мыши на определенную позицию
  2. мышь перемещается в новую позицию
  3. отпустить мышь в новой позиции

В официальной документации библиотеки Selenium2Library для Robot Framework я увидел, что нет ключевого слова, которое соответствует моим потребностям (ключевое слово «Щелкните элемент по координатам» не работает). Однако с помощью поиска я обнаружил, что является ключевым словом 'mouse_down_at', но это ключевое слово недоступно в стандартной среде Robot Framework. Однако ключевое слово «mouse_down_at» присутствует в файле selenium.py, который находится в папке Selenium (сайт-пакеты Python).

Теперь я ищу способ получить доступ к этому ключевому слову «mouse_down_at» в Robot Framework. Я уже пытался сам написать библиотеку-оболочку вокруг этого, но пока безуспешно.


person Tornado    schedule 11.11.2013    source источник


Ответы (1)


Вы можете создать свою собственную версию Selenium2Library и использовать ее вместо стандартной Selenium2Lib. Что-то вроде этого:

from Selenium2Library import Selenium2Library
from selenium.webdriver.common.action_chains import ActionChains

class Selenium2Improved(Selenium2Library):
    '''Sometimes Selenium2Library just dont go far enough.'''

    def __init__(self, timeout=5.0, implicit_wait=0.0, run_on_failure='Capture Page Screenshot'):
        super(Selenium2Improved, self).__init__()

    def mouse_down_at(self, locator, coordx, coordy):
        element = self._element_find(locator, True, False)
        if element is None:
            raise AssertionError("ERROR: Element %s not found." % (locator))
        ActionChains(self._current_browser()).move_to_element(element).move_by_offset(coordx, coordy).click_and_hold().perform()

    def mouse_up_at(self, locator, coordx, coordy):
        element = self._element_find(locator, True, False)
        if element is None:
            raise AssertionError("ERROR: Element %s not found." % (locator))
        ActionChains(self._current_browser()).move_to_element(element).move_by_offset(coordx, coordy).release().perform()
person Harri    schedule 12.11.2013
comment
Привет Харри, большое спасибо за ваш ответ. Благодаря вашему коду я смог заставить свой текст работать. Небольшой сбой в том, что вы на самом деле не видите движения курсора мыши, но тест проходит. Коллега сказал мне, что видел такое поведение раньше. - person Tornado; 12.11.2013
comment
У ваших коллег память правильная. С SeleniumLibrary (той, которая использовала Selenium Remote Controller API) вы могли бы сделать что-то вроде Call Selenium API mouseDownAt element coordx,coordy, а затем то же самое для mouseUpAt, и браузер выполнил бы Javascript, который переместил бы курсор, и вы действительно могли бы видеть движение курсора (хотя это было действительно глючно). Selenium2Library (использует WebDriver API) работает иначе и не имеет ключевого слова Call Selenium API. - person Harri; 12.11.2013