2017-05-03 78 views
1

目前我有以下使用PageFactory初始化我使用的元素的類。Selenium框架中的PageFactory放置

基類:

public class BaseClass { 

public static WebDriver driver; 
public static boolean bResult; 

public BaseClass(WebDriver driver){ 
    BaseClass.driver = driver; 
    BaseClass.bResult = true; 
}} 

登錄頁面班組長持有的元素:

public class LoginPage extends BaseClass{ 

public LoginPage(WebDriver driver) 
{ 
    super(driver); 
} 

@FindBy(how= How.XPATH, using="//input[@placeholder='Username']") 
public static WebElement username; 

然後我使用一個單獨的登錄類爲我的行爲:

public class Login { 

//Login 
public static void enterUsernamePassword(String username, String password) throws Exception{ 
    LoginPage.username.sendKeys(username); 
    LoginPage.password.sendKeys(password); 
} 

然後我的腳步等級:

@When("^I enter a valid username (.*) and password (.*)") 
public void I_enter_a_valid_username_and_password(String username, String password) throws Throwable 
{ 
    PageFactory.initElements(driver, LoginPage.class); 
    Login.enterUsernamePassword(username, password); 
} 

正如你所看到的,我在Steps類中使用了PageFactory。我討厭這樣做,並希望將PageFactory放在其他地方,而不是在步驟類中。

不添加或刪除任何類,我可以在哪裏放置PageFactory類?任何幫助,將不勝感激。

+0

嗨,請檢查這個鏈接 - http://stackoverflow.com/questions/43727174/where-should-the-page-objects-be-instantiated –

+0

因爲你使用的是黃瓜,你可以使用DI框架要管理實例,請嘗試picocontainer不需要更改代碼,它使用構造函數注入,並使用黃瓜開箱即用。只需在pom中添加依賴項即可。有一個LoginPage和Login類的目的是什麼?將它們組合成一個並刪除webelements的靜態關鍵字。在pageobject的構造函數中使用pagefactory代碼。 – Grasshopper

+0

我已經刪除了額外的類,並將PageFactory放入構造函數中。 –

回答

0

我發現最好的方法是使用Inversion Of Control/Dependency Injection框架。我使用Spring,但也有其他選擇,例如Guice,Weld,Picocontainer

使用Spring,您可以用@Component註釋所有頁面,並在創建頁面時添加PageObject Bean後處理器以初始化所有頁面元素。

Aslak Hellesoy(Cucumber Ltd創始人)的Cucumber for Java Book也推薦這種方法。黃瓜也提供