web-dev-qa-db-ja.com

Selenium WebDriverが散発的にタイムアウト例外をスローする

プロジェクトのUIテストにSeleniumを使用します。最新バージョン2.30.0を実行しています。 Firefox WebDriverを使用し、Firefox 19.0を実行しています。

一般的に、Visual Studioでuiテストを実行すると、uiテストはローカルおよびサーバー側でも機能すると言いました。 uiテストは、ビルドサーバー上で実行されます。 Visual Studioを使用して手動でテストする同じサーバーに同じデプロイを使用します。

しかし、uitestが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秒のタイムアウトに達することがあります。

根本的な問題を切り分ける方法はありますか?または、以前に同じ問題に誰かを実行しますか?ヒントをいただければ幸いです。ありがとう。

38
dasheddot

これと同じエラーが発生しました:.NET WebDriver:2.37、FF:25.0.1。テストアプリケーションを終了するまでFirefoxがロックしていることに気づいたので、デバッグバージョンのFirefoxをビルドし、stderrへの書き込み中にロックアップが発生することを発見しました。これにより、webdriverコードを変更して、標準出力とエラーがリダイレクトされなくなり、問題が解決するようになりました。 WebDriverが何らかの方法でstdエラーをブロックしているようです。 MSDNから:

同期読み取り操作により、呼び出し元がStandardErrorストリームから読み取り、子プロセスがそのストリームに書き込む間に依存関係が生じます。これらの依存関係は、デッドロック状態を引き起こす可能性があります...

詳細 こちら

同じ微調整をしたい人のために:-

  1. Seleniumソースを入手してください。次に、使用しているのと同じコードブランチをチェックアウトします。

  2. FireFoxBinary.csで:

    私。どこで_RedirectStandardError = true、 への変更 RedirectStandardError = false

    ii。どこで_RedirectStandardOutput = true、 への変更 RedirectStandardOutput = false。 (Windows以外の場合、Executable.csにもあります)

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

  3. WebDriver.dllをビルドして自分のものに置き換えます。

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

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

問題を解決したので、これ以上深く掘り下げません。 Seleniumグループのメンバーがもっと情報/ログ/微調整を望んでいるなら、喜んでそうします。

うまくいけば、これはすぐに修正されます。

更新

Firefox v25は現在サポートされていないようです。 このコメント を参照してください。

2014年2月25日更新

この更新 を参照してください:

さて、この問題は一般にIEには現れません。または、コメントから思われます。 FirefoxとChrome、および.NETバインディング2.40.0(この記事の執筆時点では次のリリースになります)またはそれ以降を試して、これがまだ発生しているかどうかを確認してください。

2.35.0以降Chromeでこの問題が発生しているという報告はほとんどないので、これが.NETバインディングと最近のchromedriver.exeの問題であるかどうかを知る必要があります。

2.40.0には、Firefoxでこれを引き起こす可能性のある問題の少なくとも1つが修正されている場合があります。

これで問題は解決しました。変更ログを見ると、コンソールロギングリダイレクトを削除するための1/31/2014からのコミットがあります。

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

これは私がここで使用した回避策です。だから、それはすべて理にかなっています。

8
acarlon

4つの異なるシナリオで私に起こりました:

  1. 原因は、クエリを実行しているウィンドウハンドルが既に閉じられているか、閉じている段階にあることです。この場合、クエリを実行する前に、ウィンドウがまだ存在することを確認してください。 60秒という長いタイムアウト期間を避けたい場合は、Firefoxインスタンスの作成方法を変更して、60秒の遅延を短縮する必要があります。

    new FirefoxDriver( "FfBinaryPath"、FfProfileInstance、TimeSpan.FromSeconds(5));

  2. 原因は、フラッシュプラグインの「保護モード」です。このシナリオは、Jenkinsジョブの下で実行されたときにWindows 7および8でのみ発生し、タイムアウトは散発的に発生しませんでした。それを修正するために、フラッシュセキュリティモードを無効にしてFirefox Seleniumインスタンスを実行しました。

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

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

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

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

6
Nir

タイムアウトで同じエラーが発生しました。私はIEDriverServer(64ビット)を使用していましたが、長い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
    • ドライバーの初期化に使用されるInternetExplorerOptions
  3. commandTimeout
    • タイプ:System.TimeSpan
    • 各コマンドを待機する最大時間

私のコード

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

私の場合、ページは完全にロードされていません。一部のFacebookプラグインの読み込みが長すぎるようです。例外をキャッチして未完成のdomを操作しようとしましたが、結果は得られませんでした。 :(

ジョン

3
Iwan1993

私も同じ問題を抱えていましたが、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)!");
    }
}
1
Rain9333

プロジェクトでも同様の問題に直面しました。この問題は、Seleniumやアプリとは関係ありませんでした。そのプロジェクトのビルドサーバー構成が5分でタイムアウトすることになっていたため、タイムアウトになりました。しかし、すべてのテストが5分で完了しなかったため、タイムアウトの問題によりビルドがランダムに失敗しました。

また、テストがランダムに失敗することが多かったfirefox-19に問題がありました。どういうわけか、firefox-10はSeleniumテストでのみ機能しました。

1
Infant Dev

このコードを試してください:

  DesiredCapabilities caps = DesiredCapabilities.Firefox();   

 //set the timeout to 120 seconds
 IWebDriver driver = new RemoteWebDriver(new Uri("<app_url>"), caps, TimeSpan.FromSeconds(120));
1
9ikhan
_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);
        }
    }
_

これを使用して、このようなElement not found障害を防ぎ、チャームのように機能します。

エレメントが存在できる場合は別のバージョンもありますが、表示する必要はありません。

ExpectedConditions.ElementExists(selector)の代わりにExpectedContitions.ElementIsVisible(selector)を使用するだけです

編集:Browser.Instance.Driverは、インスタンス化されたドライバーを含むクラスです

0