【问题标题】:selenium webdriver: org.openqa.selenium.ElementNotVisibleException: Element is not currently visible and so may not be interacted withselenium webdriver:org.openqa.selenium.ElementNotVisibleException:元素当前不可见,因此可能无法与之交互
【发布时间】:2012-08-22 23:49:45
【问题描述】:

我正在尝试使用文本克隆概念单击跨度。以下是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 秒 构建信息:版本:'2.24.1',修订:'17205',时间:'2012-06-19 16:53:24' 系统信息:os.name:'Windows 7',os.arch:'amd64',os.version:'6.1',java.version:'1.7.0' 驱动信息:driver.version:RemoteWebDriver

任何帮助将不胜感激。

对于那些被困在这里的人的另一个技巧:
目前,我已经能够通过将这个庞大的测试用例拆分为更简单的测试用例来继续前进。

【问题讨论】:

标签: selenium webdriver


【解决方案1】:

不幸的是,Webdriver 似乎并不擅长处理您问题中描述的情况。不过,您有几个选择。使用 Javascript 模拟点击:

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

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

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

我有一个脚本,它检测一个元素是否在菜单链中,如果它以所需的顺序点击它们,最终点击用户想要的,如果你想要它我可以把它贴在某个地方,但它不是t 漂亮或短。

【讨论】:

  • 看了一会儿,但elementToClick 是您在driver.findElement() 中找到的WebDriver 元素。
【解决方案2】:

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

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

【讨论】:

  • 抱歉,否决票是我刚刚注意到的意外点击,除非编辑答案,否则我无法删除
【解决方案3】:

问题出在您的 xpath 中。 selenium webdriver 正在通过屏幕中的 xpath 找到一个重复的元素,该元素被隐藏并试图对其执行操作。请更改 xpath,它将起作用。我在我的代码中做了同样的事情..

【讨论】:

  • 这正是我遇到的问题。 var n = _currentBrowserDriver.FindElements(By.Name(elementName)).Count; if (n > 1) throw new Exception("元素不是唯一的");
【解决方案4】:

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

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

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

3) 定位器不正确

4) 响应性的错误实现。这仍然源于3)。有些网站只为移动版和网页版启用了一个代码。因此,当您检查 xxxxx.size 时,该元素将具有多个实例。您必须在列表中搜索显示!= 无的列表。然后,您可以将元素的位置附加到您的 xpath 或您正在使用的任何定位器。例如。 xxxx/yyyyy/zzzz[3] 如果列表中的位置是 4。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-27
    • 2016-04-30
    • 2014-11-13
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多