我一直在寻找在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>
我正在使用Java,并且对Selenium之外的其他方法开放(但是,我只选择了maven存储库)。
谢谢!
答案 0 :(得分:8)
不幸的是,截至目前(2013年1月,Selenium 2.29.1),您无法做到这一点,因为Selenium不支持<input type="file" multiple>
元素。
There is a feature enhancement request由项目开发人员自己做的,它还没有实现。您可以在那里加注星标以在优先级列表中向上移动它。
另外,据我所知,您无法以可靠的方式将文件从桌面拖到WebElement
。
解决方法可能是使用AutoIT(仅限Windows)或Robot
类(也仅适用于与您类似的设置)并在对话框中“盲目地”输入路径:< / p>
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);
很糟糕,但应该有用。请注意,您可能需要这些:How can I make Robot type a `:`?和Convert String to KeyEvents(此外还有新的闪亮KeyEvent#getExtendedKeyCodeForChar()
,它可以执行类似的工作,但只能从JDK7获得。)
答案 1 :(得分:1)
我发现我能让它工作的唯一方法是使用AutoIt(感谢LittlePanda和user3903359的答案。)
我改进了脚本,因为我发现在测试运行时执行任何其他操作可能会阻止它工作。诀窍是找到窗口然后在输入文本之前激活它。
超时是为了防止多个AutoIt脚本在后台闲逛,这意味着当你停止测试并尝试做自己的工作时,他们会开始尝试开始输入!
请注意,该窗口在不同浏览器中的命名方式不同(例如Chrome中的“打开”)。
$windowHandle = WinWait("Choose File to Upload", "", 3) ; 3 second timeout - NB the window name will be different in different browsers!
If $windowHandle == 0 Then
MsgBox(0, "", "Upload popup not found")
Else
;MsgBox(0, "", "Upload popup found: " & $windowHandle)
WinActivate($windowHandle)
Send("C:\\path\to\myfile.txt")
Send("{ENTER}")
EndIf
从Java运行AutoIt脚本是我假设的所有其他答案:
Runtime.getRuntime().exec("MyAutoItScript.exe");
从C#运行AutoIt脚本:
var process = Process.Start(@"C:\\path\to\myAutoItScript.exe");
process.WaitForExit();
Thread.Sleep(200); // IE fix for Modal dialog present exception
答案 2 :(得分:0)
试试这个
driver.findElement(By.id("up-drop-zone-input")).sendKeys("filePath");
答案 3 :(得分:0)
我以为autoIT会解决问题 只是我测试中的一部分java代码
String[] commands = new String[]{};
commands = new String[]{"c:/test/attachFile.exe"};
Runtime.getRuntime().exec(commands);