使用远程webdriver在远程计算机上打开一个html文件说"找不到文件"

时间:2017-09-08 20:08:17

标签: java selenium selenium-webdriver selenium-grid

我的测试是在git中,我使用Remote Webdriver在网格上运行它们。 我必须在网格中打开一个静态HTML。为此,我已经在我的testis所在的git repo中检查了HTML文件。我在测试中有类似下面的东西打开文件(在我的本地工作)。

    public void openHtmlFile()  {
        String htmlFile=new TestHelper().getImportFile(TestConstants.OCI_HTML_FILE);
// Below gives exact path of the HTML file. Like when I am running it in my local, it gives exact path of the HTML file where it is kept in git repo in my local.
        log.info("Going to URL: " + htmlFile);
        Path sampleFile= Paths.get(htmlFile);
        driver.get(sampleFile.toUri().toString());
    }

当我在本地运行测试时,HTML文件打开正常,但在网格上显示,"文件未找到"。这是在网格中打开的页面的屏幕截图。 enter image description here

它导航到URL,这是git工作区中该文件的绝对路径,显然,节点不会找到该文件,因为它是一台不同的机器。我该如何处理这种情况?为了添加更多细节,我正在通过Jenkins运行测试,所以很明显我首先在Jenkins slave中克隆git repo,然后测试执行。但Jenkins slave和grid节点是不同的机器,因此文件没有找到问题。

4 个答案:

答案 0 :(得分:0)

你需要了解run with grid和run local之间的区别。

1)运行本地将涉及2台机器:
一个。脚本机(你的脚本放在哪个)
湾浏览器机器(在运行期间打开浏览器)

在这种情况下,两台机器都是同一台机器,它是您的本地机器。

2)用网格运行将涉及3台机器:
一个。脚本机器 湾浏览器机器
C。网格服务器

在这种情况下,3台机器在大多数情况下是3台不同的机器。
当浏览器机器尝试打开静态html时,它只能到 从自身找到静态html文件,但是静态html文件 在浏览器机器上不存在,它在脚本机器上。所以无法打开。

关于网格的更多信息,硒网格由一个主节点和几个节点组成。

  1. master也调用网格服务器,它管理所有注册节点 根据您所需的功能查找并分配空闲节点。 (你永远无法知道在运行之前将分配哪个节点, 由大师决定。 )

  2. 节点也调用浏览器机器,任何机器都可以注册到主机

  3. 在大多数情况下,即使允许,我们也不会将主服务器本身注册为节点 要做到这一点。因为我们希望master只管理节点。作为一个工作 同时,浏览器机器将影响其在主角色上的表现。

    即使您可以将本地计算机注册为节点,但您无法控制 总是把你的本地机器分配给你(除非只有一台 节点),所以它也不能在脚本和浏览器机器上打开静态html文件 是不一样的。

答案 1 :(得分:0)

您应该在Jenkins slave上运行代码,或者在实际交互之前将所需文件传输到目标计算机。

以前的方法只需要Jenkins调整(代理设置+强制作业在新增的从属服务器上执行)。

后一种方法更多地是关于在机器之间发送文件的一些专用工具或接口用法,例如 scp sftp rmi 等。

您甚至可以为文件传输或远程文件系统管理创建微服务。

答案 2 :(得分:0)

我注意到我的公司jenkins工作有'工作区',它将列出来自git的所有文件夹/文件,每个文件都是一个以jenkins服务器地址为前缀的URL链接,如果点击它,它可以在浏览器中用http打开协议。

我认为您可以修改测试脚本以从命令行接受页面URL,因此您可以在jenkins作业配置中传递其值。

My company Jenkins Job's workspace screenshot, click here to see what's it

以下是上图中Readme.md的网址:
https://[ jenkins服务器地址] / cm2 / job / PI / job / PIY-PIT / job / DEV / job / PL000139 / job / PR104403 / job / Taxable-Equivalent%20Yields%20(AP002363)/ job / TEY %20Browser%20Test / WS /量角器黄瓜-TEY / Readme.md

对于你的情况,你的静态html文件将有一个固定的url,你可以在命令行硬编码url,或使用下面的环境变量combine:

$ {JOB_URL} / ws / [静态html文件的相对路径从项目文件夹开始]
例如:$ {JOB_URL} /ws/protractor-cucumber-tey/Readme.md

JOB_URL是jenkins作业内置环境变量,jenkins会为你计算它的值。

在本地运行时,您可以使用file://

传递url前缀

答案 3 :(得分:0)

我将该文件存储在MyModel.observe('after save', function(ctx, next) { if (ctx.instance) { // When Create (POST) // ctx.instance have the json properties console.log("Triggers after create"); } else { // When Update (UPDATE) // ctx.data have the json properties console.log("Triggers after update"); } next(); }); 文件夹下,并使用class.getResource()获取文件路径,而不是user.dir系统属性。如果资源文件存储在同一个类中,这是最简单的方法。

如果你必须将它存储在其他地方,那么resources不知道如何将它传递回正确的类。您必须将文件写入系统的临时目录,然后从那里读回来。这样的事情(假设包含该文件的类名为YourClass):

getResource()

这适用于本地服务器和构建服务器。