Cómo seleccionar un elemento desplegable usando Selenium en C # de un cuadro de lista con valor de XPath dinámico (cambiante) en cada carga de página

Manish Sharma

Para mi prueba automatizada usando selenio en C #, quiero seleccionar un elemento de la lista desplegable (cualquiera) del campo de tipo (imagen adjunta de referencia), sin embargo, dado que la identificación / xpath para el elemento seleccionado se genera dinámicamente en cada carga de página, mi seleccionado el clic del elemento falla cuando ejecuto mi script grabado.

ingrese la descripción de la imagen aquíPor ejemplo, mi siguiente script falla, ya que XPath "// select [@ name = 'Entries [ db9ef219-0f54-4925-9589-0f39351f44a4 ] .TypeID']" cambia cada vez que ejecuto la prueba en VS.Net. El valor db9ef219-0f54-4925-9589-0f39351f44a4 cambia cada vez que se carga la página.

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

Aquí está el código de la página: en la carga para cada nueva fila, se genera un valor único (debajo de c36582c1-131a-4f6f-8711-390048f5779f ) y se almacena en la clase RegEffEntryContainer , y se usa para cada elemento de la lista: tipo / descripción (por ejemplo, id = "Entries_c36582c1-131a-4f6f-8711-390048f5779f__TypeID", id = "Entries_c36582c1-131a-4f6f-8711-390048f5779f__Organisation")

ingrese la descripción de la imagen aquí

Cualquier ayuda para resolver este problema será muy apreciada. ¡Gracias de antemano!

FYI : Si utilizo el siguiente código usando Dynamic XPath, solo funcionará para la primera fila y no podría registrar ninguna entrada de fila posterior a través del script. El requisito es ingresar las 3 entradas antes de hacer clic en el botón Guardar / Enviar (no se muestra en la captura de pantalla anterior).

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

Gracias @JeffC por su sugerencia, agregando el código html como se sugirió, todavía conservo la imagen del código proporcionada anteriormente.

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

Actualización [27/02/2019 7:00 PM] : dado que los ID numéricos ( valor: 21b28f6b-8aaa-4924-815a-1d925585fa36 arriba) utilizados para TypeID / OrganisationID se crean dinámicamente al cargar la página, ¿hay alguna manera de usar Javascript para registrar esto en una variable al cargar la página y reutilizarlo para crear un XPath para la identificación del elemento más adelante?ingrese la descripción de la imagen aquí

Manish Sharma

Puede que esta no sea una respuesta perfecta, o la mejor manera de hacerlo, pero pude resolver este problema usando JavaScript . Usó una matriz para almacenar los identificadores dinámicos en tiempo de ejecución y luego los usó para crear cadenas para encontrar el elemento requerido en DOM. A continuación se muestra mi código.

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

Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.

En caso de infracción, por favor [email protected] Eliminar

Editado en
0

Déjame decir algunas palabras

0Comentarios
Iniciar sesiónRevisión de participación posterior

Artículos relacionados

TOP Lista

CalienteEtiquetas

Archivo