在运行集成测试时, 在每个步骤之后 捕获屏幕截图的最佳方法是什么?
使用Selenium(3.0.1)和Cucumber(1.2.4)用Java编写测试。
下面是用于在测试后获取屏幕截图的代码,但是在每种方法后面都标有@ Given,@ When,@ Then时,我需要屏幕截图。
@After public void after(Scenario scenario){ final byte[] screenshot = driver.getScreenshotAs(OutputType.BYTES); scenario.embed(screenshot, "image/png"); }
谢谢您的任何提示。
使用方面解决了这个问题。非常棘手,请注意注释:
@After("call(public * cucumber.runtime.StepDefinitionMatch.runStep(..)) && within(cucumber.runtime.Runtime)")
下面是完整的代码,由Viviana Cattenazzi编写。
pom.xml
<dependencies> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.9</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.8.9</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjtools</artifactId> <version>1.8.9</version> </dependency> <dependency> <groupId>info.cukes</groupId> <artifactId>cucumber-core</artifactId> <version>1.2.4</version> </dependency> </dependencies> ...... <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>aspectj-maven-plugin</artifactId> <version>1.10</version> <configuration> <weaveDependencies> <weaveDependency> <groupId>info.cukes</groupId> <artifactId>cucumber-core</artifactId> </weaveDependency> </weaveDependencies> <showWeaveInfo>true</showWeaveInfo> <source>1.8</source> <target>1.8</target> <complianceLevel>1.8</complianceLevel> </configuration> <executions> <execution> <phase>process-test-classes</phase> <goals> <goal>compile</goal> <goal>test-compile</goal> </goals> </execution> </executions> </plugin>
.......
StepsInterceptor.java
@Aspect public class StepsInterceptor { @After("call(public * cucumber.runtime.StepDefinitionMatch.runStep(..)) && within(cucumber.runtime.Runtime)") public void beforeRunningStep(JoinPoint thisJoinPoint) throws Exception { try { StepDefinitionMatch stepDefinitionMatch = (StepDefinitionMatch) thisJoinPoint.getTarget(); Step step = (Step) retrievePrivateField(stepDefinitionMatch, "step"); String stepName = step.getKeyword().trim(); if ("Given".equals(stepName) || "When".equals(stepName)) { Object theRealStepDef = extractJavaStepDefinition(stepDefinitionMatch); // take screen shot here } } catch (ClassCastException exc) { .... } } }