WebDriver Selenium – Teste se o elemento está presente

Existe uma maneira de testar se um elemento está presente? Qualquer método findElement terminaria em uma exceção, mas isso não é o que eu quero, porque pode ser que um elemento não esteja presente e que esteja bem, isso não é uma falha do teste, portanto, uma exceção não pode ser a solução.

Eu encontrei este post: Selenium c # Webdriver: Espere até que o elemento esteja presente Mas isso é para C # e eu não sou muito bom nisso. Alguém pode traduzir o código para Java? Me desculpe pessoal, eu tentei no Eclipse, mas eu não entendi direito em código Java.

Este é o código:

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); } } 

Use findElements vez de findElement .

findElements retornará uma lista vazia se nenhum elemento correspondente for encontrado em vez de uma exceção.

Para verificar se um elemento está presente, você pode tentar

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

Isso retornará verdadeiro se pelo menos um elemento for encontrado e falso se não existir.

Que tal um método privado que simplesmente procura o elemento e determina se está presente assim:

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

Isso seria muito fácil e faz o trabalho.

Edit: você poderia até mesmo ir mais longe e tomar um parâmetro de By elementLocator como parâmetro, eliminando problemas se você quiser encontrar o elemento por algo diferente de id.

Eu achei que isso funciona para 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  seconds return driver.findElement(by); } 

Eu tive o mesmo problema. Para mim, dependendo do nível de permissão de um usuário, alguns links, botões e outros elementos não serão exibidos na página. Parte da minha suíte estava testando que os elementos que DEVO estar faltando, estão faltando. Passei horas tentando descobrir isso. Eu finalmente encontrei a solução perfeita.

O que isto faz, é diz ao navegador para procurar por qualquer e todos os elementos baseados especificados. Se resultar em 0 , isso significa que nenhum elemento baseado na especificação foi encontrado. Então eu tenho o código executar uma declaração if para me informar que não foi encontrado.

Isso é em C# , portanto, as traduções precisariam ser feitas para o Java . Mas não deve ser muito difícil.

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

Há também outro caminho que você pode seguir, dependendo do que você precisa para o seu teste.

O snippet a seguir está verificando se existe um elemento muito específico na página. Dependendo da existência do elemento, eu tenho o teste executando um if else.

Se o elemento existe e é exibido na página, eu tenho console.write deixe-me saber e seguir em frente. Se o elemento em questão existir, não posso executar o teste de que precisava, que é o principal raciocínio por trás da necessidade de configurá-lo.

Se o elemento não existir e não for exibido na página. Eu tenho o else no if else executar o teste.

 IList 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. } 

Eu sei que estou um pouco atrasado na resposta ao OP. Espero que isso ajude alguém!

Tente isto: chame este método e passe 3 argumentos:

  1. Variável WebDriver. // assumindo driver_variable como driver.
  2. O elemento que você vai verificar. Deve fornecer a partir do método By. // ex: By.id (“id”)
  3. Limite de tempo em segundos.

Exemplo: 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; } 

Você pode fazer o código rodar mais rápido, diminuindo o tempo limite do selenium antes da instrução try catch.

Eu uso o seguinte código para verificar se um elemento está presente.

 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; } 

Escreva a seguinte function / methos usando o Java:

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

Chame o método com o parâmetro apropriado durante a asserção.

Se você estiver usando o rspec-Webdriver em Ruby, você pode usar este script, assumindo que um elemento realmente não deveria estar presente e é um teste passado.

Primeiro, escreva este método primeiro no seu arquivo RB de class

 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 

Em seguida, no seu arquivo de especificação, chame esse método.

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

Se o seu elemento NÃO estiver presente, sua especificação será transmitida, mas se o elemento estiver presente, ocorrerá um erro, o teste falhou.

Isso funciona para mim:

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

Para encontrar um Elemento em particular está presente ou não, temos que usar o método findElements () ao invés de 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"); 

isso é trabalhado para mim .. me sugerir se eu estiver errado ..

Isso deve servir:

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

Você pode tentar esperar implícito:

 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")); 

`

Ou você pode tentar explícito esperar um: `

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

`

Explicit irá verificar se o elemento está presente antes de alguma ação. Espera implícita pode ser chamada em todo lugar no código. Por exemplo, depois de algumas ações do AJAX.

Mais você pode encontrar na página do SeleniumHQ: http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp

Dando meu trecho de código. Portanto, o método abaixo verifica se existe um botão ‘ Create New Application ‘ random do elemento da web em uma página ou não. Observe que usei o período de espera como 0 segundo.

 public boolean isCreateNewApplicationButtonVisible(){ WebDriverWait zeroWait = new WebDriverWait(driver, 0); ExpectedCondition 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; } } 

Eu usaria algo como (com Scala [o código no antigo “bom” Java 8 pode ser semelhante a este]):

 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 } ... } 

Então,

 val maybeHeaderLink = SeleniumFacade getElement(By.xpath(".//a"), Some(someParentElement)) 

A maneira mais simples que encontrei em Java é:

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

A seguir estão as maneiras de verificar se um Elemento da Web é ou não visitante :

Eu usei XPath como um identificador de elemento / localizador , mas você pode usar outros localizadores também.

Solução I:

 public boolean isElementPresent(String xpathOfElement){ try{ driver.findElement(By.xpath(xpathOfElement)); return true; } catch(NoSuchElementException e){ return false; } } 

Solução II:

 public boolean isElementPresent(String xpathOfElement){ boolean isPresent = false; if(!driver.findElements(By.xpath(xpathOfElement)).isEmpty()){ isPresent=true; } return isPresent; } 

Solução III:

 public boolean isElementPresent(String xpathOfElement){ return driver.findElements(By.xpath(xpathOfElement)).size() > 0; } 

Pessoalmente, eu sempre vou para uma mistura das respostas acima e criar um método utilitário estático reutilizável que usa a sugestão size () <0:

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

Isso é legal, reutilizável, sustentável ... todas essas coisas boas 😉