Как выбрать выпадающий элемент с помощью Selenium в C # из списка с динамическим (изменяющимся) значением Xpath при каждой загрузке страницы - PullRequest
0 голосов
/ 26 февраля 2019

Для моего автоматического теста с использованием селена в C # я хочу выбрать элемент раскрывающегося списка (любой) из поля type (см. Прикрепленное изображение), однако, так как идентификатор / xpath для выбранного элемента полученгенерируется динамически при каждой загрузке страницы, щелчок выбранного элемента не выполняется, когда я запускаю записанный скрипт.

enter image description here Например, мой скрипт ниже не работает, как XPath "// select [@ name = 'Entries [ db9ef219-0f54-4925-9589-0f39351f44a4 ] .TypeID '] "меняется каждый раз, когда я запускаю тест в VS.Net.Значение db9ef219-0f54-4925-9589-0f39351f44a4 изменяется каждый раз при загрузке страницы.

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

Вот код страницы - при загрузке для каждой новой строки генерируется уникальное значение (ниже его c36582c1-131a-4f6f-8711-390048f5779f ) и сохраняется в классе RegEffEntryContainer , и используется для каждого элемента списка - тип / описание (например, id = "Entries_c36582c1-131a-4f6f-8711-390048f5779f__TypeID", id = "Entries_c36582c1-131a-4f6f-8711-39f_ffff 8711-39f_ff) f0ff 8711-39fff*

enter image description here

Любая помощь в решении этой проблемы будет принята с благодарностью - заранее спасибо!

FYI : Если я используюВ приведенном ниже коде, использующем Dynamic XPath, он будет работать только для первой строки, и я не смог бы записать любые последующие записи строки через скрипт.Требуется ввести все 3 заявки, прежде чем нажать кнопку Сохранить / Отправить (не показано на снимке экрана выше).

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

Спасибо @ JeffC за ваше предложение- добавив HTML-код, как было предложено - я все еще сохранил изображение кода, предоставленное ранее.

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

Обновление [27/02/2019 19:00] - начиная с числового идентификатора ( значение: 21b28f6b-8aaa-4924-815a-1d925585fa36 выше) используется для TypeID / OrganisationID создается динамически при загрузке страницы, есть ли способ с помощью Javascript записать это в переменную при загрузке страницы и повторно использовать это для создания XPath для идентификации элемента позже?enter image description here

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Возможно, это не идеальный ответ или лучший способ сделать это, но мне удалось решить эту проблему с помощью JavaScript .Использовал массив для хранения динамических идентификаторов во время выполнения, а затем использовал их для создания строки, чтобы найти необходимый элемент в DOM.Ниже мой код.

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);
    }
0 голосов
/ 26 февраля 2019

Если вы знаете точное количество строк, просто используйте это

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]"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...