Как обрабатывать апострофы ( ' ) с помощью XPATH в QTP

проверьте этот фрагмент кода

Пожалуйста, обратитесь к приведенному ниже коду.

rv = “Are you 56' taller ?”

Если я пройду 20 полей, т.е. до [rv = “ Are you 56' taller ? "]. Это не работает, потому что ‘ — апостроф используется для комментария в QTP

Как обрабатывать '(апостроф) в Xpath с помощью QTP?

Фрагмент кода:

 rv = Replace (rv,"'", "\'")
 rv = LEFT(rv,50)

 If SVAL = "Yes" Then

 Set oobj = Browser("xyz").Page("abc").WebElement("xpath:=//div[contains(text(),'"& rv &"')]/../..//label[starts-with(text(),'Yes')]")
 oobj.Click
 oobj.Click

 i = i+1             

End If

Я очень ценю ваш ответ.


person user3411743    schedule 12.03.2014    source источник


Ответы (4)


Попробуйте использовать character code chr(39) вместо апострофа, как показано ниже:

 "Are you 56" & chr(39) & " taller ?"

Msgbox в QTP, показывающий Вы на 56 футов выше

person Amit Verma    schedule 12.03.2014
comment
Я не знаю, почему за это проголосовали, это решение фактически устраняет проблему (в отличие от других ответов, которые были здесь раньше). - person Motti; 13.03.2014

Как уже упоминалось, это не потому, что ' является комментарием в vbscript (не только QTP), а потому, что вы слишком рано заканчиваете строку.

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

Чтобы получить двойную кавычку в строке в VBScript, дважды напишите "Like ""this"" for example".

Итак, ваш XPath должен выглядеть так:

"//div[contains(text(),""Are you 56' taller ?"")]"

Вместо этого:

"//div[contains(text(),'Are you 56' taller ?')]"

Или на вашем примере:

Browser("xyz").Page("abc").WebElement("xpath:=//div[contains(text(),"""& rv &""")]/../..//label[starts-with(text(),'Yes')]")

(Обратите внимание, что это было протестировано и работает)

person Motti    schedule 13.03.2014
comment
Спасибо, Мотти, очень хорошее объяснение. Еще один момент: если я использую этот подход, то как обрабатывать пробелы между txt. Если есть большой текст с несколькими вопросами. Пример: Прочитайте все приведенные ниже вопросы и ответьте Да/Нет. Если какой-либо из ответов НЕТ, выберите НЕТ ‹5 знаков› 1) Ваш рост выше 56 футов2) Умеете ли вы читать, писать и говорить по-испански ‹ 7 знаков› 3) Вы можете добираться до работы на твой собственный? ‹ 6 символьных пробелов› 4) Вы остаетесь в городе Теперь, рассматривая вышеуказанный вопрос, как передать этот текст в x-пути, так как есть неровные пробелы. Большое спасибо. - person user3411743; 15.03.2014
comment
Я не очень хорошо знаком с XPath, насколько я знаю, он не поддерживает регулярные выражения, однако описание QTP поддерживает регулярные выражения, поэтому, возможно, вам следует использовать обычное описание (\s+ соответствует одному или нескольким пробелам или табуляциям). - person Motti; 16.03.2014

Используйте ' вместо ('), чтобы строка могла быть правильно обработана.

Подтверждающие доказательства -> нажмите здесь.

person Rich    schedule 12.03.2014

Это не имеет ничего общего с тем, что ' является символом комментария. Это нормальный рабочий код:

Msgbox "'I love deadlines. I like the whooshing sound they make as they fly by.' Douglas Adams" 

Ваш код приводит к ошибке, потому что некоторые символы необходимо экранировать, например <, >, & и ваш печально известный '. Чтобы правильно ввести строку выше в тег XML, вам нужно сделать это:

htmlEscaped = "&apos;I love deadlines. I like the whooshing sound they make as they fly by.&apos Douglas Adams"

Здесь вы можете найти обзор набора наиболее распространенных символов, которые необходимо экранировать (хотя это не совсем так: если вы используете кодировку Unicode/UTF-8, некоторые символы будут нормально анализироваться).

К сожалению, в VBScript нет встроенной функции, экранирующей HTML, например, функции Escape для URL-адресов. Только если вы находитесь на сервере ASP, вы можете использовать Server.HtmlEncode, но это не ваш случай

Чтобы обобщить экранирование html (рассматривать все как особое, за исключением самых распространенных), вы можете использовать скрипт, например это:

Function HTMLEncode(ByVal sVal)

    sReturn = ""

    If ((TypeName(sVal)="String") And (Not IsNull(sVal)) And (sVal<>"")) Then

        For i = 1 To Len(sVal)

            ch = Mid(sVal, i, 1)

            Set oRE = New RegExp : oRE.Pattern = "[ a-zA-Z0-9]"

            If (Not oRE.Test(ch)) Then
                ch = "&#" & Asc(ch) & ";"
            End If

            sReturn = sReturn & ch

            Set oRE = Nothing
        Next
    End If

    HTMLEncode = sReturn
End Function

Его можно немного улучшить (вы заметите, что передача объектов в эту функцию приведет к ошибке) и сделать его более конкретным: регулярное выражение может соответствовать большему количеству символов. Я также не знаю его производительности, регулярные выражения могут быть медленными при неправильном использовании, но это доказывается в качестве примера.

person AutomatedChaos    schedule 13.03.2014
comment
Это решение не решает вопрос ОП, XPath не работает с кодировкой HTML. - person Motti; 13.03.2014
comment
@Motti После повторного прочтения вопроса: вы правы. Я думаю, что TS ищет это: Set oobj = Browser("xyz").Page("abc").WebElement("xpath:=//div[contains(text(),"""& rv &""")]/../..//label[starts-with(text(),'Yes')]"). Обратите внимание на замену ' на "". РЕДАКТИРОВАТЬ: неважно, вы предоставили то же решение. Проголосуйте. - person AutomatedChaos; 13.03.2014