一尘不染

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

selenium

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

问题是,我尝试上传的Web元素有两种使用方式:拖放或单击按钮。没有字段输入框。并不是说我没有尝试使用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>

我正在使用Java,并且可以使用Selenium之外的其他方法(但是,我只具有选择的Maven存储库)。

谢谢!


阅读 490

收藏
2020-06-26

共1个答案

一尘不染

不幸的是,由于Selenium不支持<input type="file" multiple>元素,您目前无法做到这一点(2013年1月,Selenium
2.29.1)。

项目开发人员自己对此有一个功能增强请求,但尚未实现。您可以在此处加注星标以将其在优先级列表中向上移动。

另外,据我所知,您无法真正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);

它很烂,但应该可以。请注意,您可能需要这些:如何使机械手键入?并将String转换为KeyEvents(另外还有一些新功能和亮点KeyEvent#getExtendedKeyCodeForChar(),它们的工作类似,但仅JDK7提供)。

2020-06-26