2017-02-04 18 views
2

私がコントロールされるまで待つ彼のコードを得ましたが、いくつかのコントロールが任意のイベントの後、DOMで発生したときに、私はこれを使用実行時に変更されるWebElementの操作方法は?

WebDriverWait wait = new WebDriverWait(Browser, TimeSpan.FromSeconds(20)); 
var ok = wait.Until(ExpectedConditions.PresenceOfAllElementsLocatedBy(By.XPath("(//button[@id='btnOkDialog'])[" + buttonOccuranceNo + "]"))); 

を見つけました。

[WebEriverであるWebDriver内のdivを取るような]ページの検索範囲を減らした場合、見つかったかタイムアウトになるまでそのスコープ内のコントロールを検索するにはどうすればよいですか?あなたはDefaultWaitクラスを使用して、セットアップに別の待機が必要

答えて

1

var waitInnerScope = new DefaultWait<IWebElement>(divInsideWebDriver); 
waitInnerScope.Timeout = TimeSpan.FromSeconds(timeout); 
waitInnerScope.IgnoreExceptionTypes(typeof(NoSuchElementException)); 

その後wait.Untilを使用します。

var ok = waitInnerScope.Until(PresenceOfAllElementsLocatedBy(By.XPath("(//button[@id='btnOkDialog'])[" + buttonOccuranceNo + "]"))); 

EDITExpectedConditionsがためFunc<IWebDriver, ...>を実装する静的メソッドで構成されているのでWebDriverWaitでの使用の場合は、IWebElementという独自の方法を使用する必要があります。

public static Func<IWebElement, ReadOnlyCollection<IWebElement>> PresenceOfAllElementsLocatedBy(By locator) 
{ 
    return (element) => 
    { 
     try 
     { 
      var elements = element.FindElements(locator); 
      return elements.Any() ? elements : null; 
     } 
     catch (StaleElementReferenceException) 
     { 
      return null; 
     } 
    }; 
} 

それとも、そのような匿名メソッドのためのラムダ式を使用することができます。

waitInnerScope.Until<ReadOnlyCollection<IWebElement>>((element) => 
{ 
    try 
    { 
     var elements = element.FindElements(By.XPath("(//button[@id='btnOkDialog'])[" + buttonOccuranceNo + "]")); 
     return elements.Any() ? elements : null; 
    } 
    catch (StaleElementReferenceException) 
    { 
     return null; 
    } 
}); 
+0

ExpectedConditionsはTYE機能を返すのFunc またはブール値>で、すべてのメソッドが含まれています。その生成エラー。 Func またはbool>メソッドを返すクラスがありますか? – rana

+0

申し訳ありませんが、あなたが尋ねたことを理解することができません、明確にしようとしてください – Moshisho

+0

私はあなたのsuggessionを試して、ExpectedConditionsクラスでエラーが発生しました。そのクラスの中に入ると、そのクラスで宣言されているすべてのメソッドが、Func )またはFunc の戻り値の型を持つことがわかりました。 – rana