Le sélénium @FindBy vs pilote.findElement()

Pourquoi devrais-je utiliser @FindBy et WebDriver#findElement()?

@FindBy m'oblige à déplacer toutes mes variables à un niveau de classe (quand la plupart d'entre eux ont seulement besoin d'être au niveau de la méthode). La seule chose qu'il semble m'acheter est que je peux appeler PageFactory.initElements(), qui gère l'initialisation tardive pour moi.

Ce qui me manque?

18
demandé sur Alex.K. 2013-08-26 07:15:37

3 réponses

grosso modo, @FindBy est juste une autre façon de trouver des éléments (la "méthode habituelle" étant driver.findElement() comme vous l'avez dit).

Le gros avantage de cette annotation n'est pas lui-même, cependant. Il est mieux utilisé pour supporter le PageObject motif.

En quelques mots, le PageObject modèle vous dit de créer une classe pour chaque page du système vous essayez d'utiliser/tester.

Donc, au lieu d'avoir (driver.findElement() code):

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

vous définiriez une classe pour la page (avec le @FindBy annotation pour les éléments utilisés):

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

Et l'utiliser comme ceci:

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

maintenant, je sais que cela peut sembler verbeux au début, mais donnez-lui juste un moment et considérez avoir plusieurs cas de tests pour cette page. Que faire si le nom de l' searchBox changements? (À partir de la name"q"id, dire