#selenium #xpath
#selenium #xpath — путь #xpath
Вопрос:
Мне интересно, использует ли Xpath '
или "
для значения?
У меня есть этот веб-элемент, который я хочу захватить
<div class="has-error ng-scope ng-hide" ng-show="element['ServerValidationFailed']">Sorry, that isn't a valid number.</div>
Обычно Xpath должен иметь этот шаблон Xpath=//tagname[@attribute='value']
Но когда я попытался использовать '
для окружения значения следующим образом
//div[@ng-show='element['ServerValidationFailed']']
и
//div[text()='Sorry, that isn't a valid number.']
,
это не работает (инструмент разработчика Google Chrome не найдет веб-элемент).
Когда я пытался "
получить значение, подобное этому
//div[@ng-show="element['ServerValidationFailed']"]
и
//div[text()="Sorry, that isn't a valid number."]
Это работает нормально (инструмент разработчика Chrome найдет совпадение).
Теперь я немного запутался, должна ли это быть одинарная кавычка '
или двойная "
?
Ответ №1:
Любой из них работает нормально. Это сводится к содержимому, с которым вы хотите сопоставить.
Примеры, показанные вw3.org сокращенный синтаксис xpath предполагает двойные кавычки ( "
).
Причина в том, что вы можете убежать "
с помощью "
, но вы не можете убежать '
с '
помощью.
Если значение, которое вы хотите сопоставить, содержит '
символ, вы должны использовать "
для переноса значения.
//div[@ng-show="element['ServerValidationFailed']"]
Если значение, которое вы хотите сопоставить, содержит, "
но не '
содержит, вы можете использовать '
для переноса значения.
//div[@ng-show='element["ServerValidationFailed"]']
Если значение, которое вы хотите сопоставить, содержит оба "
amp; '
, вы должны использовать "
для переноса значения и экранирования вашего "
в вашем значении с помощью "
.
//div[@ng-show="element['ServerValidationFailed']=="0""]
Это будет соответствовать чему-то вроде
<div ng-show="element['ServerValidationFailed']==amp;quot;0amp;quot;"></div>
Не говорю, что вы должны это сделать, но на всякий случай, если вам это нужно.
Комментарии:
1. Спасибо за это. Из любопытства,
//div[@ng-show="element['ServerValidationFailed']=="0""]
найдет<div ng-show="element['ServerValidationFailed']==amp;quot;0amp;quot;"></div>
, что"0"
это значит?"0"
Представляетamp;quot;0amp;quot;
? Разве мы не можем просто использовать//div[@ng-show="element['ServerValidationFailed']==amp;quot;0amp;quot;"]
? Спасибо.2. @keylogger В HTML,
amp;quot;
переводится на"
. Смотрите пример
Ответ №2:
Xpath поддерживает как одинарные, так и двойные кавычки для определения атрибутов, но в случае экранирования одинарных кавычек это не соответствует общей концепции программирования. Поэтому в случае экранирования одинарной кавычки всегда заключайте значение атрибута в двойные кавычки .
Пожалуйста, взгляните :: https://github.com/xmlunit/xmlunit/issues/110
Комментарии:
1. Я думаю, что под «общей концепцией программирования» вы подразумеваете соглашение об избежании, используемое в семействе языков, производных от C (то есть, использование обратной косой черты). Это широко распространенное соглашение, но оно ни в коем случае не является универсальным или общим.
Ответ №3:
Это то, что я использую для этого конкретного условия одинарных и / или двойных кавычек. Попробуйте это и сверьтесь с текстом, который вам нужно проверить.
if (!TextString.contains("'")) {
XPath = "//*[contains(text(), "" TextString "")]" " | " "//*[contains(normalize-space(), "" TextString "")]";
} else if (!Label.contains(""")) {
XPath = "//*[contains(text(), '" TextString "')]" " | " "//*[contains(normalize-space(), '" TextString "')]";
} else {
XPath = "//*[contains(text()," "concat('" TextString.replace("'", "',"'",'") "'))]" " | " "//*[contains(normalize-space()," "concat('" TextString.replace("'", "',"'",'") "'))]";
}