2017-01-11 8 views
1

В Selenium WebDriver, как использовать XPath для ниже HTML с помощью Link Text ("Add New Button")Поиск xpath ссылки с использованием текста ссылки?

<a href="SOME URL"> 
<span > 
    <i class=""/> 
</span>Add New Button 
</a> 

Я попытался проверить элемент, как показано ниже, но все DInt работы

1) //a[text()='Add New Button'] 
2) //a[contains(text(),'Add New Button'] 
3) //a/span/i[text()='Add New Button'] 
4) //a/span/i[contains(text(),'Add New Button'] 

Я знаю, что 3 и 4 не будет, но просто попробовал.

Итак, для такого HTML DOM, как найти ссылку, используя текст ссылки, используя xpath?

+1

Попробуйте с // а [содержит ("Add New Button.)] – acikojevic

+2

2) отсутствует закрывающий скобки не так ли? – geisterfurz007

ответ

3

Некоторые из ответов, уже дали работу, другие - нет. И я думаю, что ОП выиграет от большего количества объяснений.

Ваше оригинальное выражение:

//a[text()='Add New Button'] 

не работает, так как текстовый узел, который содержит «Add New Button» также имеет символ новой строки в конце.

Следующая один:

//a[contains(text(),'Add New Button'] 

Не работает (оставляя в стороне недостающую скобку), потому что text() возвращает последовательность узлов и функции, как будет только оценить первый узел в последовательности , В этом случае первый текстовый узел внутри a содержит только пробелы и не тот, который содержит «Добавить новую кнопку».

Вы можете подтвердить это утверждение с:

//a[contains(text()[2],'Add New Button')] 

, который будет проверять, содержит ли текст узла aвторого «Add New Button» - и это выражение возвращает a элемента.Но лучшим решением в этом случае является:

//a[contains(.,'Add New Button')] 

. будет вычисляться так называемой «строковое значение» элемента, конкатенации всех его текстовых узлов, которые будут включать в себя «Add New Button».


Раствор с normalize-space() также возможно, но имеет вложенные предикаты:

//a[text()[normalize-space(.) = "Add New Button"]] 
1

с XPath вы можете проверить, если элемент содержит текст ниже заявление

//a[contains(., 'Button')] 
0

Используйте следующие xpath

//*[contains(text(),'Add New Button')] 

или

//a/i[contains(text(),'Add New Button')] 

или

//a[@href='SOME URL']/i 

или с помощью cssSelector -

a[href='SOME URL']>i 
+0

Первые два из ваших предложений ошибочны (они не возвращают никакого результата), а остальные два игнорируют тот факт, что для добавления элемента следует использовать «Добавить новую кнопку». –

1

текст Link содержит ненужные пробелы с правой стороны основного текста, так что вам нужно следующее, чтобы избавиться от них:

'//a[normalize-space(.)="Add New Button"]' 
+2

Этот ответ возвращает правильный результат, но по неправильной причине. 'text() =« Добавить новую кнопку »' оценивается как «false», потому что такого текстового узла нет. 'normalize-space()' будет интерпретировать логическое значение как строку (идентичную результату: 'string (// a/text() =" Add New Button ")), а весь предикат сводится к:'// а [истинный] '. Вы можете проверить это, удалив «Добавить новую кнопку» из HTML, и элемент 'a' все равно будет возвращен. –

+0

@ MathiasMüller, Понял. Ответ обновлен – Andersson

+0

Спасибо! Теперь ваш ответ правильный. –

Смежные вопросы