2011-05-07 13 views
12

Hola a todos estoy usando WebDriver por lo que si quiero usar el selenio; s función rc isElementPresent tengo emular rc selenio así hago algo como esto:isElementPresent en selenio 2.0

import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.WebDriverBackedSelenium; 
import org.openqa.selenium.WebElement; 
import org.openqa.selenium.firefox.FirefoxDriver; 

public class new { 
private static void one_sec() { 
    Thread.sleep(4000); 
} 
public static void main(String[] args) {  
    WebDriver driver = new FirefoxDriver(); 
    driver.get(something1); 
    Selenium selenium = new WebDriverBackedSelenium(driver, something1); 
    selenium.click("//html..."); 
    one_sec(); 
    System.out.println(selenium.isElementPresent("text")); 
    WebDriver driverInstance = ((WebDriverBackedSelenium) selenium).getWrappedDriver(); 
    ... 
    } 

y siempre consigo falso como resultado de isElementPresent y, por supuesto, el elemento "text" está en la web (que está usando GWT).

+1

¿el elemento de texto tienen su ID como "texto"? No ha mencionado ningún prefijo de localizador para indicar si es xpath o css o dom. Selenium buscará un elemento con @ id = 'text' –

Respuesta

12

me gusta mucho Rostislav Matl's alternativa Moving to Selenium 2 on WebDriver, Part No.1:

driver.findElements(By.className("someclass")).size() > 0; 

Javadoc: org.openqa.selenium.WebDriver.findElements(org.openqa.selenium.By by)

+0

Estoy confundido con el método size(). ¿Hay algún método de WebElement llamado size()? –

+2

@RiponAlWasim Tenga cuidado, 'size()' es un método 'List'. El método 'WebDriver' al que me refiero es' findElements', no 'findElement', y devuelve' List '. Ver la firma: [WebDriver.findElements (By by)] (http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/WebDriver.html#findElements%28org.openqa. selenium.By% 29) y un ejemplo: [Localización de elementos de UI (WebElements) por nombre de clase] (http://seleniumhq.org/docs/03_webdriver.html#introducing-the-selenium-webdriver-api-by-example# by-class-name) – Alberto

+0

Sí, lo tengo. Tienes razón. Lo siento por mi error –

3

En el mundo de Selenium 2, si desea encontrar si un elemento está presente, simplemente ajuste la llamada de búsqueda en una captura de prueba porque si no está presente arrojará un error.

try{ 
    driver.findElement(By.xpath("//div")); 
}catch(ElementNotFound e){ 
    //its not been found 
} 
+2

O 'driver.findElements (...) .size()! = 0';) –

+0

Creo que no hay un método size() en WebDriver. Hay un método getSize() que devuelve la Dimensión –

+0

@AutomatedTester: ¿Cómo puedo usar assertTrue() usando el código anterior –

3

no una parte del Selenio 2, puede hacer lo siguiente:

// Use Selenium implementation or webdriver implementation 
Boolean useSel = false; 

/** 
    * Function to enable us to find out if an element exists or not. 
    * 
    * @param String An xpath locator 
    * @return boolean True if element is found, otherwise false. 
    * @throws Exception 
    */ 
    public boolean isElementPresent(String xpathLocator) { 
     return isElementPresent(xpathLocator, false, ""); 
    } 

/** 
    * Function to enable us to find out if an element exists or not and display a custom message if not found. 
    * 
    * @param String An xpath locator 
    * @param Boolean Display a custom message 
    * @param String The custom message you want to display if the locator is not found 
    * @return boolean True if element is found, otherwise false. 
    * @throws Exception 
    */ 
    public boolean isElementPresent(String xpathLocator, Boolean displayCustomMessage, String customMessage) { 
     try { 
      if (useSel) { 
       return sel.isElementPresent(xpathLocator); 
      } else { 
       driver.findElement(By.xpath(xpathLocator)); 
      } 
     } catch (org.openqa.selenium.NoSuchElementException Ex) { 
      if (displayCustomMessage) { 
       if (!customMessage.equals("")) { 
        System.out.print(customMessage); 
       } 
      } else { 
       System.out.println("Unable to locate Element: " + xpathLocator); 
      } 
      return false; 
     } 
     return true; 
    } 
7

Usted puede impleméntelo usted mismo usando webdriver puro:

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

A veces el elemento que se está tratando de encontrar está cargando, s0 lanzará una excepción usando

findElement(By.xpath(xpathLocator))

Por lo tanto tendríamos que hacer lo Dejan Veternik ha recomendado, que ayudará a esperar hasta que el elemento se ha cargado en la página web, estoy pasando selenio y extraer WebDriver, esto es muy útil en caso que usted está utilizando WebDriverBackedSelenium igual que yo ...

private boolean isElementPresent(WebDriverBackedSelenium driver, String id) { 
     try { 
      driver.getWrappedDriver().findElement(By.id(id)); 
      return true; 

     } catch (Exception e) { 
      return false; 
     } 
    }