Come gestire il caricamento di file Windows usando Selenium WebDriver?

Ho visto molte domande e soluzioni sul caricamento dei file usando Selenium WebDriver su Stackoverflow. Ma nessuno dei lavori per il seguente scenario.

Qualcuno ha dato una soluzione come segue

// assuming driver is a healthy WebDriver instance WebElement fileInput = driver.findElement(By.name("uploadfile")); fileInput.sendKeys("C:/path/to/file.jpg"); 

Ma ancora non riesco a trovare la maniglia della finestra come posso lavorare su quello?

Immagine dello schermo

Sto cercando una soluzione per lo scenario sopra

Si prega di controllare questo per uno qualsiasi dei seguenti siti Web

 http://www.uploadify.com/demos/ http://www.zamzar.com/ 

 // assuming driver is a healthy WebDriver instance WebElement fileInput = driver.findElement(By.name("uploadfile")); fileInput.sendKeys("C:/path/to/file.jpg"); 

Ehi, questo è mio da qualche parte :).


Nel caso del web Zamzar , dovrebbe funzionare perfettamente. Non fai clic sull’elemento. Basta digitare il percorso in esso. Per essere concreti, questo dovrebbe essere assolutamente ok:

 driver.findElement(By.id("inputFile")).sendKeys("C:/path/to/file.jpg"); 

Nel caso del web Uploadify , sei in un sottaceto, dal momento che la cosa upload non è un input , ma un object Flash. Non c’è alcuna API per WebDriver che ti permetta di lavorare con le windows di dialogo del browser (o oggetti Flash).

Quindi, dopo aver fatto clic sull’elemento Flash, verrà visualizzata una finestra che non avrà alcun controllo. Nei browser e nei sistemi operativi che conosco, si può presumere che dopo l’apertura della finestra, il cursore si trovi nell’input del File name . Per favore, assicurati che questa ipotesi sia vera anche nel tuo caso.

In caso contrario, si potrebbe provare a saltare ad esso premendo Alt + N , almeno su Windows …

Se sì, puoi “ciecamente” digitare il percorso in esso utilizzando la class Robot . Nel tuo caso, sarebbe qualcosa nel modo di:

 driver.findElement(By.id("SWFUpload_0")).click(); Robot r = new Robot(); r.keyPress(KeyEvent.VK_C); // C r.keyRelease(KeyEvent.VK_C); r.keyPress(KeyEvent.VK_COLON); // : (colon) r.keyRelease(KeyEvent.VK_COLON); r.keyPress(KeyEvent.VK_SLASH); // / (slash) r.keyRelease(KeyEvent.VK_SLASH); // etc. for the whole file path r.keyPress(KeyEvent.VK_ENTER); // confirm by pressing Enter in the end r.keyRelease(KeyEvent.VK_ENTER); 

Fa schifo, ma dovrebbe funzionare. Nota che potresti aver bisogno di questi: Come posso fare un tipo di robot a `:`? e Converti stringa in KeyEvents (in più c’è il nuovo e brillante KeyEvent#getExtendedKeyCodeForChar() che funziona in modo simile, ma è disponibile solo da JDK7).


Per Flash, l’unica alternativa che conosco (da questa discussione ) è l’uso della tecnica dark:

Innanzitutto, modifichi il codice sorgente della tua applicazione flash, esponendo i metodi interni usando l’API ExternalInterface di ActionScript. Una volta esposti, questi metodi saranno richiamabili da JavaScript nel browser.

In secondo luogo, ora che JavaScript può chiamare metodi interni nella tua app flash, si utilizza WebDriver per effettuare una chiamata JavaScript nella pagina Web, che quindi chiamerà nella propria app flash.

Questa tecnica è spiegata ulteriormente nei documenti del progetto flash-selenium. ( http://code.google.com/p/flash-selenium/ ), ma l’idea alla base della tecnica si applica altrettanto bene a WebDriver.

Sotto il codice funziona per me:

 public void test() { WebDriver driver = new FirefoxDriver(); driver.get("http://www.freepdfconvert.com/pdf-word"); driver.findElement(By.id("clientUpload")).click(); driver.switchTo() .activeElement() .sendKeys( "/home/likewise-open/GLOBAL/123/Documents/filename.txt"); driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS); driver.findElement(By.id("convertButton")); 

Usando C # e selenium questo codice qui funziona per me, NOTA vorrete usare un parametro per scambiare “localhost” nella chiamata FindWindow per il vostro server particolare se non è localhost e tracking che è la finestra di dialogo più recente aperta se c’è più di una finestra di dialogo in giro, ma questo dovrebbe iniziare:

  [DllImport("user32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool SetForegroundWindow(IntPtr hWnd); [DllImport("user32.dll", EntryPoint = "FindWindow")] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); public static void UploadFile(this IWebDriver webDriver, string fileName) { webDriver.FindElement(By.Id("SWFUpload_0")).Click(); var dialogHWnd = FindWindow(null, "Select file(s) to upload by localhost"); var setFocus = SetForegroundWindow(dialogHWnd); if (setFocus) { Thread.Sleep(500); SendKeys.SendWait(fileName); SendKeys.SendWait("{ENTER}"); } } 

Importa il binario System.Windows.Forms nella soluzione di prova e chiama i due seguenti LOC facendo clic sul pulsante Carica nell’interfaccia utente.

  // Send the file path and enter file path and wait. System.Windows.Forms.SendKeys.SendWait("complete path of the file"); System.Windows.Forms.SendKeys.SendWait("{ENTER}"); 

Sotto il codice funziona per me:

 // wait for the window to appear WebDriverWait wait = new WebDriverWait(driver, 10); wait.until(ExpectedConditions.alertIsPresent()); // switch to the file upload window Alert alert = driver.switchTo().alert(); // enter the filename alert.sendKeys(fileName); // hit enter Robot r = new Robot(); r.keyPress(KeyEvent.VK_ENTER); r.keyRelease(KeyEvent.VK_ENTER); // switch back driver.switchTo().activeElement(); 

C’è un modo più semplice per risolvere ciò che è stato descritto da Slanec. La soluzione di HES funziona quando si utilizza una tastiera inglese, altrimenti non sarà difficile provare a “mappare” la chiave per caratteri speciali.

Invece di robot.keyPress e robot.keyRelease ogni singola chiave che puoi utilizzare Toolkit per copiare la stringa negli Appunti e quindi incollarla.

  StringSelection s = new StringSelection("Path to the file"); Toolkit.getDefaultToolkit().getSystemClipboard().setContents(s, null); Robot robot = new Robot(); robot.keyPress(java.awt.event.KeyEvent.VK_ENTER); robot.keyRelease(java.awt.event.KeyEvent.VK_ENTER); robot.keyPress(java.awt.event.KeyEvent.VK_CONTROL); robot.keyPress(java.awt.event.KeyEvent.VK_V); robot.keyRelease(java.awt.event.KeyEvent.VK_CONTROL); Thread.sleep(3000); robot.keyPress(java.awt.event.KeyEvent.VK_ENTER); 

Ho fatto uso di sendkeys nello scripting di shell usando un file vbsscript. Di seguito è riportato il codice nel file vbs,

 Set WshShell = WScript.CreateObject("WScript.Shell") WshShell.SendKeys "C:\Demo.txt" WshShell.SendKeys "{ENTER}" 

Di seguito è la linea di codice selenium per eseguire questo file vbs,

 driver.findElement(By.id("uploadname1")).click(); Thread.sleep(1000); Runtime.getRuntime().exec( "wscript C:/script.vbs" ); 

Una soluzione alternativa sarebbe scrivere uno script per automatizzare la finestra di dialogo Apri file. Vedi AutoIt .

Inoltre, se non puoi “fare clic” sull’elemento, la mia soluzione è generalmente quella di fare questo:

 element.SendKeys(Keys.Enter); 

Spero che questo aiuti (anche se è un vecchio post)

Hai inserito la doppia barra \\ per l’intero percorso assoluto per ottenere questo esempio: – D: \\ images \\ Lighthouse.jpg

Passaggi – usa sendkeys per il pulsante con l’opzione di navigazione (il pulsante che aprirà la finestra per selezionare i file) – Ora fai clic sul pulsante che sta per caricare il tuo file

 driver.findElement(By.xpath("//input[@id='files']")).sendKeys("D:\\images\\Lighthouse.jpg"); Thread.sleep(5000); driver.findElement(By.xpath("//button[@id='Upload']")).click(); 

Per prima cosa aggiungi il file alla directory delle risorse del progetto

poi

 public YourPage uploadFileBtnSendKeys() { final ClassLoader classLoader = getClass().getClassLoader(); final File file = new File(classLoader.getResource("yourFile.whatever").getPath()); uploadFileBtn.sendKeys(file.getPath()); return this; } 

Walla, vedrai il tuo file selezionato scelto e avrai saltato la finestra di esplorazione dei file

Utilizzare AutoIt Script per gestire il caricamento dei file nel Selenium Webdriver. Sta funzionando bene per lo scenario di cui sopra.

 Runtime.getRuntime().exec("E:\\AutoIT\\FileUpload.exe"); 

Si prega di utilizzare sotto il collegamento per ulteriore assistenza: http://www.guru99.com/use-autoit-selenium.html

Trova l’elemento (deve essere un elemento di input con tipo = attributo “file”) e inviare il percorso al file.

 WebElement fileInput = driver.findElement(By.id("uploadFile")); fileInput.sendKeys("/path/to/file.jpg"); 

NOTA: se si utilizza un RemoteWebDriver, sarà necessario impostare un rilevatore di file. L’impostazione predefinita è UselessFileDetector

 WebElement fileInput = driver.findElement(By.id("uploadFile")); driver.setFileDetector(new LocalFileDetector()); fileInput.sendKeys("/path/to/file.jpg"); 
  webDriver.FindElement(By.CssSelector("--cssSelector--")).Click(); webDriver.SwitchTo().ActiveElement().SendKeys(fileName); 

ha funzionato bene per me Prendendo un altro approccio fornito nella risposta sopra da Matt in C # .net potrebbe anche funzionare con il nome della class # 32770 per la casella di caricamento.

Quello sotto ha funzionato per me

 webDriver.findElement(By.xpath("//input[@type='file' and @name='importFile']")).sendKeys("C:/path/to/file.jpg"); 

Raddoppia le barre retroverse nel percorso, in questo modo:

 driver.findElement(browsebutton).sendKeys("C:\\Users\\Desktop\\Training\\Training.jpg");