Хорошо, я пытаюсь оптимизировать свои тесты. Это может быть просто ограничение Selenium Webdriver, но я так и не смог получить надежный ответ на этот вопрос, поэтому я задаю вопрос напрямую. Причина, по которой это происходит, заключается в том, что для моих тестов я должен использовать селекторы xpath. Недавно мне приходилось возвращаться и менять все мои селекторы на всех моих тестах, потому что div был добавлен где-то, или мы обновили до extJS 6, который переписал структуру. По существу, в приведенном ниже примере я пошел с использованиемКак лучше всего заменить селекторы xpath на элементы, созданные EXTJS с помощью Selenium Webdriver в Java
driver.findElement(By.xpath("html/body/div/div/div/table/tbody/tr[1]/td/span")).getText();
в
driver.findElement(By.xpath("html/body/div/div/div/table[1]/tbody/tr/td/span")).getText();
Как вы можете видеть изменения были небольшие, но я должен был сделать их более сотни тестов, некоторые из которых были гораздо более сложно. Вот пример кода, с которым я тестирую.
<html>
<body>
<div id="syn-scheduletree-body" class="class="x-panel-body x-grid-no-row-lines x-grid-body x-panel-body-default x-panel-body-default"">
<div class="x-tree-view x-fit-item x-tree-view-default x-unselectable x-scroller">
<div class="x-grid-item-container">
//Here is Example 1
<table id="treeview-1068-record-158">
<tbody>
<tr class="x-grid-tree-node-leaf x-grid-row">
<td class="x-grid-tree-node-leaf x-grid-row">
<span class="x-tree-node-text">
Example 1
</span>
</td>
</tr>
</tbody>
</table>
//Here is Example 2
<table id="treeview-1068-record-159">
<tbody>
<tr class="x-grid-tree-node-leaf x-grid-row">
<td class="x-grid-tree-node-leaf x-grid-row">
<span class="x-tree-node-text">
Example 2
</span>
</td>
</tr>
</tbody>
</table>
//Here is Example 3
<table id="treeview-1068-record-160">
<tbody>
<tr class="x-grid-tree-node-leaf x-grid-row">
<td class="x-grid-tree-node-leaf x-grid-row">
<span class="x-tree-node-text">
Example 3
</span>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>
В одном из моих тестов я должен пройти и нажмите на кнопку Сохранить, которая создала новый экземпляр в списке в таблице. Из-за этого я не могу полагаться на какой-либо жестко закодированный xpath, поскольку числовое число, сгенерированное вместе с новым div, будет отличаться каждый раз. Поэтому я включил следующую логику
String i = 1;
while (i < 100) {
String temp = driver.findElement(By.xpath("html/body/div/div/div/table[" + i + "]/tbody/tr/td/span")).getText();
if (temp.contains("Example 2")) {
break;
}
i++;
}
Это включает в себя Java логику, чтобы найти элемент в списке, а также сберегать расположение этого элемента с String, я.
Вопрос, который у меня есть, - это лучший способ. У меня был сотрудник, который недавно упомянул, что если я могу использовать селектор, чтобы выбрать что-то в javascript, все это может быть упрощено, и для этого потребуется меньше обслуживания, чем xpath. Я просто не знаю, как это сделать, с чего начать, если это возможно. При необходимости я могу предоставить дополнительную информацию. Пожалуйста, дайте мне знать, если у вас есть предложения. Это еще не выпущенный продукт, поэтому я смотрю на множество изменений и дополнений в течение коротких промежутков времени, заставляя меня переписать большинство тестов из-за характера xpath.
Хорошо, что кажется, что работает, хотя я вынул все в xpath до диапазона, например driver.findElement (By.xpath ("// span [содержит (текст(), '" + report + " . «)]")) нажмите(); У меня есть вопрос, хотя. Что, если мне нужно было щелкнуть якорь ? Я уже пробовал и нажатие на пробел внутри якоря не работает. Как я могу применить код, который вы мне дали, чтобы щелкнуть якорь, содержащий пробел, который содержит определенный набор текста? – Senator1891
@ Senator1891 Я не знаю точно, вы могли бы попробовать решение acikojevics, но я не знаю, работает ли оно. Что я нашел, так что вы можете перейти к элементу xpath с помощью «..», ваша строка будет выглядеть так : "driver.findElement (By.xpath (" // span [содержит (текст(), '"+ report +"')]/.. ")). click();" –