Имитация человека, выделяющего текст с помощью Java Selenium Webdriver

#javascript #java #webdriver

#javascript #java #webdriver

Вопрос:

Для автоматизированного теста я пытаюсь имитировать пользователя, нажимающего на некоторый текст, перемещающего указатель мыши несколько раз, затем отпускающего кнопку мыши.

Когда я делаю это как пользователь, я вижу выделенный текст (выделенный), и выделение перемещается указателем мыши.

Когда я делаю это с помощью Selenium, я не вижу … ничего.

Вот пример кода. Страница, над которой я работаю, имеет тег span, окружающий каждое слово текста, поэтому у каждого слова есть свой собственный веб-элемент. StartSelect и endSelect являются двумя такими веб-элементами.

     public void doSomeMouseStuff() throws InterruptedException {
        Actions actions = new Actions(getDriver());

        actions
        .moveToElement(startSelect)
        .clickAndHold()
        .perform();

        actions
        .moveToElement(endSelect)
        .perform();

        try {
            WebDriverWait wait = new WebDriverWait(getDriver(), 5, 1000);
            wait.until(Predicates.<WebDriver> alwaysFalse());
        }
        catch(TimeoutException e) {
            //Ignore the timeout.  It's what we *want* to happen.
        }

        actions
        .release()
        .perform();
    }
  

Я думал о внедрении Javascript для выделения текста, но это упускает главное; позже страница будет выполнять какие-то действия с помощью этих щелчков мыши и перетаскиваний, и мой тест должен выглядеть как пользователь, щелкающий и перетаскивающий.

Как я могу заставить Webdriver фактически имитировать выбор текста пользователем?

Комментарии:

1. Попробуйте все действие в одной строке, как actions.moveToElement(startSelect).clickAndHold().moveToElement(endSelect).release().perform() и посмотрите, может быть, это работает..

2. Помещение всех действий в одну строку также не выделяет текст.

Ответ №1:

Насколько я могу судить, Webdriver не взаимодействует с браузером так, как это сделал бы пользователь, поэтому выделение текста с его помощью исключено.

С другой стороны, внедрив на страницу несколько прослушивателей событий Javascript, я смог определить, что Webdriver действительно запускает соответствующие события Javascript.

Поскольку наша функция будет использовать события Javascript для управления своим поведением, этот результат достаточно хорош, и я могу продолжить.

Спасибо всем за помощь.

Ответ №2:

может быть немного сложнее, и это может не сработать, но стоит попробовать

подумайте об использовании этих двух методов

moveToElement(WebElement toElement, int xOffset, int yOffset)

moveByOffset(int xOffset, int yOffset)

получаем смещение startElement, получаем смещение endElement, вам нужно вычислить требуемое смещение между startElement и endElement

 action.moveToElement(startSelect).clickAndHold()
.moveByOffset()//you need to input the x, y you calculate previously yourself here
.moveByOffset()
.moveByOffset()
.moveByOffset()
.moveByOffset()
.moveByOffset()
.moveToElement(endSelect)
.release()
.build()
.perform();