2017-05-03 9 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; 
}} 

ログインページClasssの要素を保持している:

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); 
} 

ご覧のとおり、私はPageFactoryをステップクラス内で使用しています。私はこれをやって嫌い、PageFactoryをどこか別の場所に配置したいと思っています。

クラスを追加または削除しないで、どこでPageFactoryクラスを配置できますか?どんな助けもありがとう。

+0

こんにちは、このリンクを確認してください - http://stackoverflow.com/questions/43727174/where-should-the-page-objects-be-instantiated –

+0

キュウリを使用しているので、DIフレームワークインスタンスを管理するには、picocontainerにコードの変更を必要とせず、コンストラクタインジェクションを使用して、キュウリの箱から出てきます。 pomに依存関係を追加するだけです。 LoginPageとLoginクラスを持つ目的は何ですか?それらを1つに結合して、webelementsの静的キーワードを削除します。ページオブジェクトのコンストラクタでpagefactoryコードを使用します。 – Grasshopper

+0

余分なクラスを削除し、その代わりにPageFactoryをコンストラクタに配置しました。 –

答えて

0

これを行うには、Inversion Of Control/Dependency Injectionフレームワークを使用するのが最善の方法であることがわかりました。私は春を使用していますが、他にもオプションがあります。 Guice,Weld,Picocontainer

春を使用すると、@Componentのすべてのページに注釈を付け、PageObject Beanポストプロセッサを追加して、ページの作成時にすべてのページ要素を初期化できます。

このアプローチはまた、Aslak Hellesoy(Cucumber Ltd創設者)によってCucumber for Java Bookによって推奨されています。キュウリも提供しています

関連する問題