【问题标题】:Handling OS windows in Ubuntu without using Robot class (Selenium)在不使用机器人类 (Selenium) 的情况下处理 Ubuntu 中的操作系统窗口
【发布时间】:2016-11-22 11:02:04
【问题描述】:

我正在从 Jenkins 运行我的 selenium 脚本,当执行该脚本时,它会在专门用于 Selenium 测试的机器上运行。但我有一个问题。如下所述,我正在使用 Robot 类执行一些操作:

1) 点击图片上传图标。 2) 与 Ubuntu OS 相关的窗口(文件上传)打开。 3)我必须过去图像的位置。 4) 然后点击打开。

所有这些在本地机器上都可以正常工作。但由于 Robot 类的限制,在远程机器上失败。

谁能帮我解决这个问题?

为了更清楚,我附上了一张快照。

<div class="dropify-wrapper">
    <div class="dropify-message">
        <span class="file-icon"/>
        <p>Drag and drop a file here or click</p>
        <p class="dropify-error">Sorry, this file is too large</p>
    </div>
    <input id="category_tile_upload" class="dropify" data-default-file="" type="file"/>
    <button class="dropify-clear" type="button">Remove</button>
    <div class="dropify-preview">
        <span class="dropify-render"/>
        <div class="dropify-infos">
            <div class="dropify-infos-inner">
                <p class="dropify-filename">
                    <span class="file-icon"/>
                    <span class="dropify-filename-inner"/>
                </p>
                <p class="dropify-infos-message">Drag and drop or click to replace</p>
            </div>
        </div>
    </div>
</div>

【问题讨论】:

  • 如果您需要将文件上传到网络应用 UI,您可能需要使用 driver.find_element_by_xpath("//input[@type='file']").send_keys(path_to_file)Python 示例)而不是 Robot 类...
  • @Andersson 我没有可以发送密钥的文本框。它不是浏览器元素,所以我无法识别。
  • 您正在尝试单击按钮(图标)。我想这个元素(例如&lt;div class="Upload button"&gt;)有嵌入元素&lt;input type="file"&gt;,它实际上应该从文件上传对话框中获取值......为您的上传按钮显示HTML
  • @Andersson 是的。但现在的问题是我正在使用网格执行测试。当它在远程机器上执行时,本地路径将无效。无论如何这可以处理吗?像我可以使用 getResourceAsStream 吗?
  • Robot 使用的测试文件在哪里?您可以设置文件的相对路径

标签: java selenium selenium-webdriver


【解决方案1】:

这不应该用Robot 类来完成,因为它可以使用 Selenium 来解决。不要点击打开上传窗口的元素,而是使用:

如果您的输入有 ID,最好使用 By.id("inputID"),否则:

WebElement inputElement = driver.findElement(By.cssSelector("input[type='file']"));
element.sendKeys("/full/path/to/your/file");

并获取路径,或者使用:

String pathToFile = System.getProperty("user.dir") + "/src/resources/your.file; 

要使用getResourceAsStream(),您可以:

try (InputStream in = this.getClass().getResourceAsStream(fileName)) {
    return getStringFromInputStream(in);
} catch (IOException e) {
    // handle
}

private String getStringFromInputStream(InputStream is) {

    BufferedReader br = null;
    StringBuilder sb = new StringBuilder();

    String line;
    try {
        br = new BufferedReader(new InputStreamReader(is));

        while ((line = br.readLine()) != null) {
           sb.append(line);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {

        if (br != null) {
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    return sb.toString();
}

【讨论】:

  • 谢谢。但我有一个疑问。我的代码执行开始于 jenkins 服务器。最新代码被拉出并启动集线器。我有节点在远程机器上连续运行。集线器启动的那一刻,节点连接并开始执行测试用例。我的文件位于 jenkins 服务器上的“/src/test/resources”文件夹下。现在浏览器在运行节点的机器上打开。那么这将如何工作。所有的资源会同步到所有节点吗?
  • 我说的原因是因为我尝试了这个选项。在打开浏览器的节点机器上显示“找不到文件”。
  • 如果我没记错的话,你的怀疑是正确的。您需要在从属设备上预先设置文件,或者在上传之前将其从服务器复制到从属设备...参见此处:stackoverflow.com/questions/3812673/…
  • 我会检查的。
【解决方案2】:

解决问题的常用方法是使用

WebElement file_input = driver.findElement(By.id("category_tile_upload"));
file_input.sendKeys("/path/to/file/to/upload");

实现这些代码行的结果是什么?

【讨论】:

  • 正如我提到的,如果集线器和节点都在同一台机器上运行,这适用于。但是如果集线器和节点是不同的机器,那么它不是。对我来说,詹金斯在“服务器 A”上。最新的代码在这台机器上检出并实例化一个集线器。然后在服务器 B 上运行的节点连接到服务器 A 上的集线器,然后开始执行测试用例。在给定的解决方案中,它选择服务器 A 中文件的路径并将其传递给在 B 上执行的浏览器。保存时失败,因为文件不在服务器 B 上。
  • 我对所描述的方案有点困惑:) Jenkins 应该使用位于 VCS 某处的代码(例如 git repo),但测试实际上是在远程机器上开始的,对吧?
  • 对不起。我会更清楚。我已将 Jenkins 配置为从“git”检查最新代码并运行相同的代码。在 selenium 项目中,我有用于启动“集线器”的启动脚本。我的 Jenkins 服务器就是我所说的“服务器 A”。现在在“服务器 B”上,我的节点正在运行,这是执行测试的地方。现在“文件 A”位于项目的资源文件夹中,项目已在“服务器 A”中签出。当我提取文件的路径时,它会显示为“/SERVERA/somepath/fileA.jpg”。
  • 这个可以帮助stackoverflow.com/questions/16205299/… 吗?
  • 我还没有找到使用 EventFiringWebDriver 类的可行解决方案。但是使用 remoteWebDriver 它可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-16
  • 2017-01-02
  • 1970-01-01
  • 1970-01-01
  • 2020-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多