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

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

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

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

Drop one or more files here

or

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

谢谢!

不幸的是,你现在不能这样做(2013年1月,Selenium 2.29.1),因为Selenium不支持元素。

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

另外,据我所知,您无法以可靠的方式将文件从桌面拖到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); 

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

我发现我能使用它的唯一方法是使用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 

试试这样吧

 driver.findElement(By.id("up-drop-zone-input")).sendKeys("filePath"); 

我以为autoIT将在我的测试中解决问题的一部分java代码

 String[] commands = new String[]{}; commands = new String[]{"c:/test/attachFile.exe"}; Runtime.getRuntime().exec(commands);