2012-03-12 18 views
7

¿Hay alguna manera de cargar archivos en Google Chrome ya que Selenium RC "attach_file" solo admite * Firefox? Cualquier sugerencia o solución alternativa son muy apreciadas.Selenio: Cargar archivo en Google Chrome

+2

[I publicado una respuesta utilizando pitón aquí.] [1] [1]: http://stackoverflow.com/a/11872608/471376 – JamesThomasMoon1979

Respuesta

3

La carga de archivos suele ser una solicitud POST, por lo que puede cargar un archivo sin utilizar Selenium; A menos que su sitio requiere cookies, entonces usted necesita para reconstruir las galletas con webdriver.get_cookies() primero

un ejemplo sencillo:

# 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

Si está utilizando WebDriver continuación, cargar el archivo de todo lo que necesita es su uso " sendKeys "para escribir la ruta del archivo. Necesita 'omitir' la parte de hacer clic en el botón Examinar que abre un cuadro de diálogo para seleccionar el archivo. Una versión de Java que funciona para mí se parece a continuación,

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

Probablemente también digno de mención que Usar sendKeys para cargar un archivo solo funcionará con un Ardesco

-1

Uso IJavaScriptExecutor es cambiar el campo de entrada de carga para hacer clic capaces conductor para Chrome no pop-up de error diciendo que este elemento es que no se puede hacer clic.

 [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

El código sin contexto no tiene sentido. No has explicado por qué estás usando JavaScript Executor para establecer el elemento visible y en mi humilde opinión es una mala práctica. Selenio le impide interactuar con elementos ocultos porque eso es algo que un usuario final no podría hacer. En lugar de usar ciegamente J avaScript para forzar al elemento visible, en realidad debería hacer lo que un usuario final haría para que el elemento sea visible. – Ardesco

+1

También utiliza un Thread.sleep que nuevamente es una mala práctica, lo correcto sería usar un objeto WebDriverWait y la clase ExpectedConditions para esperar a que el elemento sea visible. Este es un ejemplo de mala calidad sin explicación y mala práctica de código -1 – Ardesco