2009-11-10 49 views
8

Estoy usando Selenium RC con el framework Junit. Estoy intentando subir un archivo usando el método attachFile().Selenium RC> cómo cargar un archivo usando attachFile()

attachFile: (Information collected from selenium API http://release.seleniumhq.org/selenium-remote-control/1.0-beta-2/doc/java/com/thoughtworks/selenium/Selenium.html#attachFile(java.lang.String,%20java.lang.String)) 

void attachFile(java.lang.String fieldLocator, 
      java.lang.String fileLocator) 

Sets a file input (upload) field to the file listed in fileLocator 

Parameters: 
    fieldLocator - an element locator 
    fileLocator - a URL pointing to the specified file. Before the file can be set 
    in the input field (fieldLocator), Selenium RC may need to transfer the file to 
    the local machine before attaching the file in a web page form. This is common in 
    selenium grid configurations where the RC server driving the browser is not the 
    same machine that started the test. Supported Browsers: Firefox ("*chrome") only. 

Puede alguien por favor dígame cómo definir "FileLocator". No estoy obteniendo qué URL especificar aquí. Por favor dame un ejemplo si es posible.

+0

a nadie allí para responder a esta consulta ??? Por favor, ayúdenme ... – Saara

Respuesta

1

Tengo una solución para esto, use el método selenium.focus y los métodos selenium.keyPressNative/keyReleaseNative.

Usted tendrá que dar el foco al cuadro de texto usando:

selenium.focus ("Texto del cuadro de localizador");

Entonces, si el archivo de entrada es C: \ Tools \ archivo.txt es necesario escribir las letras, así:

selenium.keyDownNative ("16"); // SHIFT ON

selenium.keyPressNative ("67"); // c shift lo hace C

selenium.keyPressNative ("59"); //; Shift lo hace: (no se puede hacer colon directamente)

selenium.keyUpNative ("16"); // SHIFT OFF

selenium.keyPressNative ("47"); // barra

selenium.keyPressNative ("84"); // t

selenium.keyPressNative ("79"); // o

selenium.keyPressNative ("79"); // o

selenium.keyPressNative ("76"); // l

selenium.keyPressNative ("83"); // s

selenium.keyPressNative ("47"); // barra

selenium.keyDownNative ("16"); // SHIFT ON

selenium.keyPressNative ("70"); // f shift lo hace F

selenium.keyUpNative ("16"); // SHIFT OFF

selenium.keyPressNative ("73"); // i

selenium.keyPressNative ("76"); // l

selenium.keyPressNative ("69"); // e

selenium.keyPressNative ("46"); //.

selenium.keyPressNative ("84"); // t

selenium.keyPressNative ("88"); // x

selenium.keyPressNative ("84"); // t

selenio.keyPressNative ("10"); // Introduzca

selenium.keyReleaseNative ("10"); // Ingrese

He terminado el sequqnce con un caracter 'Enter'. A veces esto no funciona, por lo que es posible que deba hacer clic en el botón (si conoce el localizador de elementos para él).

+0

\ se llama antislash, no slash. y su método no funciona con todos los teclados, todo tipo de texto y todos los sistemas operativos. –

+0

@PierreGardin a) Se llama antislash en francés, en inglés es una barra invertida b) Esas son claves de Java, por lo que funcionarán independientemente del teclado que hayas conectado. C) Tienes razón en que esto no funcionará. trabajar con todos los sistemas operativos, pero tampoco entrar en la ruta como una cadena; las suposiciones deben hacerse de cualquier manera. Esta es una buena solución –

1

"fileLocator" no es una url sino un localizador como se especifica en la parte superior del javadoc de la clase Selenium. Es el localizador de la entrada utilizada para seleccionar un archivo.

El "fieldLocator" es una url que apunta al archivo que desea establecer en el campo de entrada del formulario, como se especifica en el documento que está citando.

Con Firefox en modo Chrome (browserId = * chrome en lugar de * firefox), esto funciona como se esperaba. Está documentado que está trabajando solo con este browserId)

Por ejemplo: attachFile ("uploadField", Thread.currentThread(). GetContextClassLoader(). GetResource ("files/sample.pdf"). ToString());

+0

En realidad mi aplicación no es compatible con Firefox ... por lo que este método attachFile no funcionó para mí ... y los métodos keyPressNative/keyReleaseNative funcionan con IE7 ... – Saara

+0

Creo que es al revés. – hoymkot

4

Ésta es una vieja pregunta, pero recientemente he resuelto el problema de hacer esto navegador

//Start an auto it script that selects the file manually 
    if(browser.contains("iexplore")){ 
     Runtime r= Runtime.getRuntime(); 
     Process p = null; 
     try { 
      p = r.exec("C:\\uploadFile.exe \"Files\" \"ctl00$ContentPlaceHolder1$FilesView$ctl02$NewFile\" \"C:\\GhostTagBug2.ttx\""); 

     }catch(Exception e){} 
     p.waitFor(); 
    } else { 
     //Tested on firefox 
     //Get focus and type the path manually 
     selenium.focus("xpath=//input[contains(@id,\"_NewFile\")]"); 
     selenium.type("xpath=//input[contains(@id,\"_NewFile\")]", "C:\\GhostTagBug2.ttx"); 
    } 

es sólo una variable que contiene el navegador el guión selenio está en ejecución y el código es, obviamente, en java.

Para IE, uploadFile.exe es una secuencia de comandos automática que se parece a esto.


#include IE.au3 
AutoItSetOption("WinTitleMatchMode","2") ; set the select mode to select using substring 

;Normally run from command line 
if($cmdLine[0] > 2) then 
    $titlex = $cmdLine[1] ;Title of the window 
    $form = $cmdLine[2] ;Name of the file upload/save form object 
    $file = $cmdLine[3] ;Path of the file to upload 
Else 
    ;Testing fields 
    $titlex = "Files" 
    $form = "ctl00$ContentPlaceHolder1$FilesView$ctl02$NewFile" 
    $file = "C:\\GhostTagBug2.ttx" 
EndIf 

WinWait($titlex) ; match the window with substring 
$title = WinGetTitle($titlex) ; retrives whole window title 
WinSetState($title, "", @SW_MAXIMIZE) ;Maximize the window incase button is hidden 
WinActivate($title) 
WinWaitActive($title) 

$oIE = _IEAttach ("Files") 
$oT = _IEGetObjByName ($oIE, $form) 
;Move the mouse to the button on the form and click it 
MouseMove (_IEPropertyGet ($oT, "screenx") + _IEPropertyGet ($oT, "width") - 10, _IEPropertyGet ($oT, "screeny") + _IEPropertyGet ($oT, "height")/2) 
MouseClick ("left") 

;Wait for upload screen then input the file and close it 
WinWait ("Choose File to Upload") 
$hChoose = WinGetHandle ("Choose File to Upload") 
ControlSetText ($hChoose, "", "Edit1", $file) 
ControlClick ($hChoose, "", "Button2") 

;Restore window state 
WinSetState($title, "", @SW_RESTORE) 

En esencia, coge el título de la ventana, se maximiza, introduce el archivo para ser cargado, hace clic en el botón de selección y vuelve a selenio, que he probado en IE 8 bien, pero yo no' T ver por qué cualquier IE que sea compatible con la biblioteca auto de su IE no podría manejar esto.

He visto una gran cantidad de scripts de robots y hacks de Firefox donde habilita javascript para hacer cosas adicionales. Ambos no requieren modificación del navegador.

Pido disculpas por la falta de comentarios, este código todavía está en progreso.

+0

¡gracias por regresar y agregar su solución! –

+0

+1 - funciona para cromo también –

1

Mi solución a esto es usar Selenium-2 en modo de emulación RC. Esto le permite conservar sus pruebas heredadas de Selenium-1, pero cambiar a la aplicación Selenium-2 cuando sea necesario para realizar tareas como la carga de archivos.

Selenium-2 se encuentra actualmente en Beta pero parece ser relativamente estable. Pero no todo lo que Selenium-1 puede hacer es compatible con el modo de emulación Selenium-2 RC, así que piénselo dos veces antes de ir por ese camino.

Más sobre esto aquí: http://seleniumhq.org/docs/09_webdriver.html#emulating-selenium-rc

1

Uso de selenio/Rspec/Internet Explorer Mi solución fue crear un script AutoIt en mi máquina ventanas

WinWaitActive("Choose File to Upload") 
Send("c:\tests\school.jpg") 
Send("{ENTER}") 
run("selectfile2.exe") 

A continuación, ejecute esto como un administrador en el máquina de ventanas. Haz clic con el botón derecho en el archivo exe y ejecuta como administrador.

Luego rspec hace una página. Haga clic en "id de su botón de exploración". Cuando se abre la ventana de exploración en el equipo de Windows, AutoIt autocompleta el cuadro de texto y se cierra. Espero que esto ayude a alguien porque esto me estaba volviendo loco.

1

Puede probar esta secuencia de comandos en AutoIt. Básicamente, espera la ventana del selector de archivos. Luego ingresa la ruta del archivo y envía ingresar rápido. Al final comprueba si hubo algún mensaje de error emergente, si alguno lo lee y establece el código de salida en 1, si no establece el código de salida en 0. El script también asegura que la ventana del selector de archivos esté cerrada.

La secuencia de comandos se puede convertir en ejecutable (.exe) por Aut2Exe - es importante marcar la consola? casilla de verificación, después de que exe puede y ejecutado desde java (Runtime.getRuntime().exec()).

También hay una cosa importante para ejecutar haga clic en el botón de carga de archivos en hilo separado.

new Thread() { 
    public voi run() { 
    browser.click([LOCALTOR]). 
} 
}.start(); 

De lo contrario el selenio se colgará en espera para el acabado de comandos clic, lo que nunca ocurre porque las ventanas selector de archivos se abren y se cierran no.

el guión:

$title="Choose File to Upload" 
If($cmdLine[0] == 1 OR $cmdLine[0] == 2) Then 
    $file=$cmdLine[1] 
    If ($cmdLine[0] == 2) Then 
     $title=$cmdLine[0] 
    EndIf 
Else 
    ConsoleWriteError("Wrong number of argument. Use 2 argument: [FILE PATH] [FILE UPLOAD WINDOW TITLE]. Second argument is optional") 
    Exit(-1)  
EndIf 


If WinWaitActive($title,"",5)==0 Then ; wait 5 sec. 
    ConsoleWriteError($title & " window wasn't opened") 
    Exit (2) 
EndIf 

Send($file) 
Send("{ENTER}") 

$status=WinWaitActive($title, "", 1) 
$success = ($status = 0) 

If Not $success Then 
    $text = ControlGetText($title,"","[CLASS:Static; INSTANCE:2]") 
    WinClose($title)  
    WinClose($title)  
    ConsoleWriteError($text) 
EndIf 

Exit Not $success 
0

I sólo archivos con éxito subidas con selenio establecidas para utilizar * Firefox como navegador. Supongo que aún no han actualizado la documentación.

estoy usando el cliente de Ruby por lo que fue algo como esto para conseguir que funcione

$browser.click "css=input.file" # This is the 'Choose File' button 
$browser.type "css=input.file", "/absolute/path/to/file.file" 
Cuestiones relacionadas