【问题标题】:Spring invoke method before every method call在每个方法调用之前 Spring 调用方法
【发布时间】:2013-12-11 12:49:35
【问题描述】:

有什么方法可以在每个 bean 的方法调用之前调用方法吗?

我在春天使用硒和黄瓜。由于这个原因,所有页面都是单例的,而且由于我使用的是 @FindBy 注释,所以我想在每次使用页面时调用 PageFactory.initElements(driver, object)。

使用标准页面对象模式,这将通过在构造函数中调用它来完成。

我想避免的是在每个方法中指定这样的方法:

public void clickThis() {
    PageFactory.initElements(driver, this)
    ...
}

public void clickThat() {
    PageFactory.initElements(driver, this)
    ...
}

我不想返回新页面,因为它们将无法在功能之间共享。

【问题讨论】:

    标签: java spring spring-aop


    【解决方案1】:

    Spring 具有出色的 AOP 支持,您可以从中受益。

    为了解决你的问题,你必须做的是。

    1. 通过在 Spring 配置文件中添加 <aop:aspectj-autoproxy/> 在 Spring 中启用方面。

    2. 创建一个简单的类并将其注册为一个方面。

    来源:

    <bean id="myAspect" class="some.package.MyFirstAspect">
       <!-- possible properties ... for instance, the driver. -->
    </bean>
    

    MyFirstAspect 类。请注意,用@Aspect 注释标记。在类中,您必须创建一个方法并将其注册为@Before 建议(建议在方法执行之前、之后或周围运行)。

    package some.package;
    import org.aspectj.lang.annotation.Aspect;
    
    @Aspect
    public class MyFirstAspect {
        @Before("execution(* some.package.SomeClass.*(..))")
        public void initElements() {
            //your custom logic that has to be executed before the `clickThis`
        }
    }
    

    更多信息:

    【讨论】:

    • 嗯,但我需要引用类的实际实例。
    • 我正在考虑跳过 @FindBy 注释并在每次点击时使用 driver.findElement(By selector) 。感觉像是最“可读”的解决方案。
    • 不,您没有引用实际实例。注释会为您执行此操作
    • 我的意思是我要运行的代码需要对实例的引用。 PageFactory.initElements(driver, this)
    • 嗯...您可以通过在方面注入一个属性来处理这个问题,而不是通过this 来传递注入的属性。
    【解决方案2】:

    正如 kocko 所说,您可以使用 aspects

    除此之外:我不确定我是否理解正确,但你真的需要在每个方法调用中调用 initElements 吗?或者就在您创建页面时。在以后的情况下,我建议创建一个抽象页面,您可以在其中调用您的 initElements 方法并从中继承所有其他页面。

    【讨论】:

    • 自第一次创建以来页面的状态可能已经改变。例如,一个菜单已被切换并且要在 java 类中获取更新的 WebElements,我必须再次使用 initElements。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 2023-04-08
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    相关资源
    最近更新 更多