AspectJ - 捕获所有使用 @FindBy 注释的 WebElements 的切入点
AspectJ - pointcut to capture all WebElements annotated with @FindBy
我的测试框架使用了selenium的PageFactory和Lambok。我想编写一个方面来捕获测试流程在 运行.
时遇到的所有 Web 元素
典型的页面如下所示:
@Slf4j
public class MyCustomPage {
@Inject
private IWebDriverSet driverSet;
@Getter
@FindBy(id = PAGE_ROOT)
private WebElement root;
@FindAll({
@FindBy(css = FOOT_BAR),
@FindBy(css = FOOT_BAR_B)
})
private WebElement navBar;
}
@FindBy 确定测试处理的webelement。有 50 个这样的页面。
当使用 PageFactory 实例化页面时,webElement 字段被实例化(分配有对应于 @FindBy 中的值的 WebElement 实例)。
我想在实例化后立即捕获这些用@FindBy/@FindAll 注释的webElements。
我不想为每个页面写一个单独的切入点 class。
怎么做?
由于 WebElement 的值是通过反射分配的,因此您无法使用 set() 切入点指示符拦截它。但是您可以跟踪对 java.lang.reflect.Field.set
的所有调用
@After("call(* java.lang.reflect.Field.set(..)) && args(obj, value) && target(target)")
public void webelementInit(JoinPoint jp, Object obj, Object value, Field target) {
//obj - instance of a class (page object) that declares current field
//value - new field value (instantiated WebElement)
//field - current field
//you can filter calls to the fields you need by matching target.getDeclaringClass().getCanonicalName() with page object's package
//for example:
//if(target.getDeclaringClass().getCanonicalName().contains("com.example.pageobjects")) {
//do stuff
//}
}
在这种情况下,您需要在 pom.xml
的依赖项部分定义 rt.jar
<dependencies>
<dependency>
<groupId>java</groupId>
<artifactId>jre-runtime</artifactId>
<version>1.8</version>
<scope>system</scope>
<systemPath>${java.home}/lib/rt.jar</systemPath>
</dependency>
...
</dependencies>
并且在 aspectj-maven-plugin 的 weaveDependencies 部分
<weaveDependencies>
<weaveDependency>
<groupId>java</groupId>
<artifactId>jre-runtime</artifactId>
</weaveDependency>
...
</weaveDependencies>
我的测试框架使用了selenium的PageFactory和Lambok。我想编写一个方面来捕获测试流程在 运行.
时遇到的所有 Web 元素典型的页面如下所示:
@Slf4j
public class MyCustomPage {
@Inject
private IWebDriverSet driverSet;
@Getter
@FindBy(id = PAGE_ROOT)
private WebElement root;
@FindAll({
@FindBy(css = FOOT_BAR),
@FindBy(css = FOOT_BAR_B)
})
private WebElement navBar;
}
@FindBy 确定测试处理的webelement。有 50 个这样的页面。
当使用 PageFactory 实例化页面时,webElement 字段被实例化(分配有对应于 @FindBy 中的值的 WebElement 实例)。
我想在实例化后立即捕获这些用@FindBy/@FindAll 注释的webElements。 我不想为每个页面写一个单独的切入点 class。 怎么做?
由于 WebElement 的值是通过反射分配的,因此您无法使用 set() 切入点指示符拦截它。但是您可以跟踪对 java.lang.reflect.Field.set
@After("call(* java.lang.reflect.Field.set(..)) && args(obj, value) && target(target)")
public void webelementInit(JoinPoint jp, Object obj, Object value, Field target) {
//obj - instance of a class (page object) that declares current field
//value - new field value (instantiated WebElement)
//field - current field
//you can filter calls to the fields you need by matching target.getDeclaringClass().getCanonicalName() with page object's package
//for example:
//if(target.getDeclaringClass().getCanonicalName().contains("com.example.pageobjects")) {
//do stuff
//}
}
在这种情况下,您需要在 pom.xml
的依赖项部分定义 rt.jar<dependencies>
<dependency>
<groupId>java</groupId>
<artifactId>jre-runtime</artifactId>
<version>1.8</version>
<scope>system</scope>
<systemPath>${java.home}/lib/rt.jar</systemPath>
</dependency>
...
</dependencies>
并且在 aspectj-maven-plugin 的 weaveDependencies 部分
<weaveDependencies>
<weaveDependency>
<groupId>java</groupId>
<artifactId>jre-runtime</artifactId>
</weaveDependency>
...
</weaveDependencies>