java - AspectJ - 捕获所有用 @FindBy 注释的 WebElement 的切入点

标签 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 确定测试处理的 Web 元素。这样的页面有 50 个。

当使用 PageFactory 实例化页面时,将实例化 webElement 字段(分配一个与 @FindBy 中的值相对应的 WebElement 实例)。

我想在实例化这些带有 @FindBy/@FindAll 注释的 webElements 时立即捕获它们。 我不想为每个页面类编写一个单独的切入点。 如何做到这一点?

最佳答案

由于 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>

关于java - AspectJ - 捕获所有用 @FindBy 注释的 WebElement 的切入点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47441589/

相关文章:

java - 什么是类型和类型 token ?

java - 如何在 cs50 第一题中获取用户的输入?

selenium - 使用 Selenium 处理验证码

java - 如何使用 Selenium 关注文件对话框来选择文件

java - 我的 SpringAOP 演示代码中出现了 null 错误

java - 使用 Spring/AspectJ 的架构实现

Autowiring 的 HTTPServletRequest bean 的 Spring AOP 和方面线程安全

java - 使用 servlet、过滤器的 PoSTLogin Hook 功能

java getBytes() 在 python 中等效

java - 无法选择隐藏链接 - selenium