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