Экранирование литерала XPath с помощью Python - PullRequest
6 голосов
/ 04 августа 2011

Я пишу общую библиотеку для настройки пакета тестирования автоматизации с помощью веб-драйвера Selenium 2.0 Python.

def verify_error_message_present(self, message):
    try:
        self.driver.find_element_by_xpath("//span[@class='error'][contains(.,'%s')]" % message)
        self.assertTrue(True, "Found an error message containing %s" % message
    except Exception, e:
        self.logger.exception(e)

Я хотел бы экранировать сообщение перед передачей его в запрос XPath, чтобы оно могло поддерживать, если 'message' что-то типа "Количество используемых слотов памяти (32) превышает количество доступных слотов памяти (16) «

Без экранирования запрос xpath не будет работать, поскольку он содержит '(' и ')'

Какую библиотеку мы можем использовать для этого в Python?

Я знаю, что это простой вопрос, но у меня нет такого большого опыта работы с Python (только начался).

Заранее спасибо.

Дополнительная информация :

Во время тестирования в firebug, приведенный ниже запрос не даст результата:

//span[@class='error'][contains(.,'The number of memory slots used (32) exceeds the number of memory slots that are available (16)')]

В то время как запрос ниже вернет желаемый компонент:

//span[@class='error'][contains(.,'The number of memory slots used \(32\) exceeds the number of memory slots that are available \(16\)')]

Логически эту проблему можно решить, заменив ) на \) для этого конкретного строкового литерала, но тогда все еще есть другие символы, которые необходимо экранировать. Так есть ли какая-нибудь библиотека, чтобы сделать это надлежащим образом?

1 Ответ

8 голосов
/ 04 августа 2011

Скобки там должны быть в порядке. Они находятся внутри строкового литерала XPath, разделенного апострофом, поэтому они преждевременно не завершают условие contains.

Проблема в том, что происходит, когда в вашей строке есть апострофы, так как они заканчивают строковый литерал, нарушая выражение. К сожалению, для строковых литералов XPath не существует схемы экранирования строк, поэтому вам придется обходить ее, используя выражения для генерации проблемных символов, обычно в форме concat('str1', "'", 'str2').

Вот функция Python для этого:

def toXPathStringLiteral(s):
    if "'" not in s: return "'%s'" % s
    if '"' not in s: return '"%s"' % s
    return "concat('%s')" % s.replace("'", "',\"'\",'")

"//span[@class='error'][contains(.,%s)]" % toXPathStringLiteral(message)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...