Is there any way to invoke a method before every method call for a bean?
Im using selenium and cucumber with spring. All the pages are singletons because of this and since I'm using @FindBy annotations I want to invoke PageFactory.initElements(driver, object) every time a page is used.
Using a standard page object pattern, this would be done by invoking it in the constructor.
What I'd like to avoid is to specify in each method the method like so:
public void clickThis() {
    PageFactory.initElements(driver, this)
    ...
}
public void clickThat() {
    PageFactory.initElements(driver, this)
    ...
}
I dont want to return the new page since they will not be able to be shared between features.
Spring has a great AOP support and you can get benefits of it.
What you have to do in order to solve your problem is.
Enable aspects in Spring by adding a <aop:aspectj-autoproxy/> in your Spring configuration file.
Create a simple class and register it as an Aspect.
Source:
<bean id="myAspect" class="some.package.MyFirstAspect">
   <!-- possible properties ... for instance, the driver. -->
</bean>
The MyFirstAspect class. Note that is marked with the @Aspect annotation. Within the class, you will have to create a method and register it as a @Before advice (an advice runs before, after or around a method execution). 
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`
    }
}
More info:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With