当前位置: 首页 > 知识库问答 >
问题:

捕获所有带有@FindBy注释的WebElements的切入点

井镜
2023-03-14

我的测试框架使用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实例进行分配)。

我希望在实例化这些webElements后立即捕获它们,并用@FindBy/@FindAll进行注释。我不想为每个页面类编写单独的切入点。怎么做?

共有1个答案

蒯华彩
2023-03-14

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

<weaveDependencies>
    <weaveDependency>
        <groupId>java</groupId>
        <artifactId>jre-runtime</artifactId>
    </weaveDependency>
...
</weaveDependencies>
 类似资料:
  • 服务实现 但是,如果我将注释移动到公共接口方法实现,我的方面就会被触发。我应该如何定义我的切入点或配置我的方面来使我的原始用例工作?

  • 问题内容: 我想用指定的注释(例如@Monitor)监视所有类的所有公共方法(注意:注释在类级别)。可能的切入点是什么?注意:我正在使用@AspectJ样式的Spring AOP。 问题答案: 你应该将类​​型切入点与方法切入点结合使用。 这些切入点将在标记为@Monitor的类中查找所有公共方法: 为结合了前两者的最后一个切入点提供建议,你就完成了!

  • 问题内容: 我正在尝试定义一个切入点,该切入点将捕获用(ie)注释的每个方法。这是我自己的注释。 此外,我想访问该方法的第一个参数,该参数将是类型。也许还有其他争论,但我不在乎。 编辑 这就是我现在所拥有的。我不知道如何传递带有注释的方法的第一个参数。 问题答案: 这样的事情应该做:

  • add:如果我将方法存根添加到Fragment2中,就可以开始使用next annotation,但这是一个非常难看的解决方案 解决方案:多亏了@Kriegaex,我找到了解决方案:

  • 问题内容: 我有两个注释,并且,如果我在方法周围有切入点,我该如何提取用注释的方法的参数? 例如: 问题答案: 我围绕着另一个不同但相似的问题的其他答案对解决方案进行了建模。 我必须遍历目标类的原因是因为被注释的类是接口的实现,因此返回null。

  • 我将selenium与java和以下pom包一起使用, 我可以使用WebDriver和其他对象,但当我试图使用注释@findby时,我的项目似乎找不到满足它的包“不能解析为类型”,也不建议使用selenium包。 selenium的注释系统位于哪个maven存储库中?还是我错过了什么? 谢谢。