读取与测试位于同一包中的png文件,以便使用Sikuli进行图像比较

时间:2014-03-04 08:08:12

标签: java selenium selenium-webdriver

我不想硬编码映像目录的完整路径,这是我的代码:

InputStream BaseImage = Thread.currentThread().getContextClassLoader().getResourceAsStream("/images/image1.png");


        try{

            Pattern image = new Pattern(String.valueOf(BaseImage));
            image.similar((float)0.99);
            Screen screen=new Screen();
            screen.wait(image, 10);
            Match match = screen.find(image);
            Assert.assertTrue(match.getScore() < 10);
        }catch(Exception e){
            e.printStackTrace();
            Assert.fail();

        }
    }

这是绝对路径 - /Users/xxxx/xxxx/selenium/src/test/java/com/lexus/systemtests/images/image1.png我想修改。

我在运行Selenium测试时看到的错误消息是:

FindFailed:在磁盘上找不到ImageFile null   第1671行,在文件Region.java中

at org.sikuli.script.Region.wait(Region.java:1671)
at com.lexus.systemtests.pages.SikuliTest.screenimage_has_to_match_saved_image(SikuliTest.java:64)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at cucumber.runtime.Utils$1.call(Utils.java:35)
at cucumber.runtime.Timeout.timeout(Timeout.java:12)
at cucumber.runtime.Utils.invoke(Utils.java:31)
at cucumber.runtime.java.JavaStepDefinition.execute(JavaStepDefinition.java:35)
at cucumber.runtime.StepDefinitionMatch.runStep(StepDefinitionMatch.java:38)
at cucumber.runtime.Runtime.runStep(Runtime.java:289)
at cucumber.runtime.model.StepContainer.runStep(StepContainer.java:44)
at cucumber.runtime.model.StepContainer.runSteps(StepContainer.java:39)
at cucumber.runtime.model.CucumberScenario.run(CucumberScenario.java:40)
at cucumber.runtime.model.CucumberFeature.run(CucumberFeature.java:116)
at cucumber.runtime.Runtime.run(Runtime.java:120)
at cucumber.runtime.Runtime.run(Runtime.java:108)
at cucumber.api.cli.Main.run(Main.java:26)
at cucumber.api.cli.Main.main(Main.java:16)

我认为该脚本无法找到图像目录。能告诉我如何解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

首先使用调试器或println()语句查看getResource(path)返回的内容。然后你可以判断URL是否是正确的目录,如果不是,如何调整它。

如果我没弄错的话,通常的情况是在对象上调用getResource()getResourceAsStream(),而不是类加载器。例如。 SikuliTest.class.getResource("/images/image1.png")。这可能没什么区别。

如果您希望它在测试类的包中查找,您可能需要将相对路径(不以/开头)传递给它。

Pattern image = new Pattern(String.valueOf(BaseImage));

我假设Pattern是Selenium类,而不是java.util.regex.Pattern。这行代码不喜欢从InputStream读取图像的可行方法,但我不知道Pattern()构造函数需要什么。

[最后,有一个强大的Java命名约定,用于启动带有大写字母的类名和带有小写字母的变量名。因此BaseImage应为baseImagebaseImageStream。存在此约定是因为.严重超载,因此命名约定使aPackage.AClass与AClass.aVariable不同。]