webentwicklung-frage-antwort-db.com.de

Selenium-Treiber wählt neues Fenster c #

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

9
jim7

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/

12
joinsaad

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.

0
x7iBiT
foreach (string defwindow in driver.WindowHandles)
{
    driver.SwitchTo().Window(defwindow);
    if(driver.Title == "")
    {
     Selenium.WindowFocus();
     Selenium.SelectWindow("");
    }

}      

"" - zeigt Ihren Fenstertitel an 

0
Madhu

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.

0
Steve
        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.

0
Dhru 'soni