2013-12-11 78 views
3

有沒有辦法在bean的每個方法調用之前調用方法?每個方法調用之前的Spring調用方法

我用春天的硒和黃瓜。所有的頁面都是單例,因爲這一點,因爲我使用@FindBy註釋我想每次使用頁面時調用PageFactory.initElements(驅動程序,對象)。

使用標準的頁面對象的模式,這將在構造函數中調用它來完成。

我想要什麼,以避免在每個方法來指定,像這樣的方法:

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

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

我不想返回新頁面,因爲它們將不能夠進行功能之間共享。

回答

0

正如kocko提到你可以使用aspects

旁邊的是:我不知道,如果我理解正確的你,但你真的需要調用initElements每個方法調用?或者只是當你創建你的頁面。在後面的例子中,我會建議創建一個抽象頁面,在其中調用initElements方法並從中繼承其他每個頁面。

+0

頁面的狀態可能會因爲它的第一個創造改變。例如,一個菜單已經被切換,並且在java類中獲得更新的WebElements,我不得不再次使用initElements。 – user2904222

2

春天有很大的AOP支持,你可以得到的好處它。

你有什麼爲了解決你的問題是這樣做。

  1. 通過在Spring配置文件中添加一個<aop:aspectj-autoproxy/>來啓用Spring的各個方面。

  2. 創建一個簡單的類並將其註冊爲一個看點。

來源:

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

MyFirstAspect類。請注意,標記爲@Aspect註釋。在課堂中,您將不得不創建一個方法並將其註冊爲一個建議(建議在方法執行之前,之後或周圍運行)。

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` 
    } 
} 

更多信息:

+0

嗯,但我需要引用該類的實際實例。 – user2904222

+0

我正在考慮跳過@FindBy批註,並在每次單擊時使用driver.findElement(按選擇器)。感覺像最「可讀」的解決方案。 – user2904222

+0

不,你沒有引用實際的實例。註釋爲你做這個 –

相關問題