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

Мне интересно, 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 Developer Tool не найдет веб-элемент).

Когда я попытался " для значения, подобного этому

//div[@ng-show="element['ServerValidationFailed']"] и

//div[text()="Sorry, that isn't a valid number."]

Работает нормально (инструмент разработчика Chromeнайти совпадение).

Я немного запутался, должно ли это быть одинарная кавычка ' или двойная кавычка "?

Ответы [ 3 ]

2 голосов
/ 03 апреля 2019

xpath поддерживает одинарные и двойные кавычки для определения атрибутов, но в случае экранирования одинарных кавычек не следует общей концепции программирования.Поэтому в случае экранирования одинарных кавычек всегда указывайте значение атрибута в двойных кавычках.

Пожалуйста, посмотрите :: https://github.com/xmlunit/xmlunit/issues/110

2 голосов
/ 03 апреля 2019

Либо один работает нормально. Все сводится к содержанию, с которым вы хотите сопоставить.

Примеры, показанные в w3.org xpath, сокращенный синтаксис предлагает двойные кавычки (").

Причина в том, что вы можете убежать " с помощью \", но вы не можете убежать ' с помощью \'.

Если значение, которое вы хотите сопоставить, содержит символ ', вы должны использовать " для переноса значения.

//div[@ng-show="element['ServerValidationFailed']"]

Если значение, которое вы хотите сопоставить, содержит ", но не ', вы можете использовать ' для переноса значения.

//div[@ng-show='element["ServerValidationFailed"]']

Если значение, которое вы хотите сопоставить, содержит и " & ', вы должны использовать ", чтобы обернуть значение и экранировать " в вашем значении с помощью \".

//div[@ng-show="element['ServerValidationFailed']==\"0\""]

Это будет соответствовать что-то вроде

<div ng-show="element['ServerValidationFailed']==&quot;0&quot;"></div>

Не говорю, что вы должны это делать, но на всякий случай, если вам это нужно.

1 голос
/ 03 апреля 2019

Это то, что я использую для этого конкретного условия одинарных и / или двойных кавычек.Попробуйте это и проверьте с текстом, который вам нужно проверить.

    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("'", "',\"'\",'") + "'))]";
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...