2009-11-10 13 views
8

Sto usando Selenium RC con framework Junit. Sto cercando di caricare un file usando il metodo attachFile().Selenium RC> come caricare il file 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. 

Qualcuno può dirmi come definire "FileLocator". Non ho trovato l'URL da specificare qui. Per favore, fammi un esempio, se possibile.

+0

qualcuno là per rispondere a questa domanda ??? per favore aiutatemi ... – Saara

risposta

1

Ho ottenuto la soluzione per questo, utilizzare il metodo selenium.focus e selenio.keyPressNative/keyReleaseNative metodi.

Avrete bisogno di dare attenzione alla casella di testo utilizzando:

selenium.focus ("text box locator");

Quindi se il file di input è C: \ tools \ file.txt è necessario digitare le lettere in questo modo:

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

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

selenium.keyPressNative ("59"); //; Shift lo rende: (non si possono fare i due punti direttamente)

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

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

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

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

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

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

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

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

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

selenium.keyPressNative ("70"); // f shift lo rende 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"); // Immettere

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

Ho terminato la sequenza con un carattere "Invio". A volte questo non funziona, quindi potrebbe essere necessario fare clic sul pulsante (se si conosce il localizzatore di elementi per esso).

+0

\ è chiamato antislash, non barra. e il tuo metodo non funziona con tutte le tastiere, tutti i tipi di testo e tutti i sistemi operativi. –

+0

@PierreGardin a) Si chiama solo un antislash in francese, in inglese è un backslash b) Quelli sono codici Key Java in modo che funzionino indipendentemente dalla tastiera che hai collegato. C) Hai ragione che questo non funziona con tutti i sistemi operativi, ma nessuno dei due inserisce il percorso come stringa - le ipotesi devono essere fatte in entrambi i modi. Questa è una buona soluzione alternativa –

1

"fileLocator" non è un url ma un localizzatore come specificato in alto nella javadoc della classe Selenium. È il localizzatore dell'ingresso utilizzato per selezionare un file.

Il "fieldLocator" è un url che punta al file che si desidera impostare nel campo di input del modulo, come specificato nel documento che si sta citando.

Con Firefox in modalità chrome (browserId = * chrome anziché * firefox), funziona come previsto. È documentato che funziona solo con questo ID browser)

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

+0

In realtà la mia applicazione non supporta firefox ... quindi questo metodo attachFile non ha funzionato per me ... e i metodi keyPressNative/keyReleaseNative funzionano con IE7 ... – Saara

+0

Penso che sia il contrario. – hoymkot

4

Questa è una vecchia questione, ma di recente ho risolto il problema facendo questo browser

//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"); 
    } 

è solo una variabile che contiene quale browser lo script selenio è in esecuzione e il codice è ovviamente in java.

Per IE, uploadFile.exe è uno script automatico simile a questo.


#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) 

afferra essenzialmente il titolo della finestra, massimizza esso, inserisce il file da caricare, fa clic sul pulsante di selezione e torna al selenio, ho provato in IE 8 bene, ma I don' Ecco perché qualsiasi IE supportato da auto è la libreria _IE non sarebbe in grado di gestirlo.

Ho visto molti script di robot e hack di Firefox in cui abiliti javascript a fare cose extra. Entrambi non richiedono alcuna modifica del browser.

Mi scuso per la mancanza di commenti, questo codice è ancora in elaborazione.

+0

grazie per essere tornato e aver aggiunto la soluzione! –

+0

+1: funziona anche per il chrome –

1

La mia soluzione è usare Selenium-2 in modalità di emulazione RC. Ciò consente di mantenere i precedenti test Selenium-1 ma di passare a Selenium-2 api quando necessario per eseguire attività come i caricamenti di file.

Il selenio-2 è attualmente in beta ma sembra relativamente stabile. Ma non tutto ciò che Selenium-1 può fare è supportato dalla modalità di emulazione Selenium-2 RC, quindi pensaci due volte prima di andare in quel modo.

Maggiori informazioni su questo qui: http://seleniumhq.org/docs/09_webdriver.html#emulating-selenium-rc

1

Utilizzo Selenio/Rspec/Internet Explorer La mia soluzione era quella di creare uno script AutoIt sulla mia macchina Windows

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

Poi gestiscono questo come un amministratore del macchina di Windows. Fai clic destro sul file exe ed esegui come amministratore.

Quindi rspec fa una pagina.click "id del pulsante di ricerca". Quando si apre la finestra Sfoglia sul computer Windows, AutoIt riempie automaticamente la casella di testo e si chiude. Spero che questo aiuti qualcuno perché questo mi stava facendo impazzire.

1

Si può provare questo script in AutoIt. Fondamentalmente, attende la finestra di scelta dei file. Quindi immette il percorso del file e invia invio veloce. Alla fine controlla se c'è un messaggio di errore popup, se qualcuno lo legge e imposta exitcode su 1, se il codice di uscita non è impostato su 0. Lo script assicura anche che la finestra di scelta dei file sia chiusa.

Lo script può essere convertito in eseguibile (.exe) da Aut2Exe - è importante contrassegnare la console? casella di controllo, dopo che exe può ed eseguito da java (Runtime.getRuntime().exec()).

C'è anche una cosa importante da eseguire fare clic sul pulsante di caricamento file in thread separati.

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

In caso contrario il selenio si bloccherà in attesa per la finitura dei comandi click, il che non accade mai perché Windows Chooser file è stato aperto e non chiuso.

script:

$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

ho solo i file caricati utilizzando con successo selenio impostati per utilizzare * Firefox come browser. Immagino che non abbiano ancora aggiornato la documentazione.

Sto usando il cliente di Ruby così è stato qualcosa di simile per farlo funzionare

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