2012-01-13 15 views

risposta

26

Se si sta tentando di selezionare un file per il caricamento, Selenium 2 supporta gli input di file HTML. Per esempio:

HTML

<input type="file" id="uploadhere" /> 

Codice Selenio

IWebElement element = driver.FindElement(By.Id("uploadhere")); 
element.SendKeys("C:\\Some_Folder\\MyFile.txt"); 

Fondamentalmente è "tipo" (con SendKeys) il percorso completo del file per l'elemento di input file. Il selenio gestisce la finestra di selezione dei file per te.

Tuttavia, se si desidera manipolare una finestra di selezione di file arbitraria, quindi come ha detto Anders, è necessario uscire dal Selenium.

+0

Questo ha funzionato per me anche con il sito ha nascosto file di input. –

+0

Non riesco a farlo funzionare su Firefox in Selenium 2.48. –

7

No, WebDriver non può interagire con le finestre di dialogo, poiché i dialoghi sono il dominio del sistema operativo e non della pagina Web.

Conosco persone che hanno avuto fortuna con autoit e l'API di automazione fornita da .Net.

Un'altra opzione sarebbe quella di ignorare completamente la finestra di dialogo dei file e rilasciare un POST o un GET, ma ciò richiede una conoscenza più avanzata del sito Web oltre a comprendere come costruire un POST/GET.

Si potrebbe provare Webinator, è simile al selenio, nel senso che è alimentato da WebDriver. Fornisce funzionalità di dialogo di file e ho avuto un grande successo con esso.

3

Ecco un'altra soluzione che utilizza remotewebdriver, funziona come per magia e l'ho adorato.

Qui è la classe che ho:

driver.findElementByLinkText("Upload Files").click(); 
driver.setLogLevel(Level.ALL); 
System.out.println(driver.getCurrentUrl()); 
WebElement element = driver.findElement(By.xpath("//input[@name='file_1']")); 
LocalFileDetector detector = new LocalFileDetector(); 

//Now, give the file path and see the magic :)    
String path = "D://test66T.txt"; 
File f = detector.getLocalFile(path); 
((RemoteWebElement)element).setFileDetector(detector); 
element.sendKeys(f.getAbsolutePath()); 

//now click the button to finish 
driver.findElementByXPath("//html/body/div[9]/div[1]/a/span").click(); 
+0

Funziona perfettamente, salva un enorme mal di testa che ha bisogno di occuparsi di avere software aggiuntivo installato su una casella di test (come AutoIT, et. Al.) – nerdwaller

+1

Si tratta di un legame Java però? Perché in C# non riesco a trovare un metodo getLocalFile in LocalFileDetector https://selenium.googlecode.com/git/docs/api/dotnet/html/AllMembers_T_OpenQA_Selenium_Remote_LocalFileDetector.htm –

-1

Se si desidera caricare un file, e non utilizzare il WebDriver, l'unica soluzione che ho incontrato è AutoIt. Ti permette di scrivere uno script e convertirlo in un eseguibile che puoi chiamare dal tuo codice. L'ho usato con successo mentre si lavora con un controllo ActiveX.

0

Un altro approccio è utilizzare System.Windows.Forms.SendKeys.SendWait("pathToFile").
Lo uso con successo ovunque, dove non posso semplicemente inviare le chiavi agli elementi come descritto da @prestomanifesto.

1

According to Nadim Saker

Net dispone di una libreria per gestire finestra di caricamento del file. Ha una classe SendKeys con metodo SendWait (chiavi stringa). Invia la chiave data sull'applicazione attiva e attende che il messaggio venga elaborato. Non restituisce alcun valore.

1

questo può essere fatto nel modo seguente, provato e funzionando con Internet Explorer e Chrome conducente

var allowsDetection = this.Driver as IAllowsFileDetection; 
if (allowsDetection != null) 
{ 
    allowsDetection.FileDetector = new LocalFileDetector(); 
} 

Driver.FindElement(By.Id("your-upload-input")).SendKeys(@"C:\PathToYourFile"); 

Riferimento https://groups.google.com/forum/#!msg/webdriver/KxmRZ8MkM4M/45CT4ID_WjQJ

Problemi correlati