2010-10-12 17 views
9

Sto provando a testare il percorso felice per un pezzo di codice che richiede molto tempo per rispondere, quindi inizia a scrivere un file sul flusso di output di risposta, che richiede una finestra di dialogo di download nei browser.Il selenio attende il download?

Il problema è che questo processo ha fallito in passato, generando un'eccezione dopo questa lunga quantità di lavoro. C'è un modo in selenio per wait-for-download o equivalente?

Potrei inserire un Thread.sleep, ma ciò sarebbe impreciso e rallenterebbe inutilmente l'esecuzione del test.

Cosa dovrei fare, qui?

risposta

5

modo da avere due problemi qui:

  1. È necessario per causare il browser per scaricare il file
  2. È necessario misurare quando il file scaricato è completa

Né problemc un essere risolto direttamente dal selenio (ancora - 2.0 può aiutare), ma entrambi sono problemi risolvibili. Il primo problema può essere risolto dai toolkit di automazione della GUI, come AutoIT. Ma possono anche essere risolti semplicemente inviando un keypress automatico a livello di sistema operativo che simula il tasto invio (funziona per Firefox, un po 'più difficile su alcune versioni di Chrome e Safari). Se stai usando Java, puoi usare Robot per farlo. Altre lingue hanno toolkit simili per fare una cosa del genere.

Il secondo problema è probabilmente risolto al meglio con una sorta di soluzione proxy. Ad esempio, se il tuo browser era configurato per passare attraverso un proxy e quel proxy aveva un'API, puoi interrogare il proxy con quell'API per chiedere quando l'attività di rete era terminata.

Questo è quello che facciamo a http://browsermob.com, che è una mia startup che utilizza Selenium per eseguire test di carico. Abbiamo rilasciato parte del codice proxy come open source, disponibile a http://browsermob.com/tools.

Ma due problemi persistono:

  1. è necessario configurare il browser per utilizzare il proxy. In Selenium 2 questo è più facile, ma è possibile farlo anche con il selenio 1. La chiave è solo assicurarsi che l'avvio del browser richiama il browser con il profilo/le impostazioni corretti.
  2. Al momento non esiste alcuna API per il proxy BrowserMob per dirti quando il traffico di rete si è interrotto! Questo è un grosso buco nel concetto del progetto che voglio sistemare non appena avrò il tempo. Tuttavia, se vuoi dare una mano, unisciti al gruppo Google e posso sicuramente indirizzarti nella giusta direzione.

Spero che ti aiuti a identificare le varie opzioni. Buona fortuna!

0

Questo rientra nella categoria "cose ​​che non possono essere automatizzate". Selenium è stato creato con JavaScipt e, a causa delle restrizioni della sandbox JavaScript, non può accedere ai download.

Il selenio 2 potrebbe essere in grado di farlo una volta che sono stati implementati Avvisi/Prompt ma questo non accadrà ancora per poco tempo.

+1

che ne dici adesso? non è ancora possibile? – user942640

0

Se si desidera verificare la finestra di download, provare con AutoIt. Lo uso per caricare e scaricare i file. Usare AutoIt con Se RC è più facile.

4

Si tratta di Chrome-test-unica soluzione per il controllo dei download con javascript ..

Utilizzando WebDriver (Selenium2) può essere fatto entro cromo Chrome: // che è HTML/CSS/Javascript :

driver.get("chrome://downloads/"); 
waitElement(By.CssSelector("#downloads-summary-text")); 

// next javascript snippet cancels the last/current download 
// if your test ends in file attachment downloading 
// you'll very likely need this if you more re-instantiated tests left 
((JavascriptExecutor)driver).executeScript("downloads.downloads_[0].cancel_();"); 

Non ci sono altre Download.prototype.functions in "chrome: //downloads/downloads.js"

Questo ti se avete solo bisogno suite per testare alcune note informative es. causato dall'attività di avvio dell'allegato del file e non dal file stesso.

Naturalmente è necessario controllare punto 1. - citato da Patrick above - e da questo che controlli passaggio 2. per il test, non per la funzionalità di completamento scaricare file reale/annullare.

Vedere anche: Javascript: Cancel/Stop Image Requests relativo all'arresto del browser.

8

Ho avuto lo stesso problema. Ho inventato qualcosa per risolvere il problema. Un file tempt viene creato da Python con l'estensione ".part". Quindi, se abbiamo ancora il temp, python può aspettare 10 secondi e controllare di nuovo se il file è stato scaricato o non ancora.

while True: 
     if os.path.isfile('ts.csv.part'): 
      sleep(10) 
     elif os.path.isfile('ts.csv'): 
      break 
     else: 
      sleep(10) 
driver.close() 
+0

Colpa di questa risposta e di Santeri puoi davvero realizzare tutto ciò di cui hai bisogno qui. – Yablargo

Problemi correlati