C#でSelenium Webdriverを使用していくつかのテストケースを作成し、解決方法がわからないシナリオがある
ユーザーシナリオは、患者のテーブルを検索し、患者を選択すると、新しいウィンドウが開き、ウィンドウにさまざまなアイテムがアサートされます。
私の問題は、何かをアサートする新しいウィンドウを選択できないこと、それはポップアップウィンドウではなく、完全に新しいブラウザウィンドウですが、それを識別するためのウィンドウタイトル/名前がありません。ドライバのフォーカスをこのウィンドウに切り替えますか?
前もって感謝します
それはSelenium WebDriverで本当に簡単です。 SwitchToメソッドを使用する
driver.SwitchTo().Window(driver.WindowHandles.Last());
このブログ投稿もご覧ください
http://binaryclips.com/2015/03/13/Selenium-webdriver-in-c-switch-to-new-window/
このコードは私のために働いた。私の場合、新しいウィンドウ/タブはPDFであり、ある程度の重みがあるため、ロード中にカスタム待機を行います。
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5));
int previousWinCount = driver.WindowHandles.Count;
// Perform the action to open a new Window
wait.Until(driver => driver.WindowHandles.Count == (previousWinCount + 1));
driver.SwitchTo().Window(driver.WindowHandles.Last());
wait.Until(driver => driver.Url.Contains("desired_url_or_a_substring_of_it"));
PDFがロードされているときはdriver.Urlが"about:blank"であることに注意してください。
IWebDriver _driver = new FirefoxDriver();
_driver.Navigate().GoToUrl("https://www.google.com");
ReadOnlyCollection<string> WindowHandles = _driver.WindowHandles;
foreach (string item in WindowHandles)
{
_driver.SwitchTo().Window(item);
string browserTitle = _driver.Title;
string browserPageSource = _driver.PageSource;
string browserURL = _driver.Url;
}
ReadOnlyCollectionを使用してブラウザーを処理し、ウィンドウのタイトルを取得して、目的のブラウザーウィンドウと比較してフォーカスを取得します。
私はあなたが好きかもしれないいくつかのコードを持っています。最も簡単な解決策はポップアップファインダーを使用することですが、私も自分でメソッドを作成しました。適切なウィンドウを選択するために、ウィンドウハンドルの順序に依存することはありません。ポップアップウィンドウファインダー:
PopupWindowFinder Finder = new PopupWindowFinder(driver);
driver.SwitchTo().Window(newWin);
私のカスタムメソッド。基本的には、クリックする要素、Webドライバー、およびオプションで、要素をクリックしてから検索するまでの待機時間を渡します。
現在のハンドルをすべて取り、リストを作成します。そのリストを使用して、以前に存在していたウィンドウが誤って切り替えられないようにします。次に、新しいウィンドウを起動する要素をクリックします。すぐには何も起こらないため、クリック後は常に何らかの遅延が発生するはずです。次に、新しいリストを作成し、新しいウィンドウが見つかるか、ループが期限切れになるまで、古いリストと比較します。新しいウィンドウが見つからなかった場合はnullを返します。そのため、常に機能するとは限らないiffy webelementがある場合は、nullチェックを実行してスイッチが機能したかどうかを確認できます。
public static string ClickAndSwitchWindow(IWebElement elementToBeClicked,
IWebDriver driver, int timer = 2000)
{
System.Collections.Generic.List<string> previousHandles = new
System.Collections.Generic.List<string>();
System.Collections.Generic.List<string> currentHandles = new
System.Collections.Generic.List<string>();
previousHandles.AddRange(driver.WindowHandles);
elementToBeClicked.Click();
Thread.Sleep(timer);
for (int i = 0; i < 20; i++)
{
currentHandles.Clear();
currentHandles.AddRange(driver.WindowHandles);
foreach (string s in previousHandles)
{
currentHandles.RemoveAll(p => p == s);
}
if (currentHandles.Count == 1)
{
driver.SwitchTo().Window(currentHandles[0]);
Thread.Sleep(100);
return currentHandles[0];
}
else
{
Thread.Sleep(500);
}
}
return null;
}
foreach (string defwindow in driver.WindowHandles)
{
driver.SwitchTo().Window(defwindow);
if(driver.Title == "")
{
Selenium.WindowFocus();
Selenium.SelectWindow("");
}
}
""-ウィンドウのタイトルを示します
私が正しく集まると、アプリケーションはユーザーの介入なしに独自のウィンドウを生成します。ページが読み込まれるのを待ってから、通常どおりアサートを呼び出すことができます。
Seleniumにはすでにブラウザーセッションがあるため、新しいウィンドウはSeleniumの問題ではなく、新しいコンテンツです。