[FIXED] Selen @FindBy vs. driver.findElement()

Ausgabe

Warum sollte ich @FindByvs verwenden driver.findElement()?

@FindByzwingt 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 @FindByist 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 @FindByAnmerkung 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 searchBoxDatei ä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 @CacheLookuperfolgt 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)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like