2012-03-12 15 views
7

Esiste un modo per caricare file in Google Chrome poiché Selenium RC "attach_file" supporta solo * Firefox? Qualsiasi suggerimento o soluzione alternativa sono molto apprezzati.Selenium: carica file in Google Chrome

+2

[Ho inviato una risposta utilizzando python qui.] [1] [1]: http://stackoverflow.com/a/11872608/471376 – JamesThomasMoon1979

risposta

3

Il caricamento del file è in genere una richiesta POST, quindi è possibile caricare un file senza utilizzare Selenium; A meno che il sito richiede i cookie, allora avete bisogno di ricostruire i biscotti con webdriver.get_cookies() primi

Un semplice esempio:

# required package: 
# http://pypi.python.org/pypi/MultipartPostHandler/0.1.0 

import MultipartPostHandler, urllib2, cookielib 

cookies = cookielib.CookieJar() 
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookies), 
           MultipartPostHandler.MultipartPostHandler) 

path_to_file = r"abc.zip" 

open_file = open(path_to_file,"rb") 
param = { "file": open_file } 
req = opener.open("http://www.yoursite.com/uploadfile", param) 
open_file.close() 
4

Se si utilizza WebDriver poi caricare il file tutto ciò che serve è l'uso " sendKeys "per digitare il percorso del file. È necessario "saltare" la parte di clic sul pulsante Sfoglia che apre una finestra di dialogo per selezionare il file. Una versione di Java che funziona per me sembra qualcosa di simile qui di seguito,

WebElement inputFilePath = driver.findElement(By.id("filepath")); 
inputFilePath.sendKeys("/absolute/path/to/my/local/file"); 
+0

Probabilmente anche interessante notare che l'uso di sendKeys per caricare un file funziona solo con un Ardesco

-1

Utilizzando IJavaScriptExecutor è quello di cambiare il campo di input di upload per fare clic in grado driver in modo cromo errore dicendo che questo elemento non è cliccabile non sarà pop-up.

 [SetUp] 
     public void SetupTest() 
     { 
      driver = new ChromeDriver(); 
      baseURL = ""; 
      verificationErrors = new StringBuilder(); 
     } 

     [Test] 
     public void Test() 
     { 
      IJavaScriptExecutor js = driver as IJavaScriptExecutor; 
      IWebElement element = driver.FindElement(By.Id("UploadFile_ButtonID")); 
      js.ExecuteScript("arguments[0].style.visibility = 'visible'; arguments[0].style.height = '1px'; arguments[0].style.width = '1px'; arguments[0].style.opacity = 1", element); 
      Thread.Sleep(1000); 
      element.SendKeys("D:\\path\\test\\image.jpg"); 
} 
+1

Il codice senza contesto è inutile Non hai spiegato perché stai usando un Executor JavaScript per impostare l'elemento visibile e IMHO è probabilmente una cattiva pratica. ti impedisce di interagire con elementi nascosti perché è qualcosa che un utente finale non può fare, piuttosto che usare ciecamente J avaScript per forzare l'elemento visibile dovresti in realtà fare ciò che un utente finale farebbe per rendere visibile l'elemento. – Ardesco

+1

Si utilizza anche un Thread.sleep che è ancora una cattiva pratica, la cosa corretta da fare sarebbe utilizzare un oggetto WebDriverWait e la classe ExpectedConditions per attendere che l'elemento diventi visibile. Questo è un esempio scadente senza spiegazione e pratica di codice errato -1 – Ardesco