2017-12-03 9 views
0

遅延を持つ要素を見つけるコードがありますが、要素は既に存在しますが、クリックできず、DOMでは利用できない場合があります。これらの引数をチェックするにはコードに追加する必要があります要素を見つける関数に期待条件を追加する方法

public IWebElement FindElement(IWebDriver driver, By howBy, int timeoutInSeconds = 10) 
     { 
      TimeSpan elementTimeOut = TimeSpan.FromSeconds(20); 
      IWebElement elementfound = null; 

      try 
      { 
       WebDriverWait wait = new WebDriverWait(driver, elementTimeOut); 
       elementfound = wait.Until<IWebElement>(d => 
       { 
        try 
        { 
         elementfound = driver.FindElement(howBy); 
        } 
        catch (NoSuchElementException e) 
        { 
         Debug.WriteLine("Please fail NoSuchElementException"); 
         throw; 
        } 

        return elementfound; 
       }); 
      } 
      catch (WebDriverTimeoutException e) 
      { 
       Debug.WriteLine("Please fail WebDriverTimeoutException"); 
       throw; 
      } 

      return elementfound; 
     } 
+0

一般的なファインダでクリック可能にすることで、ドライバが既にこれらのチェックを実行しており、 'ExpectedConditions.elementToBeClickable'でカバーされていないものがいくつかあるので、それをクリックすることはできません。さらに、状態のテストは高価であり、クリックが行われたときに要素がクリック可能であるという保証はありません。推奨されるアプローチは、例外に応じて再試行するカスタムウェイターでクリックを実行することです。 –

答えて

1


それは、
を標準ExpectedConditions.visibilityOfElementLocatedを使用して、「目に見える」かどうelement.isEnabled()trueであるかどうか、それは単にチェックしますチェックします。

これはこれは、基本的手段(C#で、簡体字)、わずかに凝縮することができます:要素の.Displayedプロパティが本質的である(真になるまで要素がDOM

  • 待ってから返されるまで

    1. 待ち何をvisibilityOfElementLocatedがチェックしているか)。
    2. 要素の.Enabledプロパティがtrue(これは基本的にelementToBeClickableがチェックしているもの)になるまで待ちます。

    私はそう(ExpectedConditionsの現在のセットに追加するようにこれを実装するだろうが、それを行うための複数の方法があります。

    var wait = new WebDriverWait(driver, TimeSpan.FromMinutes(1)); 
    var clickableElement = wait.Until(ExpectedConditions.ElementIsClickable(By.Id("id"))); 
    
    :上記の方法

    // <param name="locator">The locator used to find the element.</param> 
    // <returns>The <see cref="IWebElement"/> once it is located, visible and clickable.</returns> 
    public static Func<IWebDriver, IWebElement> ElementIsClickable(By locator) 
    { 
        return driver => 
        { 
         var element = driver.FindElement(locator); 
         return (element != null && element.Displayed && element.Enabled) ? element : null; 
        }; 
    } 
    

    は次のようなものを使用することができますが

    ただし、ElementIsClickable()のパラメータとしてhowByを渡すことができます。

  • 0

    elementToBeClickableは、要素がクリック可能になるのを待つために使用されます。

    あなたのメソッド内で次のコードを使用してください。まず

    elementfound = wait.until(ExpectedConditions.elementToBeClickable(howBy); 
    
    関連する問題