如何检查WebDriver是否可见

使用Selenium 2.0a2的WebDriver ,我无法检查元素是否可见。

WebDriver.findElement返回一个WebElement ,不幸的是它没有提供一个isVisible方法。 我可以通过使用WebElement.clearWebElement.click来解决这个问题,两者都抛出一个ElementNotVisibleException ,但是这感觉非常肮脏。

任何更好的想法?

element instanceof RenderedWebElement应该工作。

即使我迟到了回答这个问题:

现在可以使用WebElement.isDisplayed()来检查元素是否可见。

我有以下两种build议的方法:

  1. 你可以使用isDisplayed() ,如下所示:

     driver.findElement(By.id("idOfElement")).isDisplayed(); 
  2. 你可以定义一个如下所示的方法并调用它:

     public boolean isElementPresent(By by) { try { driver.findElement(by); return true; } catch (org.openqa.selenium.NoSuchElementException e) { return false; } } 

现在,你可以做如下断言来检查元素是否存在:

 assertTrue(isElementPresent(By.id("idOfElement"))); 

如果你使用的是C#,那就是driver.Displayed。 这是我自己的项目的一个例子:

 if (!driver.FindElement(By.Name("newtagfield")).Displayed) //if the tag options is not displayed driver.FindElement(By.Id("expand-folder-tags")).Click(); //make sure the folder and tags options are visible 

validationele是可见的。

 public static boolean isElementVisible(final By by) throws InterruptedException { boolean value = false; if (driver.findElements(by).size() > 0) { value = true; } return value; } 

下面是我该怎么做(请忽略担心Logger类的调用):

 public boolean isElementExist(By by) { int count = driver.findElements(by).size(); if (count>=1) { Logger.LogMessage("isElementExist: " + by + " | Count: " + count, Priority.Medium); return true; } else { Logger.LogMessage("isElementExist: " + by + " | Could not find element", Priority.High); return false; } } public boolean isElementNotExist(By by) { int count = driver.findElements(by).size(); if (count==0) { Logger.LogMessage("ElementDoesNotExist: " + by, Priority.Medium); return true; } else { Logger.LogMessage("ElementDoesExist: " + by, Priority.High); return false; } } public boolean isElementVisible(By by) { try { if (driver.findElement(by).isDisplayed()) { Logger.LogMessage("Element is Displayed: " + by, Priority.Medium); return true; } } catch(Exception e) { Logger.LogMessage("Element is Not Displayed: " + by, Priority.High); return false; } return false; } 

查看元素是否可见是非常重要的,因为Driver.FindElement只会检查HTML源。 但是popup代码可能在页面html中,而且不可见。 因此, Driver.FindElement函数返回一个错误的肯定(你的testing将失败)

 public boolean isElementFound( String text) { try{ WebElement webElement = appiumDriver.findElement(By.xpath(text)); System.out.println("isElementFound : true :"+text + "true"); }catch(NoSuchElementException e){ System.out.println("isElementFound : false :"+text); return false; } return true; } text is the xpath which you would be passing when calling the function. the return value will be true if the element is present else false if element is not pressent 

element instanceof RenderedWebElement应该工作。 //但是这是为了旧版本的seleniumrc。

请注意:

RenderedWebElement已于四年前(2013年) 弃用。直到selenium-2.0-rc-2被支持并从selenium-2.0-rc-3

所以在最新版本中没有这样的类RenderedWebElement ,当前版本是2.46.0。请使用最新版本

请使用WebElement而不需要使用isDisplayed() isEnabled() and driver.findElements(By.xpath(accessor)).size() > 0

像这样的东西:

 public static boolean isElementFoundDisplayedEnabled(WebDriver driver, String accessor){ return driver.findElements(By.xpath(accessor)).size() > 0 && driver.findElement(By.xpath(accessor)).isDisplayed() && driver.findElement(By.xpath(accessor)).isEnabled(); //isDisplayed(): method avoids the problem of having to parse an element's "style" attribute to check hidden/visible. False when element is not present //isEnabled(): generally return true for everything but disabled input elements. } 

尝试这个

 public boolean isPrebuiltTestButtonVisible() { try { if (preBuiltTestButton.isEnabled()) { return true; } else { return false; } } catch (Exception e) { e.printStackTrace(); return false; } }