2017-04-08 9 views
0

私はこの問題に遭遇した最初の人ではないことを願っています。ページオブジェクトモデルデザインでどのようにSelenium ExpectedConditionsを使用しますか?

私はC#でいくつかのセレンテストを書いていますが、ページオブジェクトモデルデザインをアドボットしようとするとジレンマがありますが、ExpectedConditionsクラスで明示的に待機する必要があります。

その後、私は行くだろう

public class PageObject { 

    public IWebElement Element 
    { 
     get { return DriverContext.Driver.FindElement(By.XPath(Resources.Element)); } 
    } 
} 

...のは、私は単にリソースファイルに保存されたXPathを使用して.FindElementメソッドを呼び出し、プロパティである要素マップクラスで私の要素を格納していましょうさまざまなセレンメソッドでそのプロパティを使用します。

問題は、この要素がページに表示されているかどうかをチェックする必要があります。チェックを行う前にエラーが発生します(WebDriverWaitで、ExpectedConditions.ElementIsVisible(by)を.until方法)。

IWebElementとByロケータをきれいに分離し、この明示的な待機/確認が必要な場合はどうすればよいですか?

TLDR - 私の要素のByロケータに基づいて明示的な待機を使用する柔軟性を持ちながら、ページオブジェクトモデルデザインを維持する方法を教えてください。

多くのおかげで、

答えて

1

私はページを使用するには、すべての時間をオブジェクトが、私はクラスの最上部にロケータの代わりの要素を持っています。その後、必要に応じてロケータを使用してボタンなどをクリックします。これの利点は、必要なときにページ上の要素にアクセスするだけで、古い要素の例外などを避けることができることです。以下の簡単な例を参照してください。

class SamplePage 
{ 
    public IWebDriver Driver; 
    private By waitForLocator = By.Id("sampleId"); 

    // please put the variable declarations in alphabetical order 
    private By sampleElementLocator = By.Id("sampleId"); 

    public SamplePage(IWebDriver webDriver) 
    { 
     this.Driver = webDriver; 

     // wait for page to finish loading 
     new WebDriverWait(Driver, TimeSpan.FromSeconds(10)).Until(ExpectedConditions.PresenceOfAllElementsLocatedBy(waitForLocator)); 

     // see if we're on the right page 
     if (!Driver.Url.Contains("samplePage.jsp")) 
     { 
      throw new InvalidOperationException("This is not the Sample page. Current URL: " + Driver.Url); 
     } 
    } 

    public void ClickSampleElement() 
    { 
     Driver.FindElement(sampleElementLocator).Click(); 
    } 
} 

それはページがページオブジェクトに行くに関係するすべてのものであるページオブジェクトモデルのマントラの一つを破るので、私は別のファイルに保存するロケータに対して推薦します。ページオブジェクトクラスであるページXで何かをするために1つのファイル以外のファイルを開く必要はありません。

関連する問題