Ausgabe
Warum sollte ich @FindBy
vs verwenden driver.findElement()
?
@FindBy
zwingt mich, alle meine Variablen auf eine Klassenebene zu verschieben (wenn die meisten von ihnen nur auf Methodenebene sein müssen). Das einzige, was es mir zu kaufen scheint, ist, dass ich anrufen kann PageFactory.initElements()
, was die verzögerte Initialisierung für mich übernimmt.
Was vermisse ich?
Lösung
Grob gesagt @FindBy
ist dies nur eine alternative Möglichkeit, Elemente zu finden (die “übliche Methode”, driver.findElement()
wie Sie sagten).
Der große Vorteil dieser Anmerkung ist jedoch nicht selbst. Es wird besser verwendet, um das PageObject-Muster zu unterstützen .
In wenigen Worten sagt Ihnen das PageObject -Muster, dass Sie eine Klasse für jede Seite des Systems erstellen, das Sie verwenden/testen möchten.
Also, anstatt (den üblichen driver.findElement()
Code) zu haben:
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
}
}
Sie würden eine Klasse für die Seite definieren (mit der @FindBy
Anmerkung für die verwendeten Elemente):
public class GooglePage {
@FindBy(how = How.NAME, using = "q")
private WebElement searchBox;
public void searchFor(String text) {
searchBox.sendKeys(text);
searchBox.submit();
}
}
Und verwenden Sie es wie folgt:
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
}
}
Nun, ich weiß, dass dies zunächst ausführlich erscheinen mag, aber nehmen Sie sich einen Moment Zeit und ziehen Sie in Betracht, mehrere Testfälle für diese Seite zu haben. Was ist, wenn sich der Name der searchBox
Datei ändert? (Von dem name
"q"
zu einem id
, sagen wir query
?)
In welchem Code gäbe es weitere Änderungen, damit es wieder funktioniert? Das mit oder ohne die Seitenobjekte (und @FindBy
)? Wenn eine Seite ihre Struktur stark ändert, in welchem Code wäre die Wartung einfacher?
Es gibt einige andere Vorteile, wie z. B. zusätzliche Anmerkungen wie:
@FindBy(name = "q")
@CacheLookup
private WebElement searchBox;
Dadurch @CacheLookup
erfolgt die Suche nach dem Element nur einmal. Danach wird es in der Variable zwischengespeichert und ist viel schneller zugänglich.
Hoffe das hilft. Weitere Einzelheiten finden Sie in PageFactory und dem PageObject-Muster .
Beantwortet von – acdcjunior
Antwort geprüft von – Katrina (FixError Volunteer)