WebDriver无法识别某些WebElements,WebDriver无法找到浏览器可见区域中不可见的元素。
为了使WebDri可以通过WebDriver查看,我们需要在浏览器的视图中显示该元素以向下滚动特定的div!
如何在我的网页的特定区域执行操作(向下滚动并单击)。我尝试了很多,没有帮助我。
请帮我解决我的问题。
答案 0 :(得分:8)
首先,这里发布的大多数答案都不在主题之内。我现在一直在使用selenium 2和selenium 3,webdriver可以处理窗口滚动以使元素可见。
对于每个人发布的片段如:
driver.execute_script('scrollBy(0, 250)')
你根本得不到问题!
实际上我还没有找到一种方法来正确模拟滚动手柄的拖动动作,但this answer看起来很有希望 - 但我没试过。
所以到目前为止,我个人有两种方法可以做到这一点:
Keys.ARROW_DOWN
Keys.PAGE_DOWN
实际上还有第三种方法,只要放弃硒,如果他们提供任何API,请联系网站。
答案 1 :(得分:6)
import org.openqa.selenium.JavascriptExecutor;
WebDriver driver = new FirefoxDriver();
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("scroll(0, 250)"); //y value '250' can be altered
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("scroll(250, 0)"); //x value '250' can be altered
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("window.scrollTo(0,Math.max(document.documentElement.scrollHeight,document.body.scrollHeight,document.documentElement.clientHeight));");
或
Actions actions = new Actions(driver);
actions.keyDown(Keys.CONTROL).sendKeys(Keys.END).perform();
for (int second = 0;; second++) {
if(second >=60){
break;
}
((JavascriptExecutor) driver).executeScript("window.scrollBy(0,400)", ""); //y value '400' can be altered
Thread.sleep(3000);
}
或
JavascriptExecutor jse = (JavascriptExecutor)driver;
for (int second = 0;; second++) {
if(second >=60){
break;
}
jse.executeScript("window.scrollBy(0,800)", ""); //y value '800' can be altered
Thread.sleep(3000);
}
Point hoverItem =driver.findElement(By.xpath("Value")).getLocation();
((JavascriptExecutor)driver).executeScript("return window.title;");
Thread.sleep(6000);
((JavascriptExecutor)driver).executeScript("window.scrollBy(0,"+(hoverItem.getY())+");");
// Adjust your page view by making changes right over here (hoverItem.getY()-400)
或
((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView();", driver.findElement(By.xpath("Value')]")));
或
WebElement element = driver.findElement(By.xpath("Value"));
Coordinates coordinate = ((Locatable)element).getCoordinates();
coordinate.onPage();
coordinate.inViewPort();
答案 2 :(得分:6)
最简单的方法是执行Javascript以向上/向下滚动元素。
JavascriptExecutor jsExec = (JavascriptExecutor) driver;
jsExec.executeScript("document.getElementById('id').scrollDown += 100");
答案 3 :(得分:3)
'Settings.Secure.putString()'
答案 4 :(得分:2)
使用JavascriptExceutor
的{{1}}方法执行此操作的另一种方法:
scrollIntoView()
答案 5 :(得分:1)
首先你应该滚动而不是找到元素,如下所示:
document.getElementById("your div id").scrollTop(250);
在上面你可以找到特定的div。
您也可以尝试以下内容:
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("javascript:window.scrollBy(250,350)");
答案 6 :(得分:0)
考虑您的HTML如下所示:
<div id="someId" class="className" style="position: relative; top: 0px; left: opx;>
您可以在style
中观察div
属性
在上面的示例
top
的值 0px
现在尝试做类似的事情:
$('.className').animate({top: "-60px"});
这将帮助您向下滚动。 它是一个JavaScript执行器,所以你当然需要实现它。
答案 7 :(得分:0)
我的“替代方法”是按元素的x和y坐标滚动到位置。我还为y添加了一个偏移量,这样任何页眉/页脚或其他元素都不会阻止我想要滚动到的元素的可见性。
我在这个问题下贴了我的答案 -
答案 8 :(得分:0)
所有发布的答案都不适合我,但我找到了基于this post的解决方案。
((JavascriptExecutor) driver).executeScript(
"arguments[0].scrollTop=arguments[1].offsetTop",
divWithScrollbarElement,
elementToScrollTo);
其中divWithScrollbarElement
是您要滚动的div元素,而elementToScrollTo
是您想要查看的子元素(在我的情况下实际上是我的元素的父元素)最初试图查看)。如果elementToScrollTo
实际上还没有在DOM中,您可能需要使用脚本一次尽可能向下滚动,然后再次加载元素。
答案 9 :(得分:0)
如您所见,webdriver将找不到不可见的元素,因此您需要滚动到该元素。但是,您无法直接滚动到该元素,因为webdriver在可见之前不会找到它。赶上22。
但是我确实有一种方法可以让您在DIV中滚动。首先将要滚动的DIV分配给元素变量,然后可以使用javascript滚动该元素,而不是滚动整个窗口。
一些VB.NET示例代码应易于适应其他语言:
Dim div_to_scroll As IWebElement = driver.FindElement(By.XPath("[put your xpath here]"))
driver.ExecuteJavaScript("arguments[0].scrollBy(0,500)", div_to_scroll)
' Short pause to make sure the screen updates:
System.Threading.Thread.Sleep(500)
如果您不知道需要滚动多远,则需要进行循环测试,以查看所需的元素是否可见。这不是一种特别优雅或快速的处理方式,但是webdriver并不是一开始的快速解决方案,我发现这种方法非常健壮。