2012-03-21 9 views
6

私はSelenium webdriverを初めて使用しています。多分この質問は明らかです。要素が存在する場合はwebdriverを使用して要素が存在するかどうかを確認し、例外をスローすることはありませんか?

、それをクリックして、インデックスページに戻る:私はこのような状況の後だ

driver.findElement(By.id("...."])).click(); 

、終了し、それをスキップして戻ってインデックスページに行かない場合。テストはまだ例外がスローされずに続きます。

私はこれに対する一つの解決策を知っている:ので、私が試した

driver.findElements(By.id("...")).size() != 0 

を:

if(driver.findElements(By.id("....")).size() > 0) 
    { 
     driver.findElement(By.id("....")).click(); 
     driver.findElement(By.cssSelector("...")).click(); 
    } 
else 
    { 
     driver.findElement(By.cssSelector("....")).click(); 
    } 

を私が確認するために10個の要素を持っている場合ので、このIF条件があることが必要であるが、これは本当に醜い判明10回書かれています。

すっきりさせるための回避策はありますか?

答えて

1

解決策が多い可能性がありますが、これがアーキテクチャを妨げる可能性があります。次のように

ので、最も簡単な解決策は次のようになります。

  1. locator_keyword

    はいくつかのユーティリティクラスにどこかのように引数を持つoptionalClick()のようなメソッドを作成{値:IDまたはcssSelectorかXPathの等}

  2. locator:{値: "Q"}

手順の方法で:

  1. 要素がある場合locator_keywordlocator
  2. チェックに基づいて要素を取得し、それをクリックし
  3. は、そうでない場合は、この方法を使用することができ

何もしません任意のタイプのオブジェクトのための一般的な種類のものとして。

+0

フィードバックに感謝します! 別の問題は、構文がひどく遅い場合に使用します...もっと速くする方法はありますか? – user1282634

+0

それでは、if文を使用しないでください。代わりにtry/catchブロックをfolowsとして使用してください。try { (例外e){//何もしない} – Nayan

+0

~~ありがとう!! – user1282634

1

ループ内でtry-catch条件を使用して例外をスローせずに要素を見つける方法があります。例えば、この方法は、私は(のための場合に使用するものに応じて簡単にすることができる)を書いたWebElementを返し、それはあなたにそれを返す前にクリック可能だということを確認します:使用上のポインタのための

public static WebElement getElementByLocator(By locator) { 
    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); 
    WebElement we = null; 
    boolean unfound = true; 
    int tries = 0; 
    while (unfound && tries < 10) { 
    tries += 1; 
    try { 
     we = driver.findElement(locator); 
     unfound = false; // FOUND IT 
    } catch (StaleElementReferenceException ser) {       
     unfound = true; 
    } catch (NoSuchElementException nse) {       
     unfound = true; 
    } catch (Exception e) { 
     staticlogger.info(e.getMessage()); 
    } 
    } 
    driver.manage().timeouts().implicitlyWait(DEFAULT_IMPLICIT_WAIT, 
     TimeUnit.SECONDS); 
    return we; 
} 
+1

ermどのように例外を使用していないのですか? –

+0

私は「使っていない」ではなく「投げずに」言った。 – djangofan

0

感謝findelements。あまりにも早く帰ってほしくないなら、あなたはまた論理を待つ必要があると思う。

ここで私の解決策はC#です。

セレンライブラリの待機ロジックを基本的に再実装しています。残念ながら、待っているメソッドは公開されていません(厄介なことに、rethrows exceptions the wrong wayとスタックトレースが失われます)。

Javaの場合は、多少変更する必要があります。機能を渡すことができないときに、セレンのAPIがあるかどうかはわかりません。

待ちの再実装:

private IWebElement WaitAndSeeIf(Func<IWebElement> canGet) 
    { 
     var end = DateTime.Now.AddSeconds(1); 

     IWebElement element; 
     while (true) 
     { 
      element = canGet(); 

      if (element != null) 
       break; 

      var time = DateTime.Now; 
      if (time > end) 
       break; 

      Thread.Sleep(200); 
     } 
     return element; 
    } 

呼び出すコード:

 var dashboardButton = WaitAndSeeIf(() => 
               { 
                var elements = Driver.FindElements(By.XPath("//button[contains(.//*,'Dashboard')]")); 
                return elements.Any() ? elements.Single() : null; 
               }); 

は、これまでのところ私は(などのExtJSでダイアログの存在をチェックする)場所のカップルで、この便利を見つけたが、持ってきましたまだまだ心配して設定する必要がありました。私は、他の答えに言及されているように暗黙の待ち時間を取ることになるのが一番いいと思います。

関連する問題