views:

3497

answers:

7

hello,

I am using Selenium RC with Junit framework. I am trying to upload a file using attachFile() method.

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.

Can anyone please tell me how to define "fileLocator". I am not getting which URL to be specify over here. Please give me an example if possible.

+1  A: 

I got solution for this, use selenium.focus method and the selenium.keyPressNative/keyReleaseNative methods.

You will need to give focus to the text box using:

selenium.focus("text box locator");

Then if your input file is C:\tools\File.txt you need to type the letters like so:

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

selenium.keyPressNative("67"); // c shift makes it C

selenium.keyPressNative("59"); // ; Shift makes it : (you can't do colon directly)

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 makes it 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

selenium.keyPressNative("10"); // Enter

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

I've ended the sequqnce with an 'Enter' character. Sometimes this doesn't work so you may need to click the button (if you know the element locator for it).

Saara
\ is called antislash, not slash. and your method doesn't work with all keyboards, all kinds of text, and all OSes.
Pierre Gardin
A: 

"fileLocator" is not an url but a locator as specified at top in the javadoc of the Selenium class. It is the locator of the input used to select a file.

The "fieldLocator" is an url pointing to the file you want to set in the input field of the form, as specified in the doc you are quoting.

With Firefox in chrome mode (browserId=*chrome instead of *firefox), this works as expected. It is documented to be working only with this browserId)

For instance : attachFile("uploadField", Thread.currentThread().getContextClassLoader().getResource("files/sample.pdf").toString());

Actually my application does not support firefox...so this attachFile method did not worked for me...and keyPressNative/keyReleaseNative methods works with IE7...
Saara
A: 

Its much easier using $sel->type and $sel->focus. Below is a good article.

http://bitsilearn.blogspot.com/

shadeslayer
A: 

This is an old question but I recently solved the problem doing this

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

browser is just a variable containing what browser the Selenium script is running and the code is obviously in java.

For IE, uploadFile.exe is an auto it script that looks like this.


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

It essentially grabs the title of the window, maximizes it, inputs the file to be uploaded, clicks the select button and goes back to Selenium, I've tested it in IE 8 fine, but I don't see why any IE that is supported by auto it's _IE library wouldn't be able to handle this.

I've seen a lot of robot scripts and firefox hacks where you enable javascript to do extra things. Both of these require no modification of the browser.

I apologize for lack of comments, this code is still in progress.

Gus
A: 

@Saara - i tried native keypress it doesnt work to me?? should the focus done to textfield or attach box whic comes after we click attach??

sasikumar
A: 
midhun
A: 

@Saara - i tried native keypress it doesnt work to me?? should the focus done to textfield or attach box whic comes after we click attach??

sasikumar