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