我一直在寻找在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存储库)。
谢谢!
不幸的是,由于Selenium不支持<input type="file" multiple>元素,您目前无法做到这一点(2013年1月,Selenium 2.29.1)。
<input type="file" multiple>
项目开发人员自己对此有一个功能增强请求,但尚未实现。您可以在此处加注星标以将其在优先级列表中向上移动。
另外,据我所知,您无法真正WebElement可靠地将文件从桌面拖到。
WebElement
解决方法可能是使用AutoIT(仅Windows)或Robot类(也将仅在与您类似的设置上起作用),然后在对话框中“盲目”键入路径:
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提供)。
:
KeyEvent#getExtendedKeyCodeForChar()