我不想硬编码映像目录的完整路径,这是我的代码:
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)
我认为该脚本无法找到图像目录。能告诉我如何解决这个问题吗?
答案 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
应为baseImage
或baseImageStream
。存在此约定是因为.
严重超载,因此命名约定使aPackage.AClass与AClass.aVariable不同。]