私は、2 つのブラウザー (Chrome と IE) に対して同時にテストを実行しようとして、よく見られる「URL のリモート WebDriver サーバーへの HTTP 要求 ... x 秒後にタイムアウトしました」と戦ってきました。解決策を見つけるために、stackoverflow と検索エンジンの結果を時間トロールします。
私の行動は、私の前の他の人たちと同様に、クリック機能でタイムアウトするか、URL を取得しようとするかで異なります。ページロードと暗黙の待機タイムアウトをさまざまなケースで 600 秒以上に増やし、要素の前、要素の後に待機を挿入しました。 url は、url が呼び出される前、ドライバー コンストラクターが呼び出された後に、ドライバー オブジェクト呼び出しのパラメーターとして呼び出されます。
アクションを続行する前に、ページの読み込み準備完了状態が完了していることを確認する javascript executor スクリプト (この問題に関する以前の SO 投稿の回答から提供) を含めようとしましたが、成功しませんでした。
Chrome と IE、Selenium Web、およびサポート ドライバーをすべて最新の互換性のあるバージョンに更新しようとしました。最新の互換性のあるブラウザー実行可能ファイルのバイナリを手動で呼び出し、人々が成功を報告した以前のバージョン (chrome) にロールバックしようとしました。 v48、chromedriver 2.22.0.0、webdriver 2.53.1)。Chrome オプションとして「サンドボックスなし」を追加しようとしましたが、IE セキュリティ ゾーンがすべて同じレベルの保護を共有していることを確認しました。
ページが AJAX スクリプトを使用しているかどうかを調査し、さまざまなスレッドで提供されているソリューションを使用して、動的コンテンツに対応しようとしました。
並列クエリの外部で IE または Chrome を個別に実行すると、タイムアウトの問題は発生しません。この問題は特に、chrome がリモート WebDriver インスタンスを初期化するときに発生します。また、chrome/ie ドライバーの 32 ビットおよび 64 ビット バージョンを使用してみました。
多くのトピックやページから情報を引き出してきましたが、これらは最も関連性の高いものの一部です。
Selenium エラー - リモート WebDriver への HTTP リクエストが 60 秒後にタイムアウトしました
https://github.com/seleniumhq/selenium-google-code-issue-archive/issues/5441
https://github.com/seleniumhq/selenium-google-code-issue-archive/issues/5071
Selenium エラー - リモート WebDriver への HTTP リクエストが 60 秒後にタイムアウトしました
Selenium WebDriver がタイムアウト例外を散発的にスローする
出力の例を次に示します。
System.Reflection.TargetInvocationException : Exception has been thrown by the target of an invocation.
----> System.AggregateException : One or more errors occurred.
----> OpenQA.Selenium.WebDriverException : The HTTP request to the remote WebDriver server for URL http://localhost:52240/session/a969dbe2-3b0c-461f-a979-21bafec0dd8e/element/7005aeab-ff31-454a-8f78-0a39ad861695/click timed out after 120 seconds.
----> System.Net.WebException : The request was aborted: The operation has timed out.
後で並列クエリに追加されるケース リストからドライバーを呼び出します。
private static IWebDriver DefineDriver(Browser supportedbrowsers)
{
var baseDriverPath = ConfigurationManager.AppSettings["BaseDriverPath"].ToString();
var ieDriverFolder = ConfigurationManager.AppSettings["IeDriverFolder"].ToString();
var chromeDriverFolder = ConfigurationManager.AppSettings["ChromeDriverFolder"].ToString();
ChromeOptions chromeoptions = new ChromeOptions();
chromeoptions.BinaryLocation = @"C:\WebDrivers\Binary\chrome32_49.0.2623.75\chrome.exe";
chromeoptions.AddArgument("no-sandbox");
InternetExplorerOptions ieoptions = new InternetExplorerOptions();
ieoptions.IntroduceInstabilityByIgnoringProtectedModeSettings = false;
IWebDriver driver = null;
switch (supportedbrowsers)
{
case Browser.Chrome:
driver = new ChromeDriver(Path.Combine(baseDriverPath, chromeDriverFolder), chromeoptions, TimeSpan.FromMinutes(5));
break;
case Browser.InternetExplorer:
driver = new InternetExplorerDriver(Path.Combine(baseDriverPath, ieDriverFolder), ieoptions, TimeSpan.FromMinutes(5));
break;
default:
driver = new ChromeDriver(Path.Combine(baseDriverPath, chromeDriverFolder), chromeoptions, TimeSpan.FromMinutes(5));
break;
}
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(120));
driver.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromMinutes(10));
driver.Manage().Timeouts().SetScriptTimeout(TimeSpan.FromMinutes(10));
driver.Manage().Window.Maximize();
return driver;
}
私のテスト コードでは、ページを起動し、別のローカル ページに移動して、ページにすぐに表示されるボタンをクリックしようとしています。
ボタンのクリック コマンドを try キャッチでラップし、期待される条件 (表示、有効、isclickable) で明示的な待機を追加し、スレッド スリープを使用して、単一のブラウザーを実行しているときにすべてが期待どおりに機能するようにしました。
たとえば、次の方法でボタンを呼び出します。
public void SelectAddWorkWorkPageButton()
{
WebDriverWait wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(10));
wait.Until(ExpectedConditions.ElementToBeClickable(addNewWorkItemWorkPageBtn));
addNewWorkItemWorkPageBtn.Click();
}
次の要素を見つけます。
//Create New Button
[FindsBy(How = How.Id, Using = "btnWorkDefinitionCreateNewWorkDefinition")]
public IWebElement addNewWorkItemWorkPageBtn { get; set; }
そしてそれはHTMLです:
<i id="btnWorkDefinitionCreateNewWorkDefinition" title="Add work" class="fa fa-plus-circle cursorPointer crudIcon" style="font-size: 20px;margin:0;padding-left:15px" ng-click="AddNewWorkDefinition()" role="button" tabindex="0"></i>
タイムアウトに関する別のメモとして、WebDriver の最新バージョンに更新するときに、タイムアウトも新しい形式に更新しました。
//driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(120);
//driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(120);
//driver.Manage().Timeouts().AsynchronousJavaScript = TimeSpan.FromSeconds(120);
この問題は 2012 年からコミュニティに存在していたようで、私の発見では、今年 5 月になってもまだ報告されており、孤立して明確に特定されることはありませんでした。
Selenium エラー - リモート WebDriver への HTTP リクエストが 60 秒後にタイムアウトしました