Internet Explorer 10 の C# で最新バージョンの Selenium (2.37.0) を使用して (最新の 32 ビット InternetExplorerDriver、2.37.0 を使用)、Web ページにログインし、新しいウィンドウを開くボタンをクリックして、次に、フォーカスを新しいウィンドウに変更します。
もともと私は Firefox でこのコードを使用していましたが、毎回動作します。
// Get handle for original window
string parentHandle = driver.CurrentWindowHandle;
// Click on button for new window
driver.FindElement(By.Id("buttonForNewWindow")).Click();
// Get list of all window handles
ReadOnlyCollection<string> allWindowHandles = driver.WindowHandles;
// Loop over all handles and switch to new child window
foreach (string handle in allWindowHandles)
{
if (handle != parentHandle)
{
driver.SwitchTo().Window(handle);
}
}
しかし、これは Internet Explorer では機能しません。
問題を特定しました。新しいウィンドウを開く前にdriver.WindowHandles.Count
、ウィンドウ ハンドルの数を取得するために使用すると、(予想どおり) ウィンドウ ハンドルが 1 つしかないことがわかります。次に、新しいウィンドウのボタンをクリックすると、(やはり予想どおり) 2 つのウィンドウ ハンドルがあることがわかります。しかし、コードが の行に到達する前に、両方のウィンドウがまだ表示driver.SwitchTo().Window(handle);
されているにもかかわらず、ウィンドウ ハンドルの数が 1 に戻っています。
そのため、どういうわけかウィンドウ ハンドルの 1 つが失われています。Console.WriteLine
ドロップされたウィンドウハンドルが新しいものであることを(一連のステートメントを使用して)確認しました。Stopwatch
また、このクラスを使用して、新しいウィンドウ ハンドルがドロップされるまでの時間を計りました。
Stopwatch sw = new Stopwatch();
// Wait until the number of windows has changed from 1 to 2
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until((_driver) => { return _driver.WindowHandles.Count != windowsBefore; });
// Start stopwatch
sw.Start();
int numberOfWindows = driver.WindowHandles.Count;
while (numberOfWindows == 2)
{
numberOfWindows = driver.WindowHandles.Count;
}
sw.Stop();
Console.Write("\nTime elapsed: " + sw.ElapsedMilliseconds + " ms");
これを数回実行した後、通常、ウィンドウ ハンドルの数が50 ミリ秒未満で1 に戻ることがわかりました。ただし、ある時、ウィンドウ ハンドルがずっと長く続きました。元の数値は次のとおりです。
Time elapsed: 47 ms
Time elapsed: 31 ms
Time elapsed: 47 ms
Time elapsed: 2861 ms
Time elapsed: 30 ms
また、Firefox ではこの問題が発生しないことを確認しております。同じコードを Firefox で実行すると、ウィンドウ ハンドルの数が 1 から 2 に変化し、そのままであることがわかります。
他の人もこの問題を抱えているようです。この人物は、新しいウィンドウを開いて 1000 ミリ秒待機すると、getWindowHandles() が 2 ではなく 1 の値を返すことを発見しました。Selenium Google グループのこの人物も同じ問題を抱えているようです。
私の質問:新しく開いたウィンドウのハンドルが (通常) 50 ミリ秒未満開いたままになっていることを考えると、Selenium を使用して Internet Explorer 10 で新しいウィンドウに切り替える最も効率的な方法は何ですか? または、新しいウィンドウ ハンドルが失われるのを防ぐために別の方法で行うべきことはありますか?