【问题标题】:One solution for File Upload using Java Robot API with Selenium WebDriver by Java一种使用 Java Robot API 和 Selenium WebDriver by Java 进行文件上传的解决方案
【发布时间】:2012-03-14 23:24:56
【问题描述】:

我看到很多人在使用 Selenium WebDriver 的测试环境中上传文件时遇到问题。我使用 selenium WebDriver 和 java,并且遇到了同样的问题。我终于找到了解决方案,所以我会在这里发布,希望它可以帮助其他人。

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

您将需要这些类和方法:

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);

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

【问题讨论】:

    标签: java file-upload selenium-webdriver


    【解决方案1】:

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

    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");
    

    这个想法是直接将文件的绝对路径发送到您通常单击以获取模式窗口的元素 - 即 <input type='file' /> 元素。

    【讨论】:

    • 谢谢,问题是“sendKeys”对我不起作用,因为我在发送表单之前通过 ajax 调用上传了文件。但也许它可以帮助其他人。 :)
    • 但是。它只是填充路径,<input>失去焦点后任何ajax调用都应该被解析(也就是说sendkeys()调用之后,你需要在<input>之外点击或者开始填充另一个用于触发onchange 脚本)。
    • 是的,你是对的,但是我使用的文件上传使用了一个虚假的输入字段,只显示上传文件的名称。此字段失去焦点时不会触发 ajax。这并不是一个真正简单的过程,也不能像那样进行测试,但我更喜欢这样。
    • 很有趣。我真的很想看看它的内部结构。希望我不会:)。
    • 我想添加,您可以使用C:\\path\\to\\file.jpg 而不是C:/path/to/file.jpg
    【解决方案2】:

    谢谢亚历克斯,

    Java Robot API 帮助我上传文件。我厌倦了使用 WebDriver 上传文件。以下是我使用的代码(对您的稍作修改):

    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);
    

    【讨论】:

    • 很高兴听到它对您有所帮助 :)
    【解决方案3】:

    感谢亚历克斯!我需要这个,因为当通过 Play 框架 2.1(fluentlenium 包装器)使用时,我无法让 sendKeys 函数工作。我正在为 Mac 测试 Firefox [17.0.7] 并且必须制作一些模组才能使其正常工作。下面是我使用的最终 sn-p 的近似值。

        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)
    

    【讨论】:

    • 很高兴听到这个消息。啊!并感谢您分享您的解决方案:)
    • 嘿 Mashhood 能否帮助我将您在 mac 上上传的按键文件版本转换为与 selenium 的 python 绑定一起使用:selenium.googlecode.com/svn/trunk/docs/api/py/webdriver/…。我也无法让 sendKeys 在我的用例中正常工作。
    【解决方案4】:

    Mac 上的应用程序切换最好使用 AppleScript。 AppleScript 已集成到系统中,因此它将始终正常运行,并且不依赖于 Cmd+Tab 上的应用程序顺序。您的测试/应用程序将不那么脆弱。 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-08
      • 2011-08-02
      • 2013-04-25
      • 1970-01-01
      • 1970-01-01
      • 2017-07-09
      • 2013-05-29
      相关资源
      最近更新 更多