Я пытаюсь выполнить часть тестирования с помощью selenium2, используя следующий код:
private const string TicketName = "Automated Test Ticket";
[Test]
public void EditTicketTest() {
var tableData = driver.FindElement(By.XPath("//td[contains(text(), '" + TicketName + "')]"));
}
Тест не выполняется по следующей причине:
OpenQA.Selenium.NoSuchElementException: не удается найти элемент: {"method": "xpath", "selector": "//td [contains (text(), 'Automaticated Tick Ticket')]"}
Но когда я смотрю на страницу и проверяю элемент, текст определенно находится внутри тега. Возможно ли, что есть некоторый избыточный интервал или что-то еще, что может заставить его не распознавать текст?
Вот HTML:
<tr data-id="55">
<td>55</td>
<td class="ticket-title">
<span data-original-title="Automated Test Ticket" class="work-on-ticket-note-icon-tickets" data-toggle="tooltip" data-placement="right" data-trigger="hover" title=""></span> <span data-original-title="This is a work on ticket note for a company!" class="work-on-ticket-note-icon-companies" data-toggle="tooltip" data-placement="right" data-trigger="hover" title=""></span> Automated Test Ticket
</td>
<td>Medium</td>
<td>Active</td>
<td>8/25/2014<br> <small>(0 changes)</small></td>
<td><a href="#" class="modal-open" data-modal="company-details-modal" data-url="/companies/details/1"></a></td>
<td>
<strong class="text-danger">None Assigned</strong>
</td>
<td>
<a href="#" class="modal-open btn btn-sm btn-success" data-modal="edit-modal" data-url="/{controller}/edit/55"><span class="glyphicon glyphicon-edit"></span></a>
<a href="#" class="modal-open btn btn-sm btn-info" data-modal="log-modal" data-url="/{controller}/log/55"><span class="glyphicon glyphicon-list-alt"></span></a>
<a href="#" class="modal-open btn btn-sm btn-warning" data-modal="addtime-modal" data-url="/{controller}/addtime/55"><span class="glyphicon glyphicon-time"></span></a>
</td>
</tr>
В рассматриваемом td
содержится несколько пустых текстовых узлов в качестве дочерних элементов, а когда text()
используется в функции, которая принимает строку, она будет оценивать строковое значение первого совпадающего узла в порядке документа, так что это:
//td[contains(text(), 'Automated Test Ticket')]
Оценивает что-то вроде этого:
//td[contains(" ", 'Automated Test Ticket')]
Который всегда будет производить пустой набор узлов.
Вот два варианта:
//td[contains(., 'Automated Test Ticket')]
который будет соответствовать любому td
который имеет непрерывный "Автоматический тестовый билет" в любом месте внутри него, или это:
//td[text()[contains(., 'Automated Test Ticket')]]
который будет соответствовать любому td
который имеет непосредственный дочерний текстовый узел, содержащий текст "Автоматический тестовый билет".
Я предпочитаю первый вариант, потому что он чище и имеет больше шансов на совпадение, если вы не совсем уверены в том, что будет содержать td
.
NoSuchElementException
обычноNoSuchElementException
из-за того, что 1. элемент, который вы пытаетесь найти, находится в<frame>
или<iframe>
, или 2. элемент, который вы пытаетесь найти, еще не отображается на странице, когда предпринята попытка.