selenium webdriver:org.openqa.selenium.ElementNotVisibleException:元素当前不可见,因此可能无法与之交互

时间:2012-08-22 23:49:45

标签: selenium webdriver

我试图点击带有文本克隆概念的跨度。以下是html

<ul class="context-menu-list context-menu-root" style="width: 210px; top: 500px; left: 231px; z-index: 2;">
    <li class="context-menu-item">
    <li class="context-menu-item">
    <li class="context-menu-item disabled">
    <li class="context-menu-item">
    <li class="context-menu-item icon icon-evn-icon-clone-concept">
        <span>Clone concept</span>
    </li>
    <li class="context-menu-item">
    <li class="context-menu-item icon icon-delete disabled">
</ul>

我使用的javascript代码是:

driver.findElement(By.xpath("//span[text()='Clone concept']")).click();

我通过firepath验证了这是元素的权利。

我还确保根据链接How to force Selenium WebDriver to click on element which is not currently visible?

显示元素

这是计算的css

font-family Verdana,?Arial,?Helvetica,?sans-serif
    .context-menu-list  Verdana,?Arial,?Helvetica,?sans-serif   
    jquery...enu.css (line 15)
    body    Arial,?Helvetica,?sans-serif    
    swa.css (line 3)
    font-size   11px
    .context-menu-list  11px    
    jquery...enu.css (line 15)
    list-style-type none
    .context-menu-list  none    
    jquery...enu.css (line 15)

还尝试了以下代码:

WebElement foo = driver.findElement(By.xpath("//span[text()='Clone concept']"));
Actions bar = new Actions(driver);
bar.click(foo).perform(); 

异常: org.openqa.selenium.ElementNotVisibleException:元素当前不可见,因此可能无法与之交互 命令持续时间或超时:30.04秒 构建信息:版本:&#39; 2.24.1&#39;,修订版:&#39; 17205&#39;,时间:&#39; 2012-06-19 16:53:24&#39; 系统信息:os.name:&#39; Windows 7&#39;,os.arch:&#39; amd64&#39;,os.version:&#39; 6.1&#39;,java.version:&# 39; 1.7.0&#39; 驱动程序信息:driver.version:RemoteWebDriver

任何帮助将不胜感激。

那些被困在这里的人的另一个黑客:
目前,我已经能够将这个巨大的测试用例分成更简单的测试用例。

4 个答案:

答案 0 :(得分:12)

不幸的是,Webdriver在处理问题中描述的情况时似乎不太好。你有几个选择。使用Javascript嘲笑:

JavascriptLibrary jsLib = new JavascriptLibrary(); 
jsLib.callEmbeddedSelenium(selenium,"triggerMouseEventAt", elementToClick,"click", "0,0");

((JavascriptExecutor) driver).executeScript("arguments[0].click();", elementToClick);

或者您可以使用操作单击菜单链中的所有元素。不幸的是,我发现这是不可靠的。

我有一个脚本,可以检测某个元素是否在菜单链中,如果是按所需顺序点击它们,最后点击用户想要的那个,我可以将它发布到某个地方,但它不是'好不好。

答案 1 :(得分:0)

问题出在您的xpath中。 selenium webdriver正在屏幕上的xpath中找到一个重复的元素,这个元素是隐藏的并且会对它进行操作。请更改xpath,它将工作。我在代码中做了同样的事情..

答案 2 :(得分:0)

对于上面的查询,这里是xpath:

//ui[@class='context-menu-list context-menu-root']/span[contains(text(),'Clone concept')]

答案 3 :(得分:0)

基本上,有四个原因导致元素不可交互。通常没有四个解决方案。

1)计时-元素加载所需的时间。为此,您需要检查如何使用隐式显式等待

2)检查元素是否在框架中

3)定位器不正确

4)错误的响应方式实施。这仍然源于3)。某些网站仅针对移动版和网络版启用了一个代码。因此,当您检查xxxxx.size时,该元素将具有多个实例。您将需要在列表中搜索显示为!= none的列表。然后,可以将元素的位置附加到xpath或正在使用的任何定位器上。例如。 xxxx/yyyyy/zzzz[3](如果列表中的位置为4)。

将此代码用于Java,
假设
 a)定位器类型为id
 b)列表的名称是nameOfYourElements

List<WebElement> nameOfYourElements = wd.findElements(By.id("nameOfYourID"));
System.out.println(nameOfYourElements.size());