AspectJ - 用于捕获所有使用@FindBy

时间:2017-11-22 18:26:33

标签: java selenium aop aspectj page-factory

我的测试框架使用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。 我不想为每个页面类写一个单独的切入点。 怎么做?

1 个答案:

答案 0 :(得分:0)

由于通过反射分配的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>