【问题标题】:Why isDisplayed returns No element found using locator instead of boolean? - protractor为什么 isDisplayed 返回 No element found 使用定位器而不是布尔值? - 量角器
【发布时间】:2018-09-02 01:53:26
【问题描述】:

我有一个方法 isElementDisplayed,里面有 element.isDisplayed 调用。

为什么isDisplayed 可以返回布尔值却返回No element found

isElementDisplayed(element: ElementFinder) {
    return element.isDisplayed();
}

【问题讨论】:

  • 在幕后,selenium 首先试图找到元素。只有在找到它之后,它才会告诉该元素是否显示。当它查看元素是否存在时,它不存在,并抛出异常。这是查找优先级。是的,理论上,selenium 可以返回一个布尔值,但考虑到它给你的信息比你要求的多!
  • Colud 你告诉我如何用打字稿写“如果元素不可见返回布尔值”?
  • 我不熟悉该语言,但建议使用 try/catch 机制。在try 块中,完全按照您在上面写的内容进行操作。在catch 块下检查异常是否为“未找到元素”,如果是这种情况,则返回false
  • 我无法在 catch 块中出错

标签: selenium typescript webdriver protractor


【解决方案1】:

isDisplayed() 会检查一个元素是否可见,但你需要检查一个元素是否存在于DOM中,使用isElementPresent()isPresent()

expect(browser.isElementPresent(element(by.id('ELEMENT_ID_HERE')))).toBe(false);
expect(element(by.id('ELEMENT_ID_HERE')).isPresent()).toBe(false);

另见:

【讨论】:

    【解决方案2】:

    find 元素引发了异常。使用 try & catch 块返回 false。

    try{
    return element.isDisplayed();
    } 
    catch (Exception e) 
    {
    return false; 
    // e.getMessage(); // you can console the exception message if required
    }
    

    【讨论】:

    • 如果尝试得到错误,我会看到 element not found.... catch 块不执行... (TypeScript)
    【解决方案3】:

    您应该尝试全局方法并在需要的地方调用它。像这样:

    public static boolean ElementVisible(By element, WebDriver driver) {
    
            // Maximum wait time is 60 seconds
            int maxAttempts = 2;
            long sleepTimeInMillisForEachIteration = 500;
    
            for (int counter = 0; counter <= maxAttempts; counter++) {
                try {
    
                        driver.findElement(element);        
    
                    return true;
                } catch (NoSuchElementException | ElementNotVisibleException e) {
                    if (counter == maxAttempts) {
                        return false;
                    }
                    try {
                        Thread.sleep(sleepTimeInMillisForEachIteration);
                        continue;
                    } catch (InterruptedException e1) {
                        e1.printStackTrace();
                    }
                }
            }
            return false;
        }
    

    所以在这里它会与元素交互,如果它是可见的,否则它会处理异常并返回 false。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-19
      • 1970-01-01
      • 2013-08-10
      • 1970-01-01
      • 2019-07-23
      • 2016-04-02
      • 1970-01-01
      相关资源
      最近更新 更多