Использует ли Xpath для поиска веб-элемента в Selenium одинарную кавычку или двойную кавычку для переноса значения?

#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("'", "',"'",'")   "'))]";
    }