如何在没有文本框的Selenium中上传文件

Nat*_*ill 9 java selenium automated-tests file-upload selenium-webdriver

我一直在寻找在Selenium 2中上传文件的解决方案.

问题是我尝试上传的网页元素有两种使用方式:拖放或点击按钮.没有字段输入框.并不是说我没有尝试使用sendKeys.我已经在按钮和所有周围元素上尝试过了.

这个问题的第二部分是我在Windows机器上编写,但自动化发生在Linux机器上.这意味着AutoIt不起作用.这是上传框的HTML.

<div class="up-target" id="up-drop-zone">
    <div class="up-drop-zone-pre hidden">
        <p>Please choose a folder to upload</p>
    </div>
    <div class="up-drop-zone-decor">
        <p>Drop one or more files here</p>
        <p>or</p>
        <button name="uploadFile" class="upload">Select Files</button>
        <input type="file" id="up-drop-zone-input" name="files[]" multiple="true">
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

我正在使用Java,并对Selenium之外的其他方法开放(但是,我只选择了maven存储库).

谢谢!

Pet*_*ček 8

不幸的是,你现在不能这样做(2013年1月,Selenium 2.29.1),因为Selenium不支持<input type="file" multiple>元素.

项目开发人员自己提出了一个功能增强请求,它还没有实现.您可以在那里加注星标以在优先级列表中向上移动它.

另外,据我所知,你无法真正将文件从桌面拖到WebElement可靠的方式.

解决方法可能是使用AutoIT(仅限Windows)或Robot类(仅适用于与您类似的设置)并在对话框中"盲目地"键入路径:

driver.findElement(By.id("up-drop-zone-input")).click();
Robot r = new Robot();
r.keyPress(KeyEvent.VK_C);        // C
r.keyRelease(KeyEvent.VK_C);
r.keyPress(KeyEvent.VK_COLON);    // : (colon)
r.keyRelease(KeyEvent.VK_COLON);
r.keyPress(KeyEvent.VK_SLASH);    // / (slash)
r.keyRelease(KeyEvent.VK_SLASH);
// etc. for the whole file path

r.keyPress(KeyEvent.VK_ENTER);    // confirm by pressing Enter in the end
r.keyRelease(KeyEvent.VK_ENTER);
Run Code Online (Sandbox Code Playgroud)

它很糟糕,但它应该工作.请注意,您可能需要以下内容:如何让Robot键入`:`?并将String转换为KeyEvents(另外还有new和shiny KeyEvent#getExtendedKeyCodeForChar(),它们可以完成类似的工作,但只能从JDK7获得).