繁体   English   中英

使用远程Webdriver在远程计算机上打开html文件时显示“找不到文件”

[英]opening a html file on remote machine using remote webdriver says “file not found”

我的测试在git中进行,我正在使用远程Webdriver在网格上运行它们。 我必须在网格中打开静态HTML。 为此,我在睾丸所在的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文件可以正常打开,但在网格上显示“找不到文件”。 这是在网格中打开的页面的屏幕截图。 在此处输入图片说明

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

您需要了解使用网格运行和本地运行之间的区别。

1)在本地运行将涉及2台机器:
一种。 脚本机器(您的脚本放置在哪个机器上)
b。 浏览器机器(在运行过程中打开浏览器)

在这种情况下,两台计算机是同一台计算机,这是您的本地计算机。

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

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

关于网格的更多内容,硒网格由一个主节点和多个节点组成。

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

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

  3. 在大多数情况下,即使主服务器允许这样做,也不会将其本身注册为节点。 因为我们希望主人只是要管理节点。 同时充当浏览器机器将影响其在主角色上的性能。

    即使您可以将本地计算机注册为节点,但也无法始终控制master来将本地计算机分配给您(除非只有一个节点),因此在脚本和浏览器计算机时它也无法打开静态html文件不是同一个人。

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

以前的方法仅需要进行詹金斯调整(代理设置+强制在新提出的从属上执行作业)。

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

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

我注意到我公司的jenkins作业具有“工作区”,该工作区将列出git中的所有文件夹/文件,每个文件都是一个以jenkins服务器地址为前缀的url链接,如果单击它,则可以在使用http协议的浏览器中打开它。

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

我的公司Jenkins Job的工作区屏幕截图,单击此处查看它的内容

以下是上图中的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 / protractor-cucumber-tey / Readme.md

对于您的情况,您的静态html文件将具有固定的url,您可以在命令行中对url进行硬编码,或在下面的envirorment变量结合使用:

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

JOB_URL是jenkins作业内置环境变量,jenkins将为您计算其值。

当在本地运行时,您可以将URL前缀与file://一起传递

代替user.dir系统属性,我将文件存储在resources文件夹下,并使用class.getResource()获取文件路径。 如果资源文件存储在同一类中,这是最简单的方法。

如果必须将其存储在其他位置,则getResource()不知道如何将其传递回正确的类。 您必须将文件写入系统的temp目录,然后从那里读取它。 这样的事情(假设包含文件的类名为YourClass):

        Path tmpFile = Files.createTempFile(FilenameUtils.getBaseName(filename), "html");
        Files.copy(YourClass.class.getResourceAsStream(filename), tmpFile, StandardCopyOption.REPLACE_EXISTING);
        return tmpFile.toString();

这将在本地服务器和构建服务器中都起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM