Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Как сделать scroll в выпадающем списке саджеста?

webdriver
Теги: #<Tag:0x00007f7b6413ce28>

(Test) #1

К примеру вот, на странице mail’a https://health.mail.ru/company/list_moscow/aviamotornaya/apteki/
нужно выбрать одну станцию метро, Митино. Эта станция не показана, чтобы на нее можно было просто кликнуть, хоть и список доступен.
Вот локатор, с которым видимые элементы кликаются
//div[contains (@class, ‘dropdown__item’)]/span/span[text()=‘Авиамоторная’

Если можно, то напишите пожалуйста полный путь решения. Я нашел информацию что скролл нужно вызывать javascript’ом но не достаточно знаний как его правильно использовать.
p.s Буду очень признателен, спасибо.


(Alexander) #2

Вот вариант без использования джаваскрипта. Хватаете скроллбар и тянете на нужное количество пикселей до видимого состояния ожидаемого элемента.

driver().get("https://health.mail.ru/company/list_moscow/aviamotornaya/apteki/");
driver().findElement(By.cssSelector("div[data-module='Dropdown.Metro']")).click();
Actions act = new Actions(driver());
//тут может понадобится ожидание готовности элементов выпадающего списка
act.dragAndDropBy(driver().findElement(By.cssSelector
     (".scroll__track__drag.js-scrollbar__track__drag")), 1, 100)
     .build().perform();

(Сергей Блохин) #3

Посмотрите в сторону метода .location_once_scrolled_into_view.
Например, в Ruby это будет выглядеть следующим образом:

# encoding: utf-8

require 'selenium-webdriver'

driver = Selenium::WebDriver.for :phantomjs
driver.get 'https://health.mail.ru/company/list_moscow/aviamotornaya/apteki/'

# select
selector = 'i[class="icon icon_arrow_down dropdown__icon dropdown__icon_field"]'
element = driver.first :css, selector
element.click

# option
selector = 'div[data-id="401"]'
element = driver.first :css, selector
element.location_once_scrolled_into_view
element.click

(Test) #4

Закройте пожалуйста тему. Мое решение отлично от вашего, но спасибо за альтернативные решения.


(Alexander) #5

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


(Test) #6
 String metro = "Юго-Западная";
        WebElement getMetroStation = driver.findElement(By.xpath("//div[contains (@class, 'dropdown__item')]/span/span[text()='"+metro+"']"));
        ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView();", getMetroStation);
        getMetroStation.click();