Прокрутка к элементу с помощью webdriver?
Я все еще учился и отвечал на один из моих вопросов: здесь мне сказали, что это может быть связано с тем, что этот элемент не рассматривается.
Я просмотрел документацию, и вот, вот наиболее подходящий ответ: здесь
Вы можете использовать класс org.openqa.selenium.interactions.Actions для перехода к элементу:
WebElement element = driver.findElement(By.id("my-id"));
Actions actions = new Actions(driver);
actions.moveToElement(element);
## actions.click();
actions.perform();
Когда я пытаюсь использовать приведенное выше для прокрутки к элементу: он говорит, что WebElement не определен.
Я думаю, это связано с тем, что я не импортировал соответствующий модуль. Может кто-то указать, что я должен импортировать?
Edit: Как отметил alecxe, это был Java-код.
Но пока же, пытаясь понять это на некоторое время. Я нашел метод импорта для WebElement:
from selenium.webdriver.remote.webelement import WebElement
Могу помочь кому-то вроде меня.
Как это тоже хороший урок, ИМО:
Пошел в: Документацию
class selenium.webdriver.remote.webelement.WebElement(parent, id_, w3c=False)
Необходимо разделять на упомянутую выше командную форму.
Ответы
Ответ 1
Вы пытаетесь запустить Java-код с помощью Python. В Python/Selenium org.openqa.selenium.interactions.Actions
отражены в классе ActionChains
:
from selenium.webdriver.common.action_chains import ActionChains
element = driver.find_element_by_id("my-id")
actions = ActionChains(driver)
actions.move_to_element(element).perform()
Или вы также можете "прокручивать изображение" с помощью scrollIntoView()
:
driver.execute_script("arguments[0].scrollIntoView();", element)
Если вас интересуют различия:
Ответ 2
Это не прямой ответ на вопрос (не о Actions
), но также позволяет легко прокручивать требуемый элемент:
element = driver.find_element_by_id('some_id')
element.location_once_scrolled_into_view
Это на самом деле намерено вернуть вам координаты (x
, y
) элемента на странице, а также прокрутить вниз до целевого элемента
Ответ 3
В дополнение к move_to_element()
и scrollIntoView()
я хотел написать следующий код, который пытается центрировать элемент в представлении:
desired_y = (element.size['height'] / 2) + element.location['y']
window_h = driver.execute_script('return window.innerHeight')
window_y = driver.execute_script('return window.pageYOffset')
current_y = (window_h / 2) + window_y
scroll_y_by = desired_y - current_y
driver.execute_script("window.scrollBy(0, arguments[0]);", scroll_y_by)
Ответ 4
Вы можете перейти к элементу, используя javascript через метод execute_javascript
. Например, вот как я делаю это, используя SeleniumLibrary на Robot Framework:
web_element = self.selib.find_element(locator)
self.selib.execute_javascript(
"ARGUMENTS",
web_element,
"JAVASCRIPT",
'arguments[0].scrollIntoView({behavior: "instant", block: "start", inline: "start"});'
)
Ответ 5
Существует еще один вариант прокрутки страницы до требуемого элемента, если элемент имеет атрибут "id"
Если вы хотите перейти на страницу и прокрутить вниз до элемента с @id
, это можно сделать автоматически, добавив #element_id
к URL-адресу...
пример
Допустим, нам нужно перейти к документации Selenium Waits и прокрутить страницу вниз до раздела "Скрытое ожидание". Мы можем
driver.get('https://selenium-python.readthedocs.io/waits.html')
и добавить код для прокрутки... или использовать
driver.get('https://selenium-python.readthedocs.io/waits.html#implicit-waits')
для перехода на страницу и прокрутки страницы автоматически до элемента с id="implicit-waits"
(<div class="section" id="implicit-waits">...</div>
)