为什么Selenium找不到图形可见的元素

时间:2016-06-09 08:51:34

标签: javascript java selenium

我正在使用Selenium来测试在firefox浏览器上运行的应用程序,有时当我想点击带有Selenium的按钮时,它只是找不到它。 我发现这很奇怪,因为我可以用眼睛看到元素。我已经尝试过多种方法,可以用于其他例子:

  1. wait.until(ExpectedConditions.visibilityOfElementLocated(通过))
  2. wait.until(ExpectedConditions.presenceOfElementLocated(通过)); (我在路径变量中使用xpath,我确定他是正确的)
  3. 在驱动程序上设置implictlyWait
  4. 放置Thread.sleep(1000)
  5. 然后,我在这里发布,因为我不明白为什么Selenium看不到浏览器上显示的元素。一个重要的信息可能会帮助你给我一个正确的答案是html DOM是由javascript事件触发的websocket动态生成的。

    编辑1:

    <button type="button" class="btn btn-xs btn-block btn-stroke" id="252_button">
        Delete
    </button>
    

    我正在尝试访问的元素。我使用xpath来完成它。

    它不在iframe元素中。

    要访问一个元素我做了这个应该找到并点击它的方法,在参数中给出了xpath:

    public void findAndClick(String xpath) {
            By by = By.xpath(xpath);
            //wait.until(ExpectedConditions.presenceOfElementLocated(by));
            wait.until(ExpectedConditions.visibilityOfElementLocated(by));
    
            driver.findElement(by).click();
        }
    

    编辑2:

    这里是特定的xPath:// div [2] / div / div / div /按钮 我发现它使用的是Selenium插件。

    编辑3:

    我得到的例外是

      

    StaleReferenceElementException:在缓存中找不到元素 - 也许页面在查找后发生了变化。

    我前往解释此例外的page,它说:

    The element has been deleted entirely.
    The element is no longer attached to the DOM.
    

    但它不可能,因为我可以看到它并手动点击它。

1 个答案:

答案 0 :(得分:0)

我想我找到了对我的问题的解释,我读了关于the StaleReferenceException的文件。更准确地说,在这一部分:

  

元素未附加到DOM

     

用于在Web应用程序中模拟选项卡式UI的常用技术是为每个选项卡准备DIV,但一次只能附加一个,将其余部分存储在变量中。在这种情况下,您的代码完全有可能引用一个不再附加到DOM的元素(也就是说,它的祖先是“document.documentElement”)。   如果WebDriver在这种情况下抛出过时的元素异常,即使元素仍然存在,引用也会丢失。你应该丢弃你持有的当前引用并替换它,可能是在元素连接到DOM后再次找到它。

我认为我的情况与此相同,因为这正是我在webElement的引用上使用方法(getText(),getTag())时我有这个异常,即使这个元素仍然是图形可见的。据我所知,我尝试访问一个不再附加到DOM的引用,因为DOM已经改变了。