Saltar al contenido

Selenio @FindBy vs driver.findElement ()

Solución:

Mas o menos, @FindBy es solo una forma alternativa de encontrar elementos (la “forma habitual” es driver.findElement() como dijiste).

Sin embargo, la gran ventaja de esa anotación no es en sí misma. Es mejor utilizarlo para apoyar el Patrón PageObject.

En pocas palabras, el PageObject el patrón te dice que crear una clase para cada página del sistema está intentando utilizar / probar.

Entonces, en lugar de tener (el habitual driver.findElement() código):

public class TestClass {
    public void testSearch() {
        WebDriver driver = new HtmlUnitDriver();
        driver.get("http://www.google.com/");
        Element searchBox = driver.findElement(By.name("q"));
        searchBox.sendKeys("stringToSearch");
        searchBox.submit();
        // some assertions here
    }
} 

Definirías una clase para la página (con el @FindBy anotación de los elementos utilizados):

public class GooglePage {
    @FindBy(how = How.NAME, using = "q")
    private WebElement searchBox;
    public void searchFor(String text) {
        searchBox.sendKeys(text);
        searchBox.submit();
    }
}

Y utilícelo como:

public class TestClass {
    public void testSearch() {
        WebDriver driver = new HtmlUnitDriver();
        driver.get("http://www.google.com/");
        GooglePage page = PageFactory.initElements(driver, GooglePage.class);
        page.searchFor("stringToSearch");
        // some assertions here
    }
} 

Ahora, sé que esto puede parecer detallado al principio, pero espere un momento y considere tener varios casos de prueba para esa página. ¿Y si el nombre del searchBox ¿cambios? (Desde el name "q" a una id, decir query?)

¿En qué código habría más cambios para que vuelva a funcionar? El que tiene o el que no tiene los Objetos de página (y @FindBy)? Si una página cambia mucho de estructura, ¿en qué código sería más fácil el mantenimiento?

Hay algunas otras ventajas, como anotaciones adicionales como:

@FindBy(name = "q")
@CacheLookup
private WebElement searchBox;

Ese @CacheLookup hace que la búsqueda del elemento ocurra solo una vez. Después de eso, se almacenará en caché en la variable y será accesible mucho más rápido.

Espero que esto ayude. Para obtener más detalles, asegúrese de verificar PageFactory y el Patrón PageObject.

No me gustan las anotaciones de @FindBy porque entonces IntelliJ ya no detecta si esa variable se está utilizando, lo que hace que sea difícil de limpiar.

En palabras simples, ambos @FindBy y driver.findElement() Hay un enfoque diferente para ubicar los elementos a través de diferentes Estrategias de localización.

Cuando usamos PageFactory, podemos usar el tipo de anotación FindBy. los FindBy anotaciones nos ayuda a eliminar el placa de caldera código que generalmente usamos en forma de findElement() y findElements() al buscar elementos.

Como ejemplo:

WebElement element = driver.findElement(By.name("q"));
element.click();

se convierte en:

element.click();

Puede encontrar los comentarios de @Simon Stewart sobre el mismo tema dentro de la discusión Cómo usar esperas explícitas con los campos PageFactory y el patrón PageObject


Referencias

Puede encontrar un par de discusiones detalladas relevantes en:

  • Diferencia entre @By y @FindBy en POM usando Selenium
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *