t.me/atinfo_chat Telegram группа по автоматизации тестирования

Нужна помощь в позиционировании слов в тексте через Selenium/Selenide. Узнать их (x, y) для doubleClick()

Теги: #<Tag:0x00007f9b02ed1df0> #<Tag:0x00007f9b02ed1ad0>

Здравствуйте.

Назрел такой вопрос: скажем, есть < p > с текстом. Нужно каким-то образом узнать точную позицию (не обязательно прям точную), но хотя бы с точностью до первого символа слова из этого текста.
Далее нужно произвести doubleClick() на этом слове чтобы оно выделилось целиком.
После выделения слова возникает маленький popup с неким функционалом.
Есть ли возможность у селениума/селенида справиться с такой задачей ?

Накидал такой код:

SelenideElement h2 = $("#demo h2"); // Тут я просто хочу 2 раза кликнуть по h2 заголовку
Robot robot = new Robot();
Point point = h2.getCoordinates().inViewPort();
 // robot.mouseMove(point.x + 50, point.y + 110);
new Actions(WebDriverRunner.getWebDriver()).moveByOffset(point.x, point.y).doubleClick().perform();

Что-то типа такого. Но. Возникает ряд вопросов:

  1. Мы должны искать от какого-то элемента всегда. В данном случае это #demo h2. Можно ли указать поиск непосредственно слова в < p > ?
  2. По факту нужного мне клика не происходит и слово не выделяется. То есть нужно подшаманивать с x_offset и y_offset чтобы мышь точно попала на нужное мне слово. А это геморно и неправильно априори.

Это заведомо нерешаемая задача ?
Может быть есть некие сторонние бибилиотеки, решающие это ?
Или может быть это можно как-то сделать через JS ?

Буду рад услышать любые советы.

Может, не париться по поводу именно слова, а отталкиваться от символа.
Я бы так поступил:

  1. Предварительно руками и глазами и доступными инструментами типа паинта вычислить среднюю длину 1 символа в пикселях.
  2. Найти размеры области со словами.
  3. Зная искомое слово можно найти его начало и длину в предложении как подстроку.
  4. Зная количество пикселей на символ можно уже мувать и кликать по координатам (начиная с левого края). Типа: x - x/2 + ( (кол-во символов до искомого слова + 2 или 3 или 4) * пикселей )
    y не меняем, если он приходится на середину высоты символов (y = 0).

Немного странная задача.

  1. Попап возникает по факту клика на любое слово или только специальное?
    1a. Если на любое - я бы не парился и тупо кликал где придётся, например, 10 px от левого края, y координата - центр контрола (если не multiline, иначе 10 px от верхнего края).
    1b. Если на специальное - я бы использовал заранее заготовленный текст и, соответственно, заранее вычисленные смещения.
    1c. Если заранее заготовленный текст по каким-то причинам использовать не вариант - тогда задача сводится к нахождению позиции начала слова. Обозначим её k. Используя предположение о том, что буквы примерно одинаковые по ширине, находим, куда кликать по формуле x = x0 + kx1, где x0 - координата левого края контрола, x1 - ширина 1 буквы. y в этом случае считаем так же, как в 1a.

На любое слово.
Чтобы далеко за примером не ходить - прямо тут если 2 раза щелкнуть по слову - появится попап “Цитата”.
Вот тоже думаю, что заранее заготовленный текст - вариант.

Так если на любое - можно кликнуть так, как я указал в 1a варианте. Заготовленный текст не нужен совсем. Ну, разве что чтобы исключить пробелы в начале.

Дело в том, что я должен знать на что кликаю.
В случае заготовленного текста я всегда знаю, что первый параграф всегда содержит такое предложение.
Кликаю по первому слову, первого предложения, первого параграфа.
Это знание нужно чтобы потом проверить, для какого слова были произведены изменения из попапа.

Тогда - да, выбор с заранее заготовленным текстом - лучший.

что мешает получить value текстового поля и по регулярке первое слово вытащить?