【问题标题】:Upload File on selenium node (grid environment) , where in upload button is not of input(type='file')在 selenium 节点(网格环境)上上传文件,其中上传按钮不是输入(type='file')
【发布时间】:2016-10-17 10:06:40
【问题描述】:

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

上述导入按钮的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 网格节点环境中运行上述代码,则在节点浏览器实例上单击“导入”按钮,并且此处找不到文件(显然),因为它保存在另一台运行测试用例的机器上. 谷歌搜索了很多,我找到了一些解决方案,其中指出如果有按钮,我们可以使用 webdriver.sendKeys(file) 方法,该方法直接将文件发送到 selenium 节点,但这仅适用于标签的情况。

如果没有元素怎么办?

【问题讨论】:

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


    【解决方案1】:

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

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

    这应该可以解决问题。

    【讨论】:

    • 这听起来很有趣。我一定会试一试,并会让你知道。感谢您的回答,感谢您的建议
    • @sjethvani - 如果您发现答案有帮助,如果您能帮助接受它,那就太好了。
    • 感谢您的回答。我实际上使用这个 git 项目来完成我的任务 (github.com/sterodium/selenium-grid-extensions) 。它使用相同的方法创建 servlet,在 Hub 和 Node 上注册它们并通过 HTTP Post 上传文件。
    • 我尝试了注册 2 个 servlet 的解决方案(1 个用于发送文件,1 个用于在其下放置 ROBOT 代码)。发送文件工作正常,它在 selenium 节点上创建临时目录并将粘贴的文件从 HUB 复制到 Node 。然而,包含 ROBOT 代码的第二个 servlet 不工作。知道为什么会这样吗?
    • 如果您的 ROBOT 代码在本地工作正常,那么没有理由通过调用 servlet 在远程模式下不能正常工作,因为它仍然是在不同的地方调用的相同代码方式(通过 GET/POST Http 调用)。您是否尝试过查看节点窗口以查看发生了什么?您是否在 servlet 中添加了任何日志等?你看到了什么错误.. 有很多我们还不知道的信息。您需要分享该信息。
    猜你喜欢
    • 2015-02-22
    • 2013-07-23
    • 2016-05-25
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    相关资源
    最近更新 更多