Как получить доступ к списку текста дочернего узла элемента li с использованием selenium в c#

#c# #list #selenium-webdriver #dom #xpath

#c# #Список #selenium-webdriver #dom #xpath

Вопрос:

Возникли проблемы с доступом к дочернему узлу элемента li. Хотите распечатать весь текст в списке (который действует как выпадающий список на веб-странице). Но весь текст находится внутри элемента li под тегом a> (третий тег a>).

Вот пример структуры DOM, с которой я пытаюсь работать. Это было дано мне, и у меня нет возможности его изменить.

 <div class="navbar-collapse collapse" id="navbar-mobile">
        <ul class="nav navbar-nav">
            <li data-ng-show="!vm.inIdentity" class="dropdown width-250 
             open">
                <a href="" class="dropdown-toggle ng-binding" data- 
                 toggle="dropdown" aria-expanded="true">
                    <i class="icon-database position-left"></i> Select a 
                    repository <span class="caret"></span>
                </a>
                <ul class="dropdown-menu width-250 overflow-auto" 
                 style="max-height: 500px">
                    <li class="dropdown-header">Repositories</li>
                    <!-- ngRepeat: repository in vm.repositories --><li 
                     data-ng-repeat="repository in vm.repositories" 
                      class="ng-scope" style="">
                        <a href="" data-ng- 
                        click="vm.selectRepository(repository)" 
                        class="ng- 
                        binding"><i class="icon-database4"></i> **Akzo 
                        Nobel**</a>
                    </li><!-- end ngRepeat: repository in vm.repositories 
                          --><li data-ng-repeat="repository in 
                           vm.repositories" class="ng-scope">
                        <a href="" data-ng- 
                        click="vm.selectRepository(repository)" 
                        class="ng-binding"><i class="icon-database4"></i> 
                        AltAir Paramount</a>
                    </li><!-- end ngRepeat: repository in vm.repositories 
                    -->


       IWebElement dropdown = driver.FindElement(By.XPath("//* 
           [@id='navbar-mobile']/ul[1]/li[1]/ul/li[2]/a"));

        Console.WriteLine(dropdown.Text);
        IList <IWebElement> ele = 
        dropdown.FindElements(By.XPath("//li"));


        foreach (var li in ele)
        {

            Debug.WriteLine(li.Text);

        }//end foreach loop
  

Я ожидаю, что значения будут распечатаны. Такие значения, как «Akzo Nobel», «AltAir Paramount» и т.д. Которые расположены под элементами li и тегами a>. Но по какой-то причине я могу видеть только текст «Выбрать репозиторий» в окне отладчика.

Комментарии:

1. Я смог решить проблему, скопировав DOM для фактического веб-сайта, а затем оттуда вставил в notepad и сохранил файл как .html. Я сохранил его на своем рабочем столе, а затем в selenium вызвал URL (URL, который был сгенерирован путем сохранения его в виде HTML-файла в Chrome). В моем коде вместо использования исходного URL (который является частным URL) Затем я бы использовал новый URL-адрес HTML, который был сгенерирован. И я использовал этот код, чтобы затем извлечь текстовые значения, которые были в элементе> под элементом li.

2. Выпадающий список IWebElement = драйвер. findElement(By.XPath(«//div[содержит(@id,’navbar-mobile’)]»)); var ele = выпадающий список. findElements(By.XPath(«//i[содержит(@class,’icon-database4′)]»)); foreach (var li в ele) { Отладка. Строка записи (li.Text); }

3. Дело в том, что этот код работает только для вновь созданного HTML-файла, который был создан не для частного URL или фактического веб-сайта. Когда я пытаюсь применить его к реальному веб-сайту, он отображается в виде пустой строки текста в представлении отладчика.