【问题标题】:org.openqa.selenium.ElementNotVisibleException: Element is not currently visible and so may not be interacted withorg.openqa.selenium.ElementNotVisibleException:元素当前不可见,因此可能无法与之交互
【发布时间】:2014-11-13 01:23:01
【问题描述】:

我正在尝试在 Selenium Web 驱动程序脚本下执行,但我多次收到org.openqa.selenium.ElementNotVisibleException: Element is not currently visible and so may not be interacted with 错误(并非所有时间)。有时在循环第一次迭代中,有时在第 2 次迭代中,有时没有开始循环。它打印所有可用的项目计数正确但乳清试图点击项目,它显示Element is not currently visible...

public void pickitems() throws Exception  
        {
        Webdriver driver = new firefoxdriver();
        driver.get("http://www.bigbasket.com");
        driver.manage().window().maximize();
            //Selecting Location
        List<WebElement> list = driver.findElement(By.id("ftv-city-popup")).findElements(By.tagName("button"));
        int location = r.nextInt(list.size());
        list.get(location).click();
            //Selection random Category from left panel through list 
        Thread.sleep(30000);
        List<WebElement> xyz = driver.findElement(By.id("uiv2-main-menu")).findElements(By.className("top-category"));
        System.out.println(xyz.size());
        Random r = new Random();
        int category = r.nextInt(xyz.size());
        xyz.get(category).click();


        for (int i = 0; i < 3; i++) {
            Thread.sleep(30000);
            List<WebElement> availableItems = driver.findElements(By.cssSelector("a.uiv2-add-button.a2c"));
            System.out.println(availableItems.size());
            if (availableItems.size() > 0)
            {
                int selectItem = r.nextInt(availableItems.size());
                availableItems.get(selectItem).click();

            } 
            else
            {
                Thread.sleep(30000);
                List<WebElement> availableItems2 = driver.findElements(By.cssSelector("a.uiv2-add-button.a2c"));
                if (availableItems2.size() == 0) {
                    System.out.println("No more items are available. Sorry for the inconvenience");
                }
                else {
                    Assert.fail("Unable to select items. May be page loading issue");
                }


            }

        }

  }

}

【问题讨论】:

    标签: java dom selenium selenium-webdriver


    【解决方案1】:

    不确定您的要求是什么。但是,有几件事要记住。

    1. Selenium 可能会找到满足相同条件但被隐藏的元素
    2. 即使元素未隐藏,它也可能未处于准备就绪状态,无法接受任何交互。

    如果你确定元素没有被隐藏,那么你可以使用下面的等待元素可见

     new WebDriverWait(Driver, TimeSpan.FromSeconds(10)).Until(ExpectedConditions.ElementIsVisible("your selector"); 
    

    【讨论】:

    • 谢谢。这解决了我的问题。
    • @JakeW。很高兴它帮助了你
    • 你能帮我把这个命令转换成JS吗?我有同样的问题,但我在 Node.JS 上的量角器中使用。谢谢@Saifur
    【解决方案2】:

    我猜您正在尝试单击超链接,如果您收到“ElementNotVisibleException”,这意味着元素可能被隐藏了。从左侧面板中选择类别后,带有定位器“a.uiv2-add-button.a2c”的元素是否需要很长时间才能在 UI 上呈现?如果是,则与不可见元素的交互将始终抛出 'ElementNotVisibleException'

    【讨论】:

      【解决方案3】:

      最后这对我有用。 元素当前不可见,因此可能无法与之交互。

      一开始,5 次测试中只有 2 次成功。有时不确定它是如何工作的,而另一些则不确定。

      通过减少 IE 中的安全设置来工作。启用所有 activeX 控件。也启用脚本和 IFRAME。其中一些会警告将计算机置于危险之中,但这是我唯一的解决方案。通过在页面加载需要时间的每个点使用 presentOfElementLocated 而不是 visibilityOfElementLocated 来引入显式等待。

          WebDriverWait wait = new WebDriverWait(driver,30);
          wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[@id='campaignListTable']")));   /*examining the xpath for a search     
          box*/
          driver.findElement(By.xpath("//*[@id='campaignListTable']")).sendKeys("TEXT");   /*enter text in search 
          box*/
      

      【讨论】:

        【解决方案4】:

        让线程休眠几百万秒

        Thread.sleep(5000);
        WebElement zoneName=driver.findElement(By.xpath("//*[@id=\"zoneName\"]"));
        zoneName.sendKeys("kandy");
        

        【讨论】:

          【解决方案5】:

          对于某些浏览器,一旦执行鼠标悬停操作,菜单列表就会在 Selenium 识别下一个子菜单项之前迅速消失。在这种情况下,最好在主菜单上使用perform() 操作来保持菜单列表,直到 Selenium 识别子菜单项并单击它。

          这里

          WebElement xWL = driver.findElement(By.xpath("x path text"));
          
          Actions xAct = new Actions(driver);
          

          而不是这个:

          xAct.moveToElement(xWL).build().perform();
          

          以下代码将解决“元素不可见”问题

          xAct.moveToElement(xWL);
          xAct.click();
          xAct.perform();
          

          【讨论】:

            【解决方案6】:

            我遇到了类似的问题,原因是, 除了我试图找到的实际元素之外,还有更多隐藏元素。 所以click实际上是在尝试与隐藏元素交互并抛出异常。

            解决方案 - 我微调了元素的 xpath 以使其独一无二,从而导致与实际元素的交互。

            【讨论】:

            • “微调元素 XPath”对于吸引(许多)赞成票的解决方案有点过于抽象。您能否编辑并使其更具体一些,例如您如何解决相关问题的代码?
            • 当有多个具有相同 id 的元素时,它解决了我的问题。
            【解决方案7】:

            要处理它,您可以使用 selenium 中的显式等待函数来定位元素。大多数时候它都有效。

            【讨论】:

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