一种使用Java Robot API和Selenium WebDriver的文件上传解决方案

一种使用Java Robot API和Selenium WebDriver的文件上传解决方案,java,file-upload,selenium-webdriver,Java,File Upload,Selenium Webdriver,我看到很多人在使用SeleniumWebDriver的测试环境中上传文件时遇到问题。我使用SeleniumWebDriver和java,也遇到了同样的问题。我终于找到了一个解决方案,所以我将把它贴在这里,希望它能帮助其他人 当我需要在测试中上传文件时,我用按钮中的Webdriver单击,等待窗口“打开”弹出。然后我将路径复制到剪贴板中的文件,然后将其粘贴到“打开”窗口并单击“输入”。这是因为当窗口“打开”弹出时,焦点总是在“打开”按钮上 您将需要这些类和方法: import java.awt.R

我看到很多人在使用SeleniumWebDriver的测试环境中上传文件时遇到问题。我使用SeleniumWebDriver和java,也遇到了同样的问题。我终于找到了一个解决方案,所以我将把它贴在这里,希望它能帮助其他人

当我需要在测试中上传文件时,我用按钮中的Webdriver单击,等待窗口“打开”弹出。然后我将路径复制到剪贴板中的文件,然后将其粘贴到“打开”窗口并单击“输入”。这是因为当窗口“打开”弹出时,焦点总是在“打开”按钮上

您将需要这些类和方法:

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);
}
这就是我在打开“打开”窗口后所做的:


就这样。它对我有效,我希望它对你们中的一些人有效。

实际上,这也是一种内置技术。它应该适用于所有浏览器和操作系统

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");
想法是直接将文件的绝对路径发送到一个元素,您通常会单击该元素以获得模式窗口,即
元素。

谢谢Alex

JavaRobotAPI帮助我上传文件。我是fedup的文件上传使用WebDriver。以下是我使用的代码(对您的代码进行了小修改):


谢谢亚历克斯!我需要这个,因为当通过Play framework 2.1(fluentlenium包装器)使用sendKeys函数时,我无法使其工作。我正在用Firefox[17.0.7]为Mac进行测试,为了让它正常工作,我不得不制作一些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集成到系统中,所以它将始终正常工作,并且不依赖于Cmd+选项卡上应用程序的顺序。您的测试/应用程序将不那么脆弱。

您只需检测到您在mac上并且具有应用程序的名称

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

谢谢,问题是“sendKeys”对我不起作用,因为我在发送表单之前通过ajax调用上传了文件。但也许它能帮助其他人。:)但是它只是填充路径,任何ajax调用都应该在
失去焦点后解决(这意味着在
sendkeys()
调用之后,您需要在
之外单击,或者开始填充另一个
onchange
脚本来触发)。是的,您是对的,但是我使用的文件上载,使用仅显示上载文件名称的假输入字段。当该字段失去焦点时,不会触发ajax。这真的不是一个简单的过程,也不能像那样进行测试,尽管我更喜欢那样。有趣。我真的很想看看它的内部结构。希望我不会:)。我想补充一点,您可能想使用
C:\\path\\to\\file.jpg
而不是
C:/path/to/file.jpg
。我很高兴听到它帮助了您:)很高兴听到它。啊!!感谢分享您的解决方案:)嘿,Mashhood,您能帮我将您在mac上上传的keypress文件版本转换为与selenium的python绑定一起使用吗:。我也无法让sendKeys在我的用例中正常工作。
    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)
Runtime runtime = Runtime.getRuntime();
            String[] args = { "osascript", "-e", "tell app \"Chrome\" to activate" };
            Process process = runtime.exec(args);