Java的Selenium WebDriver使用Java Robot API进行file upload的一个解决scheme

我看到很多人在使用Selenium WebDriver在testing环境中上传文件时遇到问题。 我使用seleniumWebDriver和Java,并有同样的问题。 我终于find了一个解决scheme,所以我会在这里发布它希望能帮助别人。

当我需要在testing中上传文件时,点击button中的Webdriver并等待窗口“打开”popup。 然后我将path复制到剪贴板中的文件,然后将其粘贴到“打开”窗口中,然后单击“Enter”。 这是工作,因为当窗口“打开”popup,焦点总是在“打开”button。

你将需要这些类和方法:

import java.awt.Robot; import java.awt.event.KeyEvent; import java.awt.Toolkit; import java.awt.datatransfer.StringSelection; public static void setClipboardData(String string) { StringSelection stringSelection = new StringSelection(string); Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stringSelection, null); } 

这就是我打开“打开”窗口之后所做的:

 setClipboardData("C:\\path to file\\example.jpg"); //native key strokes for CTRL, V and ENTER keys Robot robot = new Robot(); robot.keyPress(KeyEvent.VK_CONTROL); robot.keyPress(KeyEvent.VK_V); robot.keyRelease(KeyEvent.VK_V); robot.keyRelease(KeyEvent.VK_CONTROL); robot.keyPress(KeyEvent.VK_ENTER); robot.keyRelease(KeyEvent.VK_ENTER); 

就是这样。 它正在为我工​​作,我希望它适用于你们中的一些人。

实际上,这个也有一个内置的技术。 它应该在所有的浏览器和操作系统中工作。

Selenium 2(WebDriver)Java示例:

 // assuming driver is a healthy WebDriver instance WebElement fileInput = driver.findElement(By.xpath("//input[@type='file']")); fileInput.sendKeys("C:/path/to/file.jpg"); 

这个想法是直接将文件的绝对path发送到一个你通常要点击的元素来获取模式窗口 – 也就是<input type='file' />元素。

感谢Alex,

Java机器人API帮助我上传文件。 我使用WebDriver进行file upload。 以下是我使用的代码(对您的小修改):

 Robot robot = new Robot(); robot.delay(1000); robot.keyPress(KeyEvent.VK_CONTROL); robot.keyPress(KeyEvent.VK_V); robot.keyRelease(KeyEvent.VK_V); robot.keyRelease(KeyEvent.VK_CONTROL); robot.keyPress(KeyEvent.VK_ENTER); robot.keyRelease(KeyEvent.VK_ENTER); robot.delay(1000); 

感谢Alex! 我需要这个,因为当我通过Play framework 2.1(fluentlenium wrapper)使用sendKeys函数的时候无法工作。 我正在testingMac版本的Firefox [17.0.7],不得不做一些mod来让它工作。 以下是我使用的最后一个片段的近似值。

  val file = new File(PATH_TO_IPA) val stringSelection: StringSelection = new StringSelection(file.getAbsolutePath) Toolkit.getDefaultToolkit.getSystemClipboard().setContents(stringSelection, null) val robot: Robot = new Robot() // Cmd + Tab is needed since it launches a Java app and the browser looses focus robot.keyPress(KeyEvent.VK_META) robot.keyPress(KeyEvent.VK_TAB) robot.keyRelease(KeyEvent.VK_META) robot.keyRelease(KeyEvent.VK_TAB) robot.delay(500) robot.keyPress(KeyEvent.VK_META) robot.keyPress(KeyEvent.VK_SHIFT) robot.keyPress(KeyEvent.VK_G) robot.keyRelease(KeyEvent.VK_META) robot.keyRelease(KeyEvent.VK_SHIFT) robot.keyRelease(KeyEvent.VK_G) robot.keyPress(KeyEvent.VK_META) robot.keyPress(KeyEvent.VK_V) robot.keyRelease(KeyEvent.VK_META) robot.keyRelease(KeyEvent.VK_V) robot.keyPress(KeyEvent.VK_ENTER) robot.keyRelease(KeyEvent.VK_ENTER) robot.delay(500) robot.keyPress(KeyEvent.VK_ENTER) robot.keyRelease(KeyEvent.VK_ENTER) 

在Mac上的应用程序的切换是更好的AppleScript。 AppleScript被集成到系统中,所以它将始终是function性的,并且不依赖于Cmd + Tab上的应用程序的顺序。 你的testing/应用程序将不那么脆弱。 https://developer.apple.com/library/content/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_cmds.html

你只需要检测你是在Mac上,并有应用程序的名称。

 Runtime runtime = Runtime.getRuntime(); String[] args = { "osascript", "-e", "tell app \"Chrome\" to activate" }; Process process = runtime.exec(args);