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

时间:2013-11-07 22:13:56

标签: java selenium webdriver selenium-webdriver

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

这是我用于点击的java代码。 Menu_item_module是一个int,每次循环运行以向下移动列表时,它会增加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>

我尝试使用以下代码进行selenium滚动。

JavascriptExecutor jsx = (JavascriptExecutor)driver;
jsx.executeScript("window.scrollBy(0,100)", "");

这似乎没有效果。我想这可能是因为滚动区域是一个框架,而不是整个页面。无论如何,我认为我根本不需要滚动。我认为webdriver会在必要时自动滚动以选择一个元素。

非常感谢任何帮助或见解。

谢谢, 史蒂夫阿奇博尔德

2 个答案:

答案 0 :(得分:3)

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

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

其中element是您要点击的元素。

答案 1 :(得分:0)

我认为你需要在点击之前等待元素,特别是当你在循环中进行时。像其他人建议的那样,也尝试最大化窗口。可能这将有助于WebDriver准确地找到WebElement的坐标,但我不是100%肯定。但我相信你需要WebDriverWait。试一试,

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();
}