Поиск конкретной таблицы без идентификатора
Я работаю над своим первым проектом по селену, и я столкнулся с проблемой. У меня есть веб-страница, которая содержит 3 разных таблицы. Я только хочу получить данные из одной из этих таблиц. Проблема, с которой я сталкиваюсь, заключается в том, что для стилизации этих страниц использовался загрузчик, поэтому все таблицы имеют один и тот же класс, и ни у одной из них нет идентификатора, который я могу специально искать. Я смог сделать это на другой странице путем поиска xpath для tr / td, но это не работает для этой страницы из-за нескольких таблиц. Изучая источник страницы для таблицы, из которой я хочу получить данные, я получаю что-то вроде следующего:
<div class="col-md-4">
<div class="panel panel-success">
<div class="panel-panel-heading>
<h3 class="panel-title">table title</h3>
</div>
<div class="table-responsive">
<table class="table-striped table-bordered">
<thead>...</thead>
<tbody>
<tr ng-repeat="element in main.elementService.elementTable" class="ng-scope">
<td class="ng-binding">info1</td>
<td class="ng-binding">info2</td>
<td class="ng-binding">info3</td>
<td class="ng-binding">info4</td>
</tr>
<tr ng-repeat="element in main.elementService.elementTable" class="ng-scope">
<tr ng-repeat="element in main.elementService.elementTable" class="ng-scope">
<tr ng-repeat="element in main.elementService.elementTable" class="ng-scope">
</tbody>
</table>
</div>
Так что это приводит меня к проблеме, что я не уверен, что я могу использовать, чтобы выбрать только эту таблицу. Если я ищу tr
или же td
Я также получу данные из других таблиц на странице.
Единственная уникальная особенность этой таблицы, которую я вижу, это <div class="col-md-4">.
Я не знаю, возможно ли это, но моя идея заключалась в том, чтобы выполнить какой-то комбинированный поиск, чтобы перейти к этому конкретному div, а затем перейти к xpath tr / td, чтобы получить данные из каждой ячейки таблицы, но я Я новичок в селене, и я не уверен, как это сделать. Документация, на которую я смотрю, похоже, не показывает, как объединить несколько стратегий, и у меня возникают проблемы с формулировкой этого для поиска в Google, поэтому я не нашел ссылку Google, которая дала бы мне какое-либо представление о том, как это сделать.,
Я пробовал что-то вроде этого, но я не думаю, что мой синтаксис правильный
List<WebElement> TableElems = chrome.findElements(By.xpath("//div[@class='col-md-4']//tr/td"));
Я тоже пробовал
List<WebElement> TableElems = chrome.findElements(By.xpath("//div[@class='col-md-4']" && "//tr/td"));
но &&
Оператор здесь не допускается.
Если у кого-то есть какие-либо идеи, чтобы направить меня в правильном направлении, я был бы благодарен
6 ответов
Вы можете использовать это выражение xpath:
"//div[@class='col-md-4']//tr/td"
Разница в вашей попытке заключается в использовании class
атрибут (нет идентификатора) и двойной слеш перед tr
что позволяет tr
быть потомком элемента div[@id='col-md-4']
в любой глубине, а не просто прямой ребенок.
Попробуйте вместо этого использовать метод "find_element_by_css_selector". Вы также можете использовать CSS-селектор "nth-child", если вы столкнулись с подобной проблемой, когда у вас нет определенного класса. С классом:
By.css(".col-md-4 tr > td")
Если все таблицы имеют класс col-md-4, если вам нужна третья таблица страницы:
By.css(".col-md-4:nth-child(3) tr > td")
Кроме того, вы даете своему запросу xpath id
атрибут, но "col-md-4" является class
, быть осторожен.
Вы можете попробовать этот Xpath
/html/body/div/div/div/table/tbody/tr[1]/td[text()='info3']/../../..
если вы пытаетесь выбрать таблицу, в случае, если вы хотите выбрать td, удалите остаток после td[text()='info3']
Вы можете использовать ниже xpath, чтобы получить значения каждой таблицы по их позиции.
.//table[1]/descendant::tr/td -for table 1
.//table[2]/descendant::tr/td -for table 2
Попробуйте что-то вроде этого:
//table[contains(concat(" ", normalize-space(@id), " "), " table-striped table-bordered"][//td[contains(text() , "info1")]])[1]
Что я обычно делаю в этих ситуациях, так это сначала нахожу элементы таблицы:
List<WebElement> tables = (List<WebElement>)chrome.findElements(By.className("table-responsive"));
Затем получите точную таблицу, которую вы хотите:
WebElement table = tables.get(i);
Вы можете повторить это и использовать циклы, чтобы перейти к точным данным, которые вы хотите.
List<WebElement> dataElements = (List<WebElement>)chrome.findElements(By.className("ng-binding"));
for (int i=0; i<dataElements.size(); i++) {
String data = dataElements.get(i).getText();
//Do something with data
}