Selenium WebDriver – testing元素是否存在

有没有办法如何testing一个元素是否存在? 任何findElement方法都将以一个exception结束,但这不是我想要的,因为它可能是一个元素不存在,那没关系,这不是testing的失败,所以一个exception不可能是解决scheme。

我发现这个职位: Selenium c#Webdriver:等待元素存在但是,这是为C#,我不是很擅长。 任何人都可以将代码翻译成Java? 我很抱歉,我在Eclipse中尝试过,但是我没有把它写入Java代码。

这是代码:

public static class WebDriverExtensions{ public static IWebElement FindElement(this IWebDriver driver, By by, int timeoutInSeconds){ if (timeoutInSeconds > 0){ var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds)); return wait.Until(drv => drv.FindElement(by)); } return driver.FindElement(by); } } 

使用findElements而不是findElement

如果找不到匹配的元素而不是exception, findElements将返回一个空列表。

要检查一个元素是否存在,你可以试试这个

 Boolean isPresent = driver.findElements(By.yourLocator).size() > 0 

如果至lessfind一个元素,则返回true;如果不存在,则返回false。

怎么样一个私人的方法,只是寻找元素,并确定它是否存在这样的:

 private boolean existsElement(String id) { try { driver.findElement(By.id(id)); } catch (NoSuchElementException e) { return false; } return true; } 

这将是很容易,做这项工作。

编辑:你甚至可以走得更远,并By elementLocator作为参数,消除问题,如果你想通过非id的东西find元素。

我发现这适用于Java:

 WebDriverWait waiter = new WebDriverWait(driver, 5000); waiter.until( ExpectedConditions.presenceOfElementLocated(by) ); driver.FindElement(by); 
 public static WebElement FindElement(WebDriver driver, By by, int timeoutInSeconds) { WebDriverWait wait = new WebDriverWait(driver, timeoutInSeconds); wait.until( ExpectedConditions.presenceOfElementLocated(by) ); //throws a timeout exception if element not present after waiting <timeoutInSeconds> seconds return driver.findElement(by); } 

试试这个:调用这个方法并传递3个参数:

  1. WebDrivervariables。 / /假设driver_variable作为驱动程序。
  2. 你要检查的元素。 应该提供从By方法。 // ex:By.id(“id”)
  3. 时间限制在几秒钟内。

例如:waitForElementPresent(driver,By.id(“id”),10);

 public static WebElement waitForElementPresent(WebDriver driver, final By by, int timeOutInSeconds) { WebElement element; try{ driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS); //nullify implicitlyWait() WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds); element = wait.until(ExpectedConditions.presenceOfElementLocated(by)); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); //reset implicitlyWait return element; //return the element } catch (Exception e) { e.printStackTrace(); } return null; } 

我遇到过同样的问题。 对我而言,取决于用户的权限级别,某些链接,button和其他元素不会显示在页面上。 我的一部分套件正在testing应该丢失的元素是否丢失。 我花了几个小时试图弄清楚这一点。 我终于find了完美的解决scheme。

这样做是告诉浏览器查找指定的任何和所有元素。 如果结果为0 ,则表示没有find基于规范的元素。 然后我有代码执行if语句让我知道它没有被发现。

这是用C# ,所以需要对Java进行翻译。 但不应该太难。

 public void verifyPermission(string link) { IList<IWebElement> adminPermissions = driver.FindElements(By.CssSelector(link)); if (adminPermissions.Count == 0) { Console.WriteLine("User's permission properly hidden"); } } 

还有另外一种方法可以根据您的testing需求来select。

以下片段将检查页面上是否存在非常特定的元素。 根据元素的存在,我有testing执行一个if else。

如果元素存在并显示在页面上,我有console.write让我知道,继续前进。 如果有问题的元素存在,我不能执行我所需要的testing,这是需要设置的主要原因。

如果元素不存在,并且不显示在页面上。 我还有其他的在执行testing。

 IList<IWebElement> deviceNotFound = driver.FindElements(By.CssSelector("CSS LINK GOES HERE")); //if the element specified above results in more than 0 elements and is displayed on page execute the following, otherwise execute whats in the else statement if (deviceNotFound.Count > 0 && deviceNotFound[0].Displayed){ //script to execute if element is found } else { //Test script goes here. } 

我知道我对OP的回应有点晚了。 希望这可以帮助别人!

使用Java编写以下函数/方法:

 protected boolean isElementPresent(By by){ try{ driver.findElement(by); return true; } catch(NoSuchElementException e){ return false; } } 

在断言期间用适当的参数调用方法。

如果你在ruby中使用rspec-Webdriver,你可以使用这个脚本假设一个元素应该不存在,它是一个通过testing。

首先,从你的类RB文件中写下这个方法

 class Test def element_present? begin browser.find_element(:name, "this_element_id".displayed? rescue Selenium::WebDriver::Error::NoSuchElementError puts "this element should not be present" end end 

然后,在您的spec文件上,调用该方法。

  before(:all) do @Test= Test.new(@browser) end @Test.element_present?.should == nil 

如果你的元素不存在,你的规范将会通过,但是如果元素存在,它会抛出一个错误,testing失败。

这适用于我:

  if(!driver.findElements(By.xpath("//*[@id='submit']")).isEmpty()){ //THEN CLICK ON THE SUBMIT BUTTON }else{ //DO SOMETHING ELSE AS SUBMIT BUTTON IS NOT THERE } 

通过在尝试catch语句之前缩短selenium超时,可以使代码更快地运行。

我使用下面的代码来检查一个元素是否存在。

 protected boolean isElementPresent(By selector) { selenium.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS); logger.debug("Is element present"+selector); boolean returnVal = true; try{ selenium.findElement(selector); } catch (NoSuchElementException e){ returnVal = false; } finally { selenium.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS); } return returnVal; } 

我在Java中find的最简单的方法是:

 List<WebElement> linkSearch= driver.findElements(By.id("linkTag")); int checkLink=linkSearch.size(); if(checkLink!=0){ //do something you want} 

要find一个特定的元素是否存在,我们必须使用findElements()方法而不是findElement()。

 int i=driver.findElements(By.xpath(".......")).size(); if(i=0) System.out.println("Element is not present"); else System.out.println("Element is present"); 

这是为我工作..build议我,如果我错了..

这应该做到这一点:

 try { driver.findElement(By.id(id)); } catch (NoSuchElementException e) { //do what you need here if you were expecting //the element wouldn't exist } 

你可以尝试隐含的等待:`

 WebDriver driver = new FirefoxDriver(); driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10)); driver.Url = "http://somedomain/url_that_delays_loading"; IWebElement myDynamicElement = driver.FindElement(By.Id("someDynamicElement")); 

`

或者你可以尝试明确地等待一个:`

 IWebDriver driver = new FirefoxDriver(); driver.Url = "http://somedomain/url_that_delays_loading"; WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); IWebElement myDynamicElement = wait.Until<IWebElement>((d) => { return d.FindElement(By.Id("someDynamicElement")); }); 

`

Explicit会在某个动作之前检查元素是否存在。 隐含的等待可以在代码中的每一个地方调用。 例如在一些AJAX操作之后。

更多你可以在SeleniumHQ页面find: http : //docs.seleniumhq.org/docs/04_webdriver_advanced.jsp

给我的代码片段。 所以,下面的方法检查一个页面上是否存在一个随机的Web元素“ 创build新的应用程序 ”button。 请注意,我已经使用了等待时间为0秒。

 public boolean isCreateNewApplicationButtonVisible(){ WebDriverWait zeroWait = new WebDriverWait(driver, 0); ExpectedCondition<WebElement> c = ExpectedConditions.presenceOfElementLocated(By.xpath("//input[@value='Create New Application']")); try { zeroWait.until(c); logger.debug("Create New Application button is visible"); return true; } catch (TimeoutException e) { logger.debug("Create New Application button is not visible"); return false; } } 

我会使用类似(与斯卡拉[旧的“好”的代码Java 8可能类似于这个)):

 object SeleniumFacade { def getElement(bySelector: By, maybeParent: Option[WebElement] = None, withIndex: Int = 0)(implicit driver: RemoteWebDriver): Option[WebElement] = { val elements = maybeParent match { case Some(parent) => parent.findElements(bySelector).asScala case None => driver.findElements(bySelector).asScala } if (elements.nonEmpty) { Try { Some(elements(withIndex)) } getOrElse None } else None } ... } 

那么,

 val maybeHeaderLink = SeleniumFacade getElement(By.xpath(".//a"), Some(someParentElement)) 
 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; } 
 public boolean isElementDisplayed() { return !driver.findElements(By.xpath("...")).isEmpty(); } 

就个人而言,我总是去混合上述的答案,并创build一个可重用的静态实用工具方法,使用size()<0build议:

 public Class Utility { ... public static boolean isElementExist(WebDriver driver, By by) { return driver.findElements(by).size() < 0; ... } 

这是整洁,可重用,可维护…所有这些好东西;-)