Ich habe versucht, einige Testfälle mit Selenium Webdriver in c # zu schreiben und haben ein Szenario, dessen Lösung ich nicht genau kenne
das Benutzerszenario durchsucht eine Tabelle nach einem Patienten. Wählen Sie einen Patienten aus, dann wird ein neues Fenster geöffnet und anschließend werden verschiedene Elemente im Fenster aktiviert
mein Problem ist, dass ich das neue Fenster nicht auswählen kann, um etwas zu bestätigen. Es ist kein Popup-Fenster. Es ist ein vollständig neues Browserfenster, aber es hat keinen Fenstertitel/-namen, anhand dessen es identifiziert werden kann. Wie könnte ich das tun? Treiberfokus auf dieses Fenster wechseln?
danke im Voraus
In Selenium WebDriver ist das wirklich einfach. Mit der SwitchTo-Methode
driver.SwitchTo().Window(driver.WindowHandles.Last());
Siehe auch diesen Blogeintrag
http://binaryclips.com/2015/03/13/Selenium-webdriver-in-c-switch-to-new-window/
Ich habe einen Code, den Sie mögen könnten. Die schnellste Lösung ist die Verwendung von Popup Finder, aber ich habe auch meine eigene Methode entwickelt. Ich würde mich niemals auf die Reihenfolge der Fenstergriffe verlassen, um das entsprechende Fenster auszuwählen. __ Popup-Fenster-Finder:
PopupWindowFinder Finder = new PopupWindowFinder(driver);
driver.SwitchTo().Window(newWin);
Meine benutzerdefinierte Methode Grundsätzlich übergeben Sie das Element, auf das Sie klicken möchten, Ihren Web-Treiber und optional die Wartezeit, bevor Sie nach dem Klicken auf das Element suchen.
Es nimmt alle Ihre aktuellen Handles und erstellt eine Liste. Es verwendet diese Liste, um zu verhindern, dass die zuvor vorhandenen Fenster versehentlich umgestellt werden. Dann klickt es auf das Element, das das neue Fenster startet. Nach dem Klick sollte immer eine gewisse Verzögerung auftreten, da nichts sofort passiert. Dann erstellt es eine neue Liste und vergleicht diese mit der alten, bis ein neues Fenster gefunden wird oder die Schleife abläuft. Wenn kein neues Fenster gefunden wird, gibt es null zurück. Wenn Sie also ein iffy-Webelement haben, das nicht immer funktioniert, können Sie eine Nullprüfung durchführen, um zu sehen, ob der Schalter funktioniert hat.
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;
}
Dieser Code hat für mich funktioniert. In meinem Fall handelt es sich bei dem neuen Fenster bzw. der neuen Registerkarte um ein PDF, das ein gewisses Gewicht hat. Daher lasse ich beim Laden einige benutzerdefinierte Wartezeiten ein.
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"));
Beachten Sie, dass die Datei driver.Url beim Laden von PDF "about: blank" ist.
foreach (string defwindow in driver.WindowHandles)
{
driver.SwitchTo().Window(defwindow);
if(driver.Title == "")
{
Selenium.WindowFocus();
Selenium.SelectWindow("");
}
}
"" - zeigt Ihren Fenstertitel an
Wenn ich richtig erfasse, wird Ihre Anwendung das Fenster ohne weitere Benutzereingriffe selbst erstellen. Sie sollten in der Lage sein, auf das Laden der Seite zu warten, und dann können Sie Ihre Asserts wie gewohnt aufrufen.
Selenium hat bereits Ihre Browser-Sitzung, daher ist ein neues Fenster für Selenium kein Problem, es handelt sich lediglich um neuen Inhalt.
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;
}
Verwenden Sie ReadOnlyCollection und behandeln Sie den Browser, rufen Sie den Titel Ihres Fensters ab und vergleichen Sie ihn und konzentrieren Sie sich auf das gewünschte Browserfenster.