2016-11-17 6 views
0

基本的に、WebElementにtext()が含まれていることをテストクラスからアサーションしたいと考えています。私のWebElementsはすべて私のpage.classに定義されているので、これを公開する必要があります。テストクラスのPageFactory POMのWebElementsを使用する

webdriverと要素にいくつかの問題があります。複数のテストクラスがWebElementsをページクラスから同時にアクセスしている可能性があります。私の質問は、WebElementsがプライベートでなければならない理由はありますか?

コード例:

私が見てきたすべてのPageFactoryチュートリアルは

@FindBy(xpath = "//*[@id='searchStringMain']") 
    private WebElement searchField; 

のように、あなたのWebElementsをプライベートにするためにしかし、要素は(他のクラスからの)テキストが含まれていることを主張すると言う、私が定義する必要がありますこのようにそれら:

@FindBy(xpath = "(//*[contains (text(),'Hrs')])[2]") 
    public static WebElement yourLoggedTime; 
+0

PageObjectsの目的は、ページ要素の詳細をカプセル化することです。あなたがそれらを公開した場合、それらのいずれかが変更された場合(そうでない場合)は、あなたが参照したすべての場所を狩り、変更を複製する必要があります。ページオブジェクトにWeb要素をカプセル化することによって、それを一度変更します。テストでは、どの要素が操作されたかに関する詳細ではなく、動作(例:searchFor)に注意する必要があります。要素の詳細は、PageObjects内にのみ存在します。 – MikeJRamsey56

答えて

1

は、この例を考えてみましょう:

package org.openqa.selenium.example; 

import org.openqa.selenium.By; 
import org.openqa.selenium.support.FindBy; 
import org.openqa.selenium.support.How; 
import org.openqa.selenium.WebElement; 

public class GoogleSearchPage { 
    // The element is now looked up using the name attribute 
    @FindBy(how = How.NAME, using = "q") 
    private WebElement searchBox; 


    public void searchFor(String text) { 
     // We continue using the element just as before 
     searchBox.sendKeys(text); 
     searchBox.submit(); 
    } 
} 

searchboxはプライベートですが、searchForメソッドはpublicです。テストではsearchForを使用しますが、searchBoxは使用しません。

私は通常、ページのコンストラクタの最後の行にページのinitElements呼び出しを配置し​​ます。これにより、すべてのパブリック関数がテストで使用可能になります。あなたが何かを行うことができますので

package org.openqa.selenium.example; 

import org.openqa.selenium.By; 
import org.openqa.selenium.support.FindBy; 
import org.openqa.selenium.support.How; 
import org.openqa.selenium.WebElement; 

public class GoogleSearchPage { 
    public WebDriver driver; 
    // The element is now looked up using the name attribute 
    @FindBy(how = How.NAME, using = "q") 
    private WebElement searchBox; 

    public GoogleSearchPage(WebDriver driver) { 
     this.driver = driver 
     PageFactory.initElements(driver, this); 
    } 


    public void searchFor(String text) { 
     // We continue using the element just as before 
     searchBox.sendKeys(text); 
     searchBox.submit(); 
    } 
} 

テストで:

new GoogleSearchPage(webDriver).searchFor("Foo"); 
0

をあなたは、公共提出が、標準的な方法としては、クラス提出ではなく、提出された直接のgetterメソッドを持つようにアドバイスされて、あなたのクラスを維持することができますアクセス。
問題は公開で使用しているstaticキーワードです。 filed(webelement)で@FindBy注釈を使用している場合、クラス初期化時(または実装によってはinitElements()が呼び出されたとき)に初期化されます。だから、webelementpublicであるのはいいですが、staticではありません。例えば:あなたのページクラスで

:試験で

@FindBy(xpath = "(//*[contains (text(),'Hrs')])[2]") 
public WebElement yourLoggedTime; 

String yourLoggedTime = pageObj.yourLoggedTime.getText(); //pageObj is object of your page class 
+0

多くのテストでyourLoggedTimeが使用されている場合に問題となるWebElementsを公開してカプセル化を解除します。むしろ、ビヘイビアを記述して文字列を返すページオブジェクトメソッドを用意していますが、それは味の問題だと思います。 – MikeJRamsey56

関連する問題