Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当元素应该对webdriver可见时,接收ElementNotVisibleException_Java_Selenium_Webdriver_Selenium Webdriver - Fatal编程技术网

Java 当元素应该对webdriver可见时,接收ElementNotVisibleException

Java 当元素应该对webdriver可见时,接收ElementNotVisibleException,java,selenium,webdriver,selenium-webdriver,Java,Selenium,Webdriver,Selenium Webdriver,我试图让selenium点击li元素中的链接。这是在while循环中发生的。在我到达低于Firefox窗口级别的li之前,点击一直在工作。如果在selenium尝试单击之前手动向下滚动Firefox webdriver窗口,则单击将正常工作 下面是我用于单击的java代码。菜单项模块是一个整数,每次循环运行以向下移动列表时,该整数增加1。下面的webelement引用了li元素 driver.findElement(By.id("digitalVellum_dijit_MenuListItem_

我试图让selenium点击li元素中的链接。这是在while循环中发生的。在我到达低于Firefox窗口级别的li之前,点击一直在工作。如果在selenium尝试单击之前手动向下滚动Firefox webdriver窗口,则单击将正常工作

下面是我用于单击的java代码。菜单项模块是一个整数,每次循环运行以向下移动列表时,该整数增加1。下面的webelement引用了li元素

driver.findElement(By.id("digitalVellum_dijit_MenuListItem_" + menu_item_module)).click();
下面是一个代码片段,其中包含相关页面中的一个li元素

<li id="digitalVellum_dijit_MenuListItem_11" class="dijitLayoutContainer dijitContainer menuListItem level1 item-22 closed dijitLayoutContainer-child dijitLayoutContainer-dijitLayoutContainer" data-dojo-attach-event="onclick:click" data-dojo-attach-point="containerNode" widgetid="digitalVellum_dijit_MenuListItem_11">
<a href="#" data-dojo-attach-point="_link" tabindex="0">
<span class="expander" data-dojo-attach-event="onclick:_toggleState"></span>
<span class="label">Overview</span>
<div class="clearoutfloats"> </div>
</a>
<ul id="digitalVellum_dijit_MenuList_2" class="mainMenu dijitLayoutContainer dijitContainer dijitLayoutContainer-child dijitLayoutContainer-dijitLayoutContainer" data-dojo-attach-point="containerNode" widgetid="digitalVellum_dijit_MenuList_2">
</li>
这似乎没有效果。我认为这可能是因为滚动区域是一个框架,而不是整个页面。不管怎样,我认为我根本不需要滚动。我认为webdriver会在需要选择元素时自动滚动

任何帮助或见解都将不胜感激

谢谢,
史蒂夫·阿奇博尔德(Steve Archibald)

我认为在单击之前需要等待元素,尤其是在循环中执行时。像其他人建议的那样,也尝试最大化窗口。也许这会帮助WebDriver准确地找到WebElement的坐标,但是我不是100%确定。但我相信你需要它。试试看

WebDriver driver = new FirefoxDriver();
WebDriverWait wait = new WebDriverWait(driver, 300/*seconds*/);
driver.manage().window().maximize();
driver.get("http://www.bbc.com/");
for (int menu_item_module = 0; menu_item_module < 10; menu_item_module++) {
    WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By
                        .id("digitalVellum_dijit_MenuListItem_"
                                +menu_item_module)));
            element.click();
}
WebDriver=newfirefoxdriver();
WebDriverWait wait=新的WebDriverWait(驱动程序,300/*秒*/);
driver.manage().window().maximize();
驱动程序。获取(“http://www.bbc.com/");
对于(int菜单项模块=0;菜单项模块<10;菜单项模块++){
WebElement=wait.until(ExpectedConditions.elementToBeClickable)(通过
.id(“digitalVellum_dijit_MenuListItem_”
+菜单(项目(模块));
元素。单击();
}

即使元素不在视图中(隐藏),也可以在其上执行javascript:

JavascriptExecutor jsx = (JavascriptExecutor)driver;
jsx.executeScript("arguments[0].click();", element);

其中,
element
是您要单击的元素。

如果元素位于框架中,则需要使用
driver.switchTo().frame(“frameIdentifier”)
才能访问该框架中的元素。首先使用
driver.manage().window.maximize()可以帮助最大化浏览器窗口
然后尝试单击。如@Faiz所述,在单击链接之前最大化页面。我有一个非常类似的问题,驱动程序会自动向下滚动到链接,但不会单击它。因为我的页面没有最大化,所以有一个水平滚动条。每次当浏览器向下滚动到链接时,它都试图单击链接,但实际上是在单击水平滚动条。
JavascriptExecutor jsx = (JavascriptExecutor)driver;
jsx.executeScript("arguments[0].click();", element);