Selenium RC > how to upload file using attachFile()

后端 未结 8 782
谎友^
谎友^ 2021-02-04 14:02

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:/         


        
相关标签:
8条回答
  • 2021-02-04 14:18

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

    0 讨论(0)
  • 2021-02-04 14:25

    Using Selenium / Rspec / Internet Explorer My solution was to create an AutoIt script on my windows machine

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

    Then run this as an administrator on the windows machine. Right-click on the exe file and run as admin.

    Then rspec does a page.click "id of your browse button". When the Browse Window opens on the windows machine, AutoIt autofills the text box and it closes. Hopes this helps someone because this was driving me nuts.

    0 讨论(0)
  • 2021-02-04 14:26

    "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());

    0 讨论(0)
  • 2021-02-04 14:30

    I just succesfully uploaded files using Selenium set to use *firefox as the browser. I guess they haven't updated the documentation yet.

    I am using the Ruby client so it was something like this to get it to work

    $browser.click "css=input.file" # This is the 'Choose File' button
    $browser.type "css=input.file", "/absolute/path/to/file.file"
    
    0 讨论(0)
  • 2021-02-04 14:31

    You may try this script in AutoIt. Basically, it awaits for file chooser window. Then enters file path and send enter quick. At the end checks if there was any popup error message, if any reads it text and set exitcode to 1, if non set exit code to 0. The script also ensures that file chooser window is closed.

    The script can be converted to executable (.exe) by Aut2Exe - it's important to mark console? checkbox, After that exe can and executed from java (Runtime.getRuntime().exec()).

    There is also one thing important to run click on file upload button in separate thread.

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

    Otherwise selenium will hang awaiting for click command finish, which never happens because File Chooser windows was opened and not closed.

    The 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 讨论(0)
  • 2021-02-04 14:32

    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.

    0 讨论(0)
提交回复
热议问题