我需要滚动内部窗口(即 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 后有没有办法确保所有操作都已完成,这样就不会发生过时的元素?
总结
当使用 Java/Selenium 的 javascript 执行器时,有没有办法将 javascript 变量传递回 java,以便它们可以在以后的 jasascript 执行器命令中使用? (如果上面的示例 -1000 +1000 没问题,那么这并不重要)。
如何确保 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/