javascript - div 在元素内滚动,但使用 java 和 selenium

标签 javascript java selenium scroll

我需要滚动内部窗口(即 div)。我找到了这个网站 How to scroll to an element inside a div?

但这展示了如何执行 Javascript。我正在调用执行器,但我认为我无法将值传递回java(高度等)。这是我的代码部分。基本上有一个带有一堆元素的 div 窗口。有些隐藏在底部,除非滚动到,否则实际上不会出现在 html 中。一旦它们滚动到我相信它们将保留在那里。所以我想我可以滚动一个很大的数字,如果太多的话它不会给出错误,它会尽可能地滚动。

我滚动到顶部然后完成,如下所示:

    String sid = rolesScroller.getAttribute("id");
    js.executeScript("document.getElementById('" + sid + "').scrollTop -= 1000");
    js.executeScript("document.getElementById('" + sid + "').scrollTop += 1000");
    waitForXPathVisibility("Scroll", ROLES_SCROLLER_X);

这样可以吗,还是我需要以某种方式计算出滚动的确切数量并滚动该数量?

我看到有一个element.scrollHeight。 scrollTop 的可能值是否从 0 到scrollHeight?单位都是像素吗?

div 中的元素本身就是节点(列表值),也可以扩展它们在下面创建更多元素。每次我搜索一个值时,我都必须执行上述操作以确保所有内容都在 View 中。我现在的方式在一定程度上有效。但有时在滚动后,当我尝试访问节点时,我会收到 StaleElementException。但是,如果我执行 waitForStaleElement() 它有时会给出错误,指出该元素没有过时。执行 javascript 后有没有办法确保所有操作都已完成,这样就不会发生过时的元素?

总结

  1. 当使用 Java/Selenium 的 javascript 执行器时,有没有办法将 javascript 变量传递回 java,以便它们可以在以后的 jasascript 执行器命令中使用? (如果上面的示例 -1000 +1000 没问题,那么这并不重要)。

  2. 如何确保 javascript 命令在继续之前已完成,以便当您尝试访问滚动的 div 中的元素时,您不会得到过时的元素(我尝试检查 div 中的一个元素,并且 div本身)。

最佳答案

容器似乎是在滚动时动态构建的。尝试使用 scrollIntoView 滚动顶部的最后一个元素,然后等待末尾的不同元素:

WebDriverWait wait = new WebDriverWait(driver, 5);
JavascriptExecutor jse = (JavascriptExecutor)driver;

// get the last element
By lastChild = By.cssSelector("#list > div:last-of-type");
WebDriver elem = driver.findElement(lastChild);

// scroll the last element at the top
jse.executeScript("arguments[0].scrollIntoView(true);", elem);

// wait for a new element at the end
wait.until((WebDriver drv) -> !elem.equals(drv.findElement(lastChild)))

关于javascript - div 在元素内滚动,但使用 java 和 selenium,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40933708/

相关文章:

javascript - "Chrome PDF viewer"扩展 "mhjfbmdgcfjbbpaeojofohoefgiehjai"位于何处?

javascript - Materialise:模态移动背景并导致页面向右跳转

java - Spring MVC模型

java - 如何调试位于堆上的对象?(eclipse-java)

ios - 未下载 WebDriverAgent 项目的依赖项

javascript - 在 Node 中等待回调时运行任意代码?

javascript - 拉斐尔改变方向动画

java - 错误 :java. util.concurrent.ExecutionException : com. android.builder.internal.aapt.v2.Aapt2Exception:AAPT2 错误

selenium - WebDriver 通过 xPath 查找元素,如果未找到元素,则不会超时,屏幕只是卡在那里。

vba - 如何在 Chrome 中使用 VBA + SELENIUM 计算类中的元素?