1

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 で新しいウィンドウに切り替える最も効率的な方法は何ですか? または、新しいウィンドウ ハンドルが失われるのを防ぐために別の方法で行うべきことはありますか?

4

2 に答える 2

0

他の誰かが同じ問題を抱えていて、このページを見つけた場合に備えて、最新情報を提供したかっただけです。問題の解決策は見つかりませんでしたが、回避策を見つけました。

もともと、新しいウィンドウを開くリンクをクリックしていたのですが、Selenium を新しいウィンドウに移動するのに問題がありました。その代わりに、ページのソース コードを掘り下げて、クリックしていたボタンを見つけ、そのボタンがどこを指しているかを突き止めました。単純なハイパーリンク (www.whatever.com/....) であれば最も簡単でしたが、代わりに Javascript 関数を使用しました。その Javascript 関数は、いくつかの固定文字といくつかの変数を使用してハイパーリンクを構築します。例えば:

link(username, date) = "http://www.google.com/user=" + username + "?date=" + date;

したがって、この例に沿って、どの変数が入力されているか (ユーザー名、日付など) を把握し、自分で URL を作成し、そこに直接移動しました。したがって、新しいウィンドウを開いてナビゲートする必要さえありませんでした。

于 2013-10-28T19:09:46.343 に答える