Ho lavorato a un team che sta sviluppando un'infrastruttura di Selenium WebDriver per alcuni mesi e qualcosa sul modo in cui accediamo all'oggetto driver da casi di test e oggetti di pagina mi sta infastidendo.Come funzionano le istanze di copia/passaggio di un WebDriver ed è pericoloso?
I nostri casi di test creano una nuova istanza WebDriver e aprono il browser. Questa nuova istanza è archiviata nella classe case test.
Quindi, il test case crea un oggetto di pagina. Seguendo insieme a Selenium's Page Object Pattern, questi oggetti di pagina prendono il WebDriver come un parametro nel loro costruttore (anche se ho notato nella nostra versione che non è definitivo). I vari metodi dell'oggetto pagina utilizzano il driver impostato nel costruttore dell'oggetto della pagina per fare ciò che fanno. Se il metodo di un oggetto pagina si sposta su un nuovo oggetto pagina, il WebDriver viene passato ad esso. Proprio come nell'esempio di selenio:
public class LoginPage {
private final WebDriver driver;
public LoginPage(WebDriver driver) {
this.driver = driver;
// Check that we're on the right page.
if (!"Login".equals(driver.getTitle())) {
// Alternatively, we could navigate to the login page, perhaps logging out first
throw new IllegalStateException("This is not the login page");
}
}
// Conceptually, the login page offers the user the service of being able to "log into"
// the application using a user name and password.
public HomePage loginAs(String username, String password) {
// This is the only place in the test code that "knows" how to enter these details
driver.findElement(By.id("username")).sendKeys(username);
driver.findElement(By.id("passwd")).sendKeys(password);
driver.findElement(By.id("login")).submit();
// Return a new page object representing the destination. Should the login page ever
// go somewhere else (for example, a legal disclaimer) then changing the method signature
// for this method will mean that all tests that rely on this behaviour won't compile.
return new HomePage(driver);
}
}
Questo fa sembrare come se l'istanza WebDriver è unico e importante, come una torcia che deve essere passato da oggetto a oggetto pagina pagina. Lo stile del codice mi ha portato a pensare che dovevo sempre assicurarmi di utilizzare la stessa istanza del driver utilizzato nell'ultima operazione.
Ma questo "passaggio della torcia" diventa complicato o impossibile con situazioni in cui sono presenti più oggetti di pagina su una pagina e i metodi di oggetto di pagina non restituiscono l'oggetto di pagina con cui si sta pianificando il lavoro successivo. Come puoi operare sulla stessa istanza di WebDriver quando hai due oggetti di pagina sullo schermo, e devi alternarli tra loro, senza passare a una nuova pagina o creare nuovi oggetti di pagina?
Tutta questa confusione mi porta a credere che nessun passaggio della torcia sia effettivamente necessario, o forse addirittura accade (tutti questi oggetti di pagina conservano riferimenti alla stessa istanza di WebDriver?), Ma poi non so perché il modello è stato suggerito nella descrizione data dal selenio.
Quindi, devo preoccuparmi di "passare la torcia?" O qualsiasi oggetto della pagina funziona bene una volta istanziato con il suo WebDriver, anche se altri oggetti della pagina eseguono operazioni con le proprie versioni dello stesso WebDriver nel frattempo?
Sarebbe più semplice/migliore semplicemente rendere il WebDriver un singleton, accessibile a tutti, dal momento che non useremo più di un WebDriver per JVM in un dato momento? Quindi non avremmo bisogno di passare il WebDriver in giro nei costruttori. Grazie in anticipo per qualsiasi input.
bene, nel mio progetto ho la seguente struttura: BaseSeleniumTest.java che viene prorogato di altre classi (che contiene un insieme di tets con @ Annotazione di prova). Quindi in BaseSeleniumTest.java dichiaro il driver WebDriver; come variabile statica e in questo modo evito di creare più istanze di webDriver. –
Solo per mettere questo fuori là, ci sono alcuni casi in cui si desidera più istanze di webdriver se si ha letteralmente bisogno di lavorare con due browser separati per un dato caso d'uso. – grumpasaurus
"...quindi non so perché questo modello è stato suggerito nella descrizione fornita da Selenium. "Puoi fornire un collegamento a questo? Il mio ricordo è che hanno passato un'istanza di WebDriver a metodi statici. – grumpasaurus