web-dev-qa-db-fra.com

Selenium WebDriver sélectionnant nouvelle fenêtre c #

Essayer d'écrire quelques cas de test en utilisant Selenium Webdriver en c # et avoir un scénario que je ne sais pas comment résoudre

scénario utilisateur recherche un patient dans une table, sélectionne un patient, puis une nouvelle fenêtre s'ouvre, puis affiche différents éléments dans la fenêtre.

mon problème est que je suis incapable de sélectionner la nouvelle fenêtre pour affirmer quoi que ce soit, ce n'est pas une fenêtre contextuelle, c'est une toute nouvelle fenêtre de navigateur, mais elle n'a pas de titre/nom de fenêtre pour l'identifier, comment pourrais-je basculer le focus du conducteur vers cette fenêtre?

merci d'avance

9
jim7

C'est vraiment facile avec Selenium WebDriver. En utilisant la méthode SwitchTo

driver.SwitchTo().Window(driver.WindowHandles.Last());

Voir aussi ce blog 

http://binaryclips.com/2015/03/13/Selenium-webdriver-in-c-s- switch-to-new-window

12
joinsaad

J'ai du code que vous pourriez aimer. La solution la plus rapide consiste à utiliser Popup Finder, mais j'ai également créé ma propre méthode. Je ne me fierais jamais de l'ordre dans lequel se trouvent les poignées de fenêtre pour sélectionner la fenêtre appropriée .. Fenêtre contextuelle:

PopupWindowFinder Finder = new PopupWindowFinder(driver);
driver.SwitchTo().Window(newWin); 

Ma méthode personnalisée. Fondamentalement, vous transmettez l’élément sur lequel vous voulez cliquer, votre pilote Web et éventuellement le temps d’attente avant de rechercher après avoir cliqué sur l’élément. 

Il prend toutes vos poignées actuelles et en fait une liste. Il utilise cette liste pour éviter que les fenêtres précédemment existantes ne soient accidentellement basculées. Ensuite, il clique sur l'élément qui lance la nouvelle fenêtre. Il devrait toujours y avoir une sorte de délai après le clic, car rien ne se passe instantanément. Ensuite, il crée une nouvelle liste et la compare à l'ancienne jusqu'à ce qu'il trouve une nouvelle fenêtre ou que la boucle expire. S'il ne parvient pas à trouver une nouvelle fenêtre, il renvoie la valeur null. Par conséquent, si vous avez un élément Web incertain qui ne fonctionne pas toujours, vous pouvez effectuer une vérification nulle pour voir si le commutateur fonctionne.

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;
        }
0

Ce code a fonctionné pour moi. Dans mon cas, la nouvelle fenêtre/onglet est un PDF qui a un certain poids. Je crée donc des attentes personnalisées pendant le chargement.

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"));

Notez que le fichier driver.Url lors du chargement de PDF est "about: blank" .

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

}      

"" - indique le titre de votre fenêtre 

0
Madhu

Si je comprends bien, votre application produira la fenêtre elle-même sans autre intervention de l'utilisateur. Vous devriez pouvoir attendre le chargement de la page, puis appeler vos assertions normalement. 

Selenium a déjà votre session de navigateur, donc une nouvelle fenêtre n’est pas un problème pour Selenium, c’est juste un nouveau contenu.

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;
        }

Utilisez ReadOnlyCollection et utilisez le navigateur, obtenez le titre de votre fenêtre, comparez-le et concentrez-vous sur la fenêtre de votre navigateur souhaité.

0
Dhru 'soni