38

私たちのプロジェクトのUIテストにセレンを使用しています。最新バージョン2.30.0を実行しています。Firefox WebDriverを使用し、Firefox19.0を実行しています。

一般的に、Visual StudioでUIテストを実行すると、UIテストはローカルおよびサーバー側でも機能すると言われています。私たちのUIテストは、ビルドサーバー上で実行されます。VisualStudioを介して手動でテストした同じサーバーで同じ展開を使用します。

しかし、UIテストがビルドサーバーで実行されると、散発的に次の問題が発生します。

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秒のタイミングに達することがあります。

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

4

8 に答える 8

8

この同じエラーが発生しました: .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 つが修正されている可能性があります。

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

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

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

于 2013-11-24T22:05:08.507 に答える
7

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

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

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

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

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

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

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

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

于 2014-01-23T11:18:30.590 に答える
3

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

ジョン

于 2013-07-16T13:45:35.263 に答える
1

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

  DesiredCapabilities caps = DesiredCapabilities.Firefox();   

 //set the timeout to 120 seconds
 IWebDriver driver = new RemoteWebDriver(new Uri("<app_url>"), caps, TimeSpan.FromSeconds(120));
于 2013-09-06T11:23:56.677 に答える
1

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

また、firefox-19 にも問題があり、テストがランダムに失敗していました。どういうわけか、firefox-10 はセレン テストでしか機能しませんでした。

于 2013-07-22T11:56:36.700 に答える
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);
        }
    }

これを使用して、要素が見つからないという失敗を防ぎ、魅力的に機能します。

要素がそこに存在できるが、表示されている必要がない場合は、別のバージョンもあります。

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

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

于 2016-03-03T12:59:30.880 に答える