3 votes

Comment sélectionner un élément de liste déroulante en utilisant Selenium en C# à partir d'une boîte de liste avec une valeur Xpath dynamique (changeante) à chaque chargement de page ?

Pour mon test automatisé utilisant Selenium en C#, je veux sélectionner un élément de la liste déroulante (n'importe lequel) à partir de l'écran d'accueil. type (réf. image jointe), mais comme les identifiants/xpaths de l'élément sélectionné sont générés dynamiquement à chaque chargement de page, le clic sur l'élément sélectionné échoue lorsque j'exécute mon script enregistré.

enter image description here Par exemple mon script ci-dessous échoue, car XPath "//select[@name='Entrées[ db9ef219-0f54-4925-9589-0f39351f44a4 ].TypeID']" change à chaque fois que j'exécute le test dans VS.Net. Valeur db9ef219-0f54-4925-9589-0f39351f44a4 change chaque fois que la page se charge.

IWebElement selectType =
            driver.FindElement(By.XPath("//select[@name='Entries[db9ef219-0f54-4925-9589-0f39351f44a4].TypeID']"));
        selectType.Click();

Voici le code de la page - au chargement, pour chaque nouvelle ligne, une valeur unique (en dessous c'est c36582c1-131a-4f6f-8711-390048f5779f ) est générée et stockée sous la classe RegEffEntryContainer et est utilisé pour chaque élément de liste - type/description ( par exemple id="Entrées_c36582c1-131a-4f6f-8711-390048f5779f__TypeID", id= "Entrées_c36582c1-131a-4f6f-8711-390048f5779f__Organisation")

enter image description here

Toute aide pour résoudre ce problème serait très appréciée - merci d'avance !

FYI : Si j'utilise le code ci-dessous en utilisant Dynamic XPath, il ne fonctionnera que pour la première ligne et je ne pourrais pas enregistrer les entrées de lignes suivantes via le script. L'exigence est d'entrer les 3 entrées avant de cliquer. Enregistrer/Soumettre (non montré sur la capture d'écran ci-dessus).

IWebElement selectType = driver.FindElement(By.XPath("//select[contains(@id, '__TypeID')]"));

Merci. @JeffC pour votre suggestion - ajouter le code html comme suggéré - j'ai gardé l'image du code fourni précédemment.

<div class="RegEffEntryContainer" xpath="1">
<div class="row">
    <div class="col-11">
      <input type="hidden" name="Entries.index" autocomplete="off" value="21b28f6b-8aaa-4924-815a-1d925585fa36">
      <input data-val="true" data-val-number="The field EntryID must be a number." data-val-required="The EntryID field is required." id="Entries_21b28f6b-8aaa-4924-815a-1d925585fa36__EntryID" name="Entries[21b28f6b-8aaa-4924-815a-1d925585fa36].EntryID" type="hidden" value="391">                
            <div class="row">
                <div class="col-12 col-sm-6 col-lg-3">
                    <div class="field-wrapper">
                       <select class="form-control valid" data-val="true" data-val-number="The field TypeID must be a number." id="Entries_21b28f6b-8aaa-4924-815a-1d925585fa36__TypeID" name="Entries[21b28f6b-8aaa-4924-815a-1d925585fa36].TypeID" required="" aria-describedby="Entries_21b28f6b-8aaa-4924-815a-1d925585fa36__TypeID-error" aria-invalid="false">
                          <option value="">Select type</option>
                          <option value="1">Regulatory Activity</option>
                          <option value="2">Major Project</option>
                          <option value="3">Other Activities</option>
                       </select><span class="asterisk">*</span>
                    </div>
                </div>

Mise à jour [27/02/2019 7:00 PM] - puisque les identifiants numériques ( value: 21b28f6b-8aaa-4924-815a-1d925585fa36 ci-dessus) utilisé pour TypeID/OrganisationID est créé dynamiquement lors du chargement de la page, existe-t-il un moyen d'utiliser l'option Javascript d'enregistrer cela dans une variable au chargement de la page et de réutiliser celle-ci pour créer un XPath pour l'identification des éléments plus tard ? enter image description here

0voto

Waqar Nadir Points 328

Si vous connaissez le nombre exact de lignes, utilisez simplement ceci

IWebElement firstSelect = driver.FindElement(By.XPath("//select[contains(@id, '__TypeID')][1]")); 
IWebElement secondSelect = driver.FindElement(By.XPath("//select[contains(@id, '__TypeID')][2]"));
IWebElement thirdSelect = driver.FindElement(By.XPath("//select[contains(@id, '__TypeID')][3]"));

0voto

Manish Sharma Points 63

Ce n'est peut-être pas une réponse parfaite, ni la meilleure façon de procéder, mais j'ai pu résoudre ce problème en utilisant les méthodes suivantes JavaScript . J'ai utilisé un tableau pour stocker les identifiants dynamiques au moment de l'exécution, puis je les ai utilisés pour créer une chaîne de caractères afin de trouver l'élément requis dans le DOM. Voici mon code.

int numberOfEntriesOnPage = System.Convert.ToInt32(((IJavaScriptExecutor)driver).ExecuteScript("return document.getElementsByName('Entries.index').length"));
string[] array = new string[numberOfEntriesOnPage];
         for (int a = 0; a < numberOfEntriesOnPage; a++)
            {
                String script = "return document.getElementsByName('Entries.index')[" + a + "].value";
                array[a] = ((IJavaScriptExecutor)driver).ExecuteScript(script).ToString();
                Console.WriteLine("Array value:" + array[a]);
                string rowTypeID = "Entries_" + array[a] + "__TypeID";

                select_select_by_index(By.Id("Entries_" + array[a] + "__TypeID"), 1);
                IWebElement selectOrg = find_element(By.Name("Entries[" + array[a] + "].OrganisationID_input"));
                selectOrg.Clear();
                selectOrg.SendKeys("3801 LTD");

                IWebElement selectInOffice = driver.FindElement(By.Id("Entries_" + array[a] + "__InOffice"));
                selectInOffice.Clear();
                selectInOffice.SendKeys("10");

                IWebElement selectOffsite = driver.FindElement(By.Id("Entries_" + array[a] + "__Offsite"));
                selectOffsite.Clear();
                selectOffsite.SendKeys("5");

                IWebElement comments = driver.FindElement(By.Id("Entries_" + array[a] + "__Comment"));
                comments.Clear();
                comments.SendKeys(array[a] + "Manish test");

                IWebElement save = find_element(By.XPath("//button[@value='SaveDraft']"));

                save.Click();

            }

public static void select_select_by_index(By by, int index)
    {
        var select = new SelectElement(find_element(by));
        select.SelectByIndex(index);
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X