scrollIntoView() 不适用于水平滚动(Selenium)
Posted
技术标签:
【中文标题】scrollIntoView() 不适用于水平滚动(Selenium)【英文标题】:scrollIntoView() not working for horizontal scroll (Selenium) 【发布时间】:2020-02-20 09:59:15 【问题描述】:我想向右滚动到一列。 这是我尝试过的:
((javascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);
这适用于垂直滚动,但不适用于水平滚动。
【问题讨论】:
【参考方案1】:Element.scrollIntoView()
Element.scrollIntoView() 方法将调用它的元素滚动到浏览器窗口的Viewport 中。
语法
element.scrollIntoView()
element.scrollIntoView(alignToTop)
// 布尔参数
element.scrollIntoView(scrollIntoViewOptions)
// 对象参数
参数
这个方法的参数是:
alignToTop
(可选):是一个布尔值,如果为真,则元素的顶部将与可滚动祖先可见区域的顶部对齐。这是默认值。如果为 false,则元素的底部将与可滚动祖先的可见区域的底部对齐。对应 scrollIntoViewOptions: block: "end", inline: "nearest"。
scrollIntoViewOptions
(可选):是一个具有以下属性的对象:
behavior
(可选):定义过渡动画。 “自动”或“平滑”之一。默认为“自动”。
block
(可选):定义垂直对齐。 “开始”、“中心”、“结束”或“最近”之一。默认为“开始”。
inline
(可选):定义水平对齐方式。 “开始”、“中心”、“结束”或“最近”之一。默认为“最近”。
这个用例
根据您的代码行:
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);
参数true
指的是alignToTop
的布尔值。因此问题。
解决方案
要自动水平滚动,您需要为 inline
参数传递以下参数之一:
- start
- centre
- end
- nearest
另类
作为替代方案,您可以使用以下任一选项
scrollLeft()
:Element.scrollLeft()
属性获取或设置元素内容从其左边缘滚动的像素数。如果元素的direction 是rtl
(从右到左),那么当滚动条位于最右侧(滚动内容的开头)时,scrollLeft
是0
,然后随着您滚动到内容的末尾而变得越来越消极。
scrollWidth()
: Element.scrollWidth()
只读属性是元素内容宽度的度量,包括由于溢出而在屏幕上不可见的内容。
结尾
您可以在以下位置找到一些相关的详细讨论:
What is the difference between the different scroll options? Selenium python Error: element could not be scrolled into view【讨论】:
谢谢这让我开始了!结果在我的情况下,我需要将内联设置为“中心”并将块设置为“结束”【参考方案2】:您可以使用以下选项水平滚动
JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("document.getElementById('giveLocationHorizontal').scrollLeft += 250", "");
除此之外,我认为以下内容对您也有用
//scroll up web page
public void scrollUp()
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("window.scrollBy(0,-250)", "");
//scroll down web page
public void scrollDown()
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("window.scrollBy(0,250)", "");
//scroll Horizontal
public void scrollHorizontal()
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("window.scrollBy(250,0)", "");
【讨论】:
【参考方案3】:如果你有id可以试试下面
JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript(
"document.getElementById('gvLocationHorizontalRail').scrollLeft += 250", "")
或
jse.executeScript("window.scrollBy(1000,0)", "");
来源:
http://www.softwaretestingstudio.com/scroll-selenium-webdriver-java/
或通过使用操作
WebElement horizontalbar = driver.findElement(By.id("board") );
Actions action = new Actions(driver);
Actions moveToElement = action.moveToElement( horizontalbar );
for (int i = 0; i < 5; i++)
moveToElement.sendKeys(Keys.RIGHT).build().perform();
来源:
Selenium: horizontal scroll using Actions class
【讨论】:
【参考方案4】:如果您有列的第 th 标记,这应该允许您滚动到它
JavascriptExecutor jse = (JavascriptExecutor) driver;
jse.executeScript("document.querySelector('table th:your-child').scrollIntoView();");
【讨论】:
【参考方案5】:您可以尝试以下发送密钥之一:
element.sendKeys("\n");
element.sendKeys(Keys.SHIFT);
element.sendKeys(Keys.TAB);
【讨论】:
以上是关于scrollIntoView() 不适用于水平滚动(Selenium)的主要内容,如果未能解决你的问题,请参考以下文章
Appium-uiAutomator 适用于 android 但不适用于 iOS
当用户开始自己滚动时,如何防止停止 scrollIntoView?
Windows 10 ScrollIntoView() 没有滚动到列表视图中间的项目