在Selenium中查找Web元素的Xpath是否使用单引号或双引号来包装值?

时间:2019-04-03 06:19:07

标签: selenium xpath

我想知道Xpath是否使用'"作为值?

我有要捕获的Web元素

<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开发者工具会找到匹配项)。

我现在有点困惑,是单引号'还是双引号"

3 个答案:

答案 0 :(得分:2)

xpath支持单引号和双引号来定义属性,但是在单引号转义的情况下,它不遵循一般的编程概念。因此,在单引号转义的情况下,始终将属性值放在双引号中。

请看一下:: https://github.com/xmlunit/xmlunit/issues/110

答案 1 :(得分:2)

任何一种都可以正常工作。它取决于您要匹配的内容。

w3.org xpath abbreviated syntax中显示的示例建议使用双引号(")。

原因是因为您可以使用"转义\",但不能使用'转义\'

如果要匹配的值包含'字符,则应使用"来包装值。

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

如果要匹配的值包含"但不包含',则可以使用'包装该值。

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

如果要匹配的值同时包含"',则必须使用"来包装该值,并用{来转义" {1}}。

\"

这将匹配类似

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

不是说您应该这样做,只是为了以防万一。

答案 2 :(得分:1)

这是我在单引号和/或双引号这种特定条件下使用的内容。 尝试此操作,并检查您需要验证的文字。

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