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

Прокрутка до невидимого элемента java+selenium

java
selenium
webdriver
Теги: #<Tag:0x00007f9c4a6a6790> #<Tag:0x00007f9c4a6a6650> #<Tag:0x00007f9c4a6a6510>

(Максим Лаптев) #1

Добрый день, не получается сделать прокрутку до элемента, темы несомненно уже были подобные на форме, но результата нет. Локатор работающий, судя по ответам на формах js тоже должен работать. Обычный Action тоже не фурычит

Код

WebElement element = driver.findElement(By.xpath("//*[@class = "nameclass" and text() = 123]]"))
Actions action= new Actions(driver);
       action.moveToElement(element).build().perform();
or
((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView();", element )
or
((Locatable) element ).getCoordinates().inViewPort();

Проблема собственно в том, что он пытается найти элемент которого нет, чтобы прокрутить к элементу он делает findElement и собственно на этом все, ошибка - no such element: Unable to locate element, поскольку поиск происходит в рамках текущей видимости.

Вопрос, как найти невидимый элемент, до того как к нему пройдет прокрутка?


(Valentin G ) #2

Я бы использовал метод, типа WaitForElementPresent, после этого уже делал все действия с ним.


(Дмитрий Еремин) #3

А если все это выполнить на js?

  • Сделать его видимым
  • проскроллить до элемента
  • обратно скрыть элемент

Второй вариант тоже на js

document.querySelector("locator-here").getClientRects()[0].top

Возвращает значение top для элемента. Можно выполнить этот js на странице и получить значение. На него и проскролить вниз страницу. Ну или проскролить на занчение

document.querySelector("locator-here").getClientRects()[0].top + 
document.querySelector("locator-here").getClientRects()[0].height

(Максим Лаптев) #4

Я пытался использовать ожидания различные, но смысл ждать появления элемента, если нужно прокрутить страницу до этого элемента чтобы он появился. Как с этим бороться? Или WaitForElementPresent все равно найдет элемент, а потом js прокрутит до него?


(Aikhao) #5

У меня такое прокатывает.

$(".knoweledge-base").offset().top - $(window).scrollTop()

(Сергей Слётов) #6

Скажите пожалуйста:
Элемент невидим или отсутствует?
Его в вёрстке можно найти?

Если он есть, но невидим, найдите другой - родительский - элемент, который видим и прокрутите до него.


(Максим Лаптев) #7

Его можно найти в верстке, только если прокрутить до него


(Сергей Слётов) #8

Если у него есть родительский элемент примерно в той же позиции где должен быть искомый элемент
Или
Соседний элемент, тоже примерно в той же позиции

Попробуйте их найти и скролл к ним.


(Максим Лаптев) #9

да скроллит, но проблема что такие элементы повторяются, и он крутит до первой ближайшей строки, уникальности никакой нет, только если локатор составлять который я выше писал. Тут только как то делать элемент видимым нужно


(Vatslau) #10

напрашивается цикл
и/или фильтр по критерию
если нужно в конец мотать - когда конец подгружается
то похоже прийдется брать коллекцию
и мотать до конца
потом заново инитить коллекцию пока не найдете свой элемент с кастомным
тестом
не очень надежно конечно…

это чат какой-то?


(Максим Лаптев) #11

не чат, собственно мне сейчас просто нужно прокрутить в самый низ страницы и все, будет успех. Но все методы js визуально не трогают скрол, мне нужно прям реально действия пользователя, жмакнул колесиком и полетела вниз страница.
Сам скролл на сайте работает так $(".slick-viewport").scrollTop(200)