Chrome或Firefox中不区分大小写的xpath

时间:2019-06-08 12:35:40

标签: google-chrome firefox xpath case-insensitive

我已经阅读了有关不区分大小写的XPath搜索的以下三个问题的答案:

case insensitive xpath contains() possible?

Using upper-case and lower-case xpath functions in selenium IDE

XPath find text in any text node

当我尝试Chrome和Firefox中建议的XPath 1和2解决方案时,它们都不起作用(很好)。

我正在寻找一个单词,该单词当前使用大写的首字母和其余的小写字母(例如:Example)编写,但是translate(.,'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLOMNOPQRSTUVWXYZ')在使用at时根本找不到该字符串至少两个字母。我尝试了EX(2个匹配,示例中均未找到),ex(0个匹配),Ex(0),xa(0),XAM(0)

将翻译顺序更改为translate(.,'ABCDEFGHIJKLOMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')会导致EX(0个匹配),ex(0),Ex(0),xamp (1个匹配-正确!!但我必须排除首字母,xa(0)

尝试上面链接的答案中建议的XPath 2.0解决方案会返回以下错误:

XPath 2.0

我要对此XPath执行区分大小写的搜索

//div[@class='nav group']//a[contains(text(), 'Example')]

我该怎么做?

3 个答案:

答案 0 :(得分:0)

这是xpath。

//div[@class='nav group']//*[translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='example']

Chrome浏览器: enter image description here 控制台: enter image description here

答案 1 :(得分:0)

可悲的是,在XPath 2.0发布12年之后,尽管存在XPath 1.0的所有已知限制,但浏览器供应商仍未更新其XPath实现。

有可用的第三方实现(例如,Saxon-JS支持XPath 3.1),这是前进的一种可能方法。

但是,只要您只使用英语字母,XPath 1.0的解决方法就可以使用

contains(translate(., 'abcde...', 'ABCDE...'), "EXAMPLE")

应该工作正常。

您可以将所有内容翻译成大写并针对大写搜索词进行测试,也可以将所有内容翻译成小写并针对小写搜索词进行测试。

答案 2 :(得分:0)

这里有两个我可能会派上用场的功能。在进行翻译时,您实际上不必指定整个字母,只需要您要搜索的单词的字母即可:

public String translate(String text) {
    return "translate(text(),'" + text.toUpperCase() + 
           "','" + text.toLowerCase() + "')='" + text.toLowerCase() + "'";
}

public String translateNormalized(String text) {
    return "translate(normalize-space(text()),'" + text.toUpperCase() + 
           "','" + text.toLowerCase() + "')='" + text.toLowerCase() + "'";
}

我使用这些功能来构建xpath定位器,即:

String xpath = "//a[" + translateNormalized("Click here for more info") + "]";