使用 webdriver 滚动到元素?
- 2025-02-24 09:29:00
- admin 原创
- 61
问题描述:
我仍在学习,并回答我的一个问题:在这里,我被告知这可能是由于所讨论的元素不在视图中。
我查看了文档,所以,这里是最相关的答案:这里
您可以使用“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
可能会帮助像我这样的人。
在我看来,这也是一个很好的教训:
前往
:文档
class selenium.webdriver.remote.webelement.WebElement(parent, id_, w3c=False)
需要分离成上面提到的命令形式。
解决方案 1:
您正在尝试使用 Python 运行 Java 代码。在 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)
如果您对差异感兴趣:
scrollIntoView 与 moveToElement
解决方案 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:
例子:
driver.execute_script("arguments[0].scrollIntoView();", driver.find_element_by_css_selector(.your_css_selector))
对于任何类型的选择器,这个对我来说总是有效的。还有 Actions 类,但对于这种情况,它不太可靠。
解决方案 5:
这可以使用 driver.execute_script() 来完成:-
driver.execute_script("document.getElementById('myelementid').scrollIntoView();")
解决方案 6:
这可能对任何到达这里的人都有帮助,因为这里顶部答案中的方法对我不起作用 -actions.move_to_element(element).perform()
什么都没做,并且driver.execute_script("arguments[0].scrollIntoView();", element)
滚动视图,因此元素被位于视图顶部的浮动菜单栏遮挡。对我有用的是使用scrollIntoView
将其置于视图中心的选项,以确保它是可点击的:
driver.execute_script('arguments[0].scrollIntoView({block: "center", inline: "center"})', elem)
解决方案 7:
如果元素具有属性,则还有另一种选项可以将页面滚动到所需元素"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>
)
解决方案 8:
您可以通过该方法使用 javascript 滚动到元素execute_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"});'
)
扫码咨询,免费领取项目管理大礼包!