#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 или фактического веб-сайта. Когда я пытаюсь применить его к реальному веб-сайту, он отображается в виде пустой строки текста в представлении отладчика.