在selenium节点(网格环境)上传文件,其中上传按钮不是输入(类型='文件')

时间:2016-10-17 10:06:40

标签: file-upload selenium-webdriver selenium-grid

我有一个页面,导入按钮看起来像这样。

import_button

以上导入按钮的Dom结构如下

<button ngf-select="" ng-model="$parent.enduserMashups.files" class="btn btn-default text-center ng-pristine ng-untouched ng-valid ng-empty">
    <i class="icon-import-data"></i>
    <span>Import</span></button>

我已经编写了如下的selenium上传工具,在NON-GRID环境(本地机器)的情况下工作正常

public void uploadFile(String filePath)
    {
    // Setting up clipBoard location
    StringSelection ss = new StringSelection(filePath);
    Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null);

    // Using Robot class to upload file
    Robot robot;
    try
    {
        robot = new Robot();
        try
        {
            Thread.sleep(1000);
        } catch (InterruptedException e)
        {
            e.printStackTrace();
        }
        // Press Enter
         robot.keyPress(KeyEvent.VK_ENTER);

        // Release Enter
         robot.keyRelease(KeyEvent.VK_ENTER);

          // Press CTRL+V
         robot.keyPress(KeyEvent.VK_CONTROL);
         robot.keyPress(KeyEvent.VK_V);

        // Release CTRL+V
         robot.keyRelease(KeyEvent.VK_CONTROL);
         robot.keyRelease(KeyEvent.VK_V);
         try
            {
                Thread.sleep(1000);
            } catch (InterruptedException e)
            {
                e.printStackTrace();
            };

        // Press Enter 
         robot.keyPress(KeyEvent.VK_ENTER);
         robot.keyRelease(KeyEvent.VK_ENTER);


    } catch (AWTException e)
    {
        e.printStackTrace();
    }

}

如果在selenium网格节点环境中运行上述代码,则导入&#39;按钮被点击在节点浏览器实例上,在这里它没有找到文件(显然),因为它保存在运行testcase的另一台机器上。 谷歌搜索了很多,我找到了一些解决方案,说明如果有按钮,我们可以使用webdriver.sendKeys(文件)方法,直接将文件发送到selenium节点,但这仅适用于标签。

如果没有元素呢?

1 个答案:

答案 0 :(得分:1)

您可以采取以下措施来解决问题。

  1. 您需要构建一个定义了一个POST / GET方法的自定义servlet,该servlet可用于触发文件上载。 (有关示例,请参阅here)。您还需要确保此servlet将返回文件被接受后保存文件的绝对文件路径。
  2. 现在,您将新构建的自定义servlet注入到Grid节点中(请参阅here以了解如何执行此操作)
  3. 与(1)和(2)类似,您使用GET / POST操作构建另一个servlet,在调用时可以在内部调用uploadFile()方法。 [您基本上会传递从调用(1)
  4. 中解释的servlet获得的文件路径
  5. 您可以参考我的this博客文章,了解如何找出Grid将测试路由到哪里并使用我已解释过的机制检索您的测试所属节点的IP和端口路由到。
  6. 使用从(4)获得的IP和端口号首先调用上传文件servlet,首先将文件上传到运行该节点的远程机器,然后从中恢复保存文件的绝对文件路径servlet。
  7. 您现在调用包含uploadFile()方法的其他servlet,并通过从(5)传递绝对文件路径来驱动ROBOT API,并让它在远程主机上使用ROBOT执行上载操作。
  8. 这应该可以解决问题。