使用webdriver滚动到元素?

时间:2017-01-19 14:33:34

标签: python python-3.x selenium selenium-webdriver

我仍然在学习并回答我的一个问题:here,我被告知它可能是因为所讨论的元素不在视野中。

我浏览了文档,所以这是最相关的答案:here

您可以使用" 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没有定义。

我认为这是因为我没有导入相关模块。有人可以指出我应该导入的内容吗?

编辑: 正如alecxe所指出的,这是java代码。

但与此同时,在试图弄清楚一段时间之后。我找到了WebElement的导入方法:

from selenium.webdriver.remote.webelement import WebElement

可以帮助像我这样的人。

它如何也是一个很好的教训,IMO:

去:Documentation

class selenium.webdriver.remote.webelement.WebElement(parent, id_, w3c=False)

需要分成上面提到的命令格式。

7 个答案:

答案 0 :(得分:69)

您正在尝试使用Python运行Java代码。在Python / Selenium中,org.openqa.selenium.interactions.Actions反映在ActionChains class

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)

如果您对这些差异感兴趣:

答案 1 :(得分:29)

这不是问题的直接答案(它不是关于Actions),但它也允许您轻松滚动到所需的元素:

element = driver.find_element_by_id('some_id')
element.location_once_scrolled_into_view

这实际上打算返回页面上元素的坐标(xy),但也向下向右滚动到目标元素

答案 2 :(得分:1)

除了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)

答案 3 :(得分:1)

示例:

driver.execute_script("arguments[0].scrollIntoView();", driver.find_element_by_css_selector(.your_css_selector))

这个总是适用于任何类型的选择器。 还有 Actions 类,但对于这种情况,它不是那么可靠。

答案 4 :(得分:0)

您可以通过execute_javascript方法使用javascript滚动到该元素。 例如,这是我在Robot Framework上使用SeleniumLibrary的方法:

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 :(得分:0)

这可以使用driver.execute_script()完成:-

driver.execute_script("document.getElementById('myelementid').scrollIntoView();")

答案 6 :(得分:-1)

还有另一个选项可将页面滚动到所需元素如果元素具有"id"属性

如果您想导航到页面并使用@id向下滚动到元素,则可以通过向URL添加#element_id来自动完成...

示例

比方说,我们需要导航到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>)自动滚动页面到元素