2012-10-31 6 views
7

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.

+1

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. –

+0

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

+0

"...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

risposta

4

È preferibile contrassegnare il webdriver come un singleton per l'intero framework. Stavo usando questo modello e funziona perfettamente.
Nota: prestare attenzione quando si ha a che fare con l'esecuzione parallela.

@CodeEnthusiastic Per esempio prendere una classe GeneralLibrary, in che creano un WebDriver.

estendere le classi a Page Object Model con GeneralLibrary come super classe

+0

I Sicuramente vorrebbe usare un singleton, specialmente se il WebDriver mantiene effettivamente una sorta di informazione di stato che rende imperativo che tutti gli oggetti e le operazioni di pagina utilizzino _same_ WebDriver. Non penso _ pensiamo di fare l'esecuzione parallela sulla stessa macchina, con la stessa JVM. La mia esperienza finora con Selenium mi fa temere che sia troppo fragile per farlo - mi preoccuperei delle azioni su un browser che incasina l'esecuzione su un altro. –

+0

@rironin, Ogni istanza di webdriver è associata a un ID di sessione, che può essere assunto come una chiave a 32 bit generata casualmente. Quindi le azioni di un browser non hanno alcun effetto sugli altri –

+0

Ha senso che un browser non influisca direttamente sull'altro, ma in particolare IE non ha problemi con l'esecuzione dell'automazione quando la finestra di IE non è a fuoco? Tutte le chiamate di automazione funzionano ugualmente bene se la finestra del browser è coperta da una finestra del browser diversa, se i browser sono ridotti a icona, ecc.? Ritengo che sarebbe impossibile garantire che i browser su cui si sta operando avrebbero il focus o sarebbero visibili se si eseguissero più test contemporaneamente sulla stessa macchina. –

Problemi correlati