2017-02-15 6 views
2

Я хочу найти элемент с XPath в Selenium, который содержит текст, но имеет два возможных случая. Здесь есть:Обложка двух корпусов с одним XPath?

.//li/a[contains(., 'blah')] 
.//li/a/span[contains(., 'blah')] 

Как покрыть два корпуса одним XPath?

Второй вопрос если возможно, я хочу получить в качестве результата указатель на элемент a, а не span в обоих случаях.

Кроме того, существует ли общий способ возврата в качестве родителя сопоставления совпадающего элемента?

+2

Не первый ли XPath '.// li/a [содержит (., 'Blah')]' охватывает оба случая? –

ответ

4

в общем, XPaths выражение может быть объединено с | (например: xpath1 | xpath2), однако вы на самом деле не нужно делать в этом случае ...

Как Josh Crozier спрашивает в комментариях, да, .//li/a[contains(., 'blah')] охватывает оба случая.

Значение строки a обязательно будет содержать "blah", если какие-либо из значений строк своего потомков span элемента содержит "blah".

Второй вопрос, если возможно, я хочу получить в качестве результата указатель на a-элемент , а не на промежуток в обоих случаях.

.//li/a[contains(., 'blah')] будет возвращать такие a элементы.

Имейте в виду, что она также будет возвращать такие элементы, как a

<a>xxxblah</a> 
<a><span>blah</span></a> 
<a><span>bl</span><span>ah</span></a> 

PS> Кстати есть общий способ вернуться в матч родителя совпавшего элемента, вместо этого?

Ну, добавление /.. к XPath возвращает родителя, но я подозреваю, что вы бы извлечь выгоду из изучения строкового значения элементов XML. См. Testing text() nodes vs string values in XPath

-1

Вы можете попробовать что-то вроде этого .// литий/* [содержит (., «Бла»)]

2

Вы должны проверить XPath Я даю вам, чтобы убедиться, что он не вернется более матчи, чем вы хотите, но я бы просто использовать: //a[contains(.,'blah')]