如何在没有文本框的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);
- 在java中读取文件上传的内容
- 使用MultipartFile在Spring Boot中无法上传多个文件,从JSP中获取Controller中的空数组
- 通过Spring MVC将二进制文件上传到MySQL的正确方法
- Spring MVC – AngularJS – 文件上传 – org.apache.commons.fileupload.FileUploadException
- JSP:将文件上载到服务器的最佳实践
- Http 415 on file上传使用jersey
- 使用HTTPHandler进行文件上传
- 使用Struts上传图像
- 为什么我在HttpServletRequest上获得指向ServletFileUpload的NoClassDefFoundError?