2012-04-05 11 views
1

私はSelenium 2.0 Webドライバを使用しています。自分のページに何かを見つけようとするたびに、スクリプトが失敗することがあります。例外をスローします。idによる要素の検索がSelenium 2.0 Webdriverで失敗する

{"method": "id"、 "selector": "username"};私のコードの

一部:それは同じコードで正常に時々通る

driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); 

WebElement userName = driver.findElement(By.id("username")); 
userName.clear(); 
userName.sendKeys("admin"); 

。私は何が起こっているのか分からない。

答えて

4

これは、ページが予想よりも遅く読み込まれているために発生することがあります。自分のラッパーヘルパーを適用して回避策を実行しています。それは次のようになります。

private WebElement foundElement; 

public WebElement find(By by){ 
    for (int milis=0; milis<3000; milis=milis+200){ 
     try{ 
     foundElement = driver.findElement(by); 

     }catch(Exception e){ 
     Thread.sleep(200); 
     } 

    } 
    return foundElement; 
} 

以降のコードで:

WebElement userName = find(By.id("username")); 

このアプローチは、それを見つけるために試してみて、見つからない場合は、200ミリ秒のための睡眠と再試行します。 3秒で見つからない場合(編集可能)、クラッシュします(ある例外をスローするという方法ではおそらく言わなければなりません)

ページの読み込み速度がわからないときはいつでも適用します...

new WebDriverWait(driver, 10).until(new ExpectedCondition<Boolean>() { 

     public Boolean apply(WebDriver arg0) { 

      WebElement element = driver.findElement(By.id("username")); 


      return element.isDisplayed(); 
     } 
    }); 

これはドライバはid要素がある場合はチェックを停止していることを確認します -

+0

ありがとうございました。あなたのアプローチを試してみましょう。物事の仕組みを教えてくれます。 – user1315920

+0

ありがとうございます。出来た!! – user1315920

+0

この種の明示的待機よりもはるかに優れている場合は、Hari Reddyのように流暢な待機を使用してください。 –

3

あなたの問題を解決する最善の方法はWebDriverWaitオブジェクトを使用して、ブラウザのid要素がロードされるまでドライバの待機を行うことですロードされる。 10秒以内にロードされない場合、timedOutExceptionがスローされます。

+0

協調性のある人のために:C#のWebDriverWaitオブジェクトは、Selenium.Support NuGetパッケージの一部です。 – MegaMilivoje

関連する問題