Прокрутка к элементу с помощью 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>)