2013-03-07 91 views
36

プロジェクトでのUIテストにセレンを使用します。私たちは最新のバージョン2.30.0を実行しています。 Firefox WebDriverを使用し、Firefox 19.0を実行しています。Selenium WebDriverがタイムアウト例外を散発的にスローします

一般に、Visual Studioでuiテストを実行すると、uiテストはローカルとサーバー側で動作します。私たちのテストはビルドサーバー上で実行されます。これは、Visual Studioを使って手動でテストする同じサーバー上で同じデプロイメントを使用します。

しかし、UIテストがbuildserverの上で実行されます時に散発的に我々は、以下の問題が発生した:

Test(s) failed. OpenQA.Selenium.WebDriverException : The HTTP request to the remote WebDriver server for URL http://localhost:7056/hub/session/bed1d0e7-efdc-46b6-ba07-34903519c44d/element/%7B8717bb19-96c7-44d3-b0ee-d4b989ae652d%7D/click timed out after 60 seconds. 
     ----> System.Net.WebException : The operation has timed out 
     at OpenQA.Selenium.Remote.HttpCommandExecutor.CreateResponse(WebRequest request) 
     at OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters) 
--WebException 
    at System.Net.HttpWebRequest.GetResponse() 
    at OpenQA.Selenium.Remote.HttpCommandExecutor.CreateResponse(WebRequest request) 

基本的にテストは、入力フィールドが前にファイルを充填したアップロードボタンをクリックします。ファイルが非常に小さいので、これは数秒で完了します。 しかし、時々60秒のタイムアウトに達します。

根本的な問題を特定する方法はありますか?または前に誰かを同じ問題にする? ヒントがありがとうございます。ありがとう。

+0

このブラウザのブラウザおよびそのバージョンは? – Arran

+0

@Arranヒントをありがとう。質問が更新されました。 – dasheddot

+0

ちょうど不思議なことに、これはFF 19のアップデート以来もっと起こったのですか? – Arran

答えて

2

私の場合、ページは単に完全に読み込まれていません。一部のFacebookブックプラグインが長時間ロードされているようです。私は例外をキャッチし、不完全なDOMを操作しようとしましたが、これは私に何の結果も与えませんでした。 :(

ジョン

1

我々は、我々のプロジェクトで同様の問題に直面した。問題は、セレンや我々のアプリとは何の関係もありませんでした。そのプロジェクトのビルドサーバーの設定は5でタイムアウトになっていたので、それがタイムアウトましたすべてのテストが5分で完了していないため、タイムアウトの問題が無作為に発生してビルドに失敗していた

また、firefox-19に問題があり、 10は私たちのセレンテストでのみ働いていました。

1

DesiredCapabilities caps = DesiredCapabilities.Firefox(); 

//set the timeout to 120 seconds 
IWebDriver driver = new RemoteWebDriver(new Uri("<app_url>"), caps, TimeSpan.FromSeconds(120)); 
+0

ヒントのおかげで、試してみましょう。 – dasheddot

8

.NET WebDriver:2.37、FF:25.0.1。テストアプリケーションを終了するまではFirefoxがロックされていたので、Firefoxのデバッグバージョンをビルドし、stderrに書き込んだときにロックアップが発生していることがわかりました。これは、Webdriverコードを変更してもはや標準出力とエラーをリダイレクトしないようにするための手がかりを与え、これが私の問題を解決しました。 WebDriverが何らかの方法でstdエラーをブロックしているようです。 MSDNから:

Synchronous read operations introduce a dependency between the caller reading from the StandardError stream and the child process writing to that stream. These dependencies can cause deadlock conditions...

詳細情報here。私は同じ微調整を行いたい人のために

: -

  1. は、Seleniumのソースを取得します。次に、使用しているのと同じコードブランチをチェックアウトします。 FireFoxBinary.csで

  2. 私。どこでもRedirectStandardError = trueが見つかるとRedirectStandardError = falseに変更してください。

    ii。 RedirectStandardOutput = trueが見つかると、RedirectStandardOutput = falseに変更されます。 (非Windowsの場合は、実行可能ファイルにも1つがあります。cs)

    iii。 ConsoleOuputで、 'return this.stream.ReadToEnd()'を 'return'に変更します。 ''

  3. WebDriver.dllをビルドして置き換えます。

免責事項:これは私にとってはうまくいったが、問題が異なる可能性があります。また、私が知る限り、これはコンソールの出力を無効にする以外の悪影響はありませんが、私が気づいていないその他の副作用があるかもしれません。

誰かが同じものを見つけたら知りたいです。

私は私の問題を解決して以来、私は深く掘り下げることはありません。誰かがSeleniumグループのメンバーがもっと情報/ログ/調整を望むなら、私はそうすることを喜んでします。

これは間もなく修正されることを願っています。

更新

FirefoxのV25は、現在サポートされていないことが表示されます。 this commentを参照してください。

アップデート2014年2月25日

this updateを参照してください:

Okay, this issue in general does not manifest itself in IE, or so it seems from the comments. I'd like people to try with Firefox and Chrome, and the .NET bindings 2.40.0 (will be the next release at the time of this writing) or later, and see if this is still happening.

I've seen fewer reports of this happening in Chrome since 2.35.0, so I need to know if this is still an issue with the .NET bindings and a recent chromedriver.exe.

2.40.0 may have a fix for at least one of the issues that may cause this in Firefox.

これは私のために問題を解決しました。私はここで使用される回避策はある

"No longer redirecting console output for Firefox in .NET bindings." 

:変更ログを見ると、コンソールロギングリダイレクトを削除するために2014年1月31日からコミットがあります。だから、それはすべて意味をなさない。

+0

Selenium.2.43.1では、FireFoxBinary.csにRedirectStandardErrorというパラメータはありません。私はFirefox32と私のビルドサーバーで同じエラーが発生しています... – demokritos

+0

@demokritos - 最後の更新につき、修正プログラムは2.40.0以降にリダイレクトを削除するために入れられました。だから、あなたが持っている問題は、別の問題によって引き起こされる可能性が高いです。 – acarlon

5

は、4つの異なるシナリオで私に起こった:

  1. 原因は私が照会されたウィンドウハンドルがすでに閉じたり終盤にされたということでした。 このような場合は、クエリを実行する前にウィンドウが存在していることを確認することをお勧めします。 あなたは60秒の長いタイムアウト時間を避けたい場合、あなたは60秒の遅延を減少させるためにFirefoxのインスタンスを作成する方法を変更する必要があります

    新しいFirefoxDriver(「FfBinaryPath」、FfProfileInstance、TimeSpan.FromSeconds(5) );

  2. 原因は、Flashプラグイン '保護モード'でした。 このシナリオは、Jenkinsの仕事の下で実行されたウィンドウ7と8の下でのみ発生しました。タイムアウトは散発的に起こっていませんでした。 これを修正するために、フラッシュセキュリティモードを無効にしてFirefoxセレンインスタンスを実行しました。

    FfProfile.SetPreference( "dom.ipc.plugins.flash.disable-protected-mode"、true);

  3. また、Jenkinsの下でFlashと関連していた別の原因は、Firefoxのバージョン45を使用していました。この問題を解決するには、バージョン44にダウングレードするか、Flashを別の方法でアンインストールする必要がありました。

  4. 内部ブラウ​​ザの理由:ブラウザがセレンの呼び出しに反応するのに1分以上かかることがあります。このような場合、ブラウザコマンドのタイムアウトを60秒以上に設定することで問題を解決できます。例えば:

    new FirefoxDriver("FfBinaryPath", FfProfileInstance, TimeSpan.FromMinutes(3));

0
public static IWebElement WaitForElementVisible(By selector, uint timeout = Config.DefaultTimeoutSec) 
    { 
     IWebDriver driver = Browser.Instance.Driver; 

     if (timeout > 0) 
     { 
      WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeout)); 

      wait.Until(ExpectedConditions.ElementIsVisible(selector)); 
      return driver.FindElement(selector); 
     } 
     else 
     { 
      // Search for element without timeout 
      return driver.FindElement(selector); 
     } 
    } 

私たちは、このような要素が見つかりません障害を防止するために、これを使用して、それは魔法のように動作します。

要素が存在する可能性があるが表示される必要がない場合は、別のバージョンもあります。

だけExpectedContitions.ElementIsVisible(selector)

編集するのではなく、ExpectedConditions.ElementExists(selector)を使用します。Browser.Instance.Driverは、私がタイムアウトすると、同じエラーが発生したインスタンス化ドライバに

2

を含むクラスです。私はIEDriverServer(64bit)を使用していましたが、長いsendKeyコマンドではタイムアウトになります。

デフォルトのタイムアウトは60秒と思われるからです。

問題を解決したのは、IEDriverServerの場所、ドライバのオプション、およびタイムアウト値を入力できる方法でドライバをインスタンス化したことです。ドキュメントへ

リンク:http://seleniumhq.github.io/selenium/docs/api/dotnet/

public InternetExplorerDriver(
    string internetExplorerDriverServerDirectory, 
    InternetExplorerOptions options, 
    TimeSpan commandTimeout 
) 

パラメータ

  1. InternetExplorerDriverServerDirectory
    • タイプ:
    • 可能System.String
    • IEDriverServer.exeを含むディレクトリへのフルパス
  2. オプション
    • 型:OpenQA.Selenium.IE.InternetExplorerOptionsドライバ
  3. を初期化するために使用
  4. InternetExplorerOptionsを
  5. commandTimeout
    • タイプ:のSystem.TimeSpan
    • 私も同じ問題を持っていた各コマンド

私のコード

InternetExplorerOptions options = new InternetExplorerOptions(); 
     IWebDriver driver = new InternetExplorerDriver("C:/Users/jeff/AppData/Local/Microsoft/WindowsApps", options, TimeSpan.FromSeconds(120)); 
+0

IEDriverServer.exeとは何ですか?どこでダウンロードできますか?しかし私の場合はFirefoxです。ありがとう –

1

を待つ時間の最大量だけのFirefoxにドライバ。ドライバーのNavigateメソッドを使用すると、ページとあまりにも速くやりとりをしようとすると関連している可能性があります。以下のコードを呼び出すとNavigateで私のために修正されます(FindElementの前にも使用することをお勧めします):

public void VerifyPageIsLoaded() 
{ 
    var pageLoaded = false; 

    for (var i = 0; i < DefaultTimeout.Timeout.Seconds; i++) 
    { 
     Thread.Sleep(1000); 

     if (WebDriver.ExecuteJavaScript<string>("return document.readyState").Equals("complete")) 
     //jQuery.active might cause problems on some browser or browserstack so I commented it out 
     //&& WebDriver.ExecuteJavaScript<bool>("return jQuery.active == 0").Equals(true)) 
     { 
      pageLoaded = true; 
      break; 
     } 

     Thread.Sleep(1000); 
    } 

    if (!pageLoaded) 
    { 
     throw new Exception("Page was not with complete state)!"); 
    } 
} 
関連する問題