Xpath без учета регистра в Chrome или Firefox - PullRequest
0 голосов
/ 08 июня 2019

Я прочитал ответы на эти три вопроса о поиске без учета регистра XPath:

без учета регистра xpath содержит () возможно?

Использование функций xpath в верхнем и нижнем регистре в Selele IDE

XPath находит текст в любом текстовом узле

Когда я пробую XPath 1 и 2 решения, предложенные там в Chrome и Firefox, ни одно из них не работает (хорошо).

Я ищу слово, которое в настоящее время написано с начальным верхним регистром, последним и остальным нижним регистром (как это: Example), но translate(.,'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLOMNOPQRSTUVWXYZ') не может найти строку вообще, используя хотя бы две буквы. Я пробовал 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 голосов
/ 08 июня 2019

К сожалению, спустя 12 лет после публикации XPath 2.0, и, несмотря на все известные ограничения XPath 1.0, производители браузеров все еще не обновили свои реализации XPath.

Доступны сторонние реализации (например, Saxon-JS поддерживает XPath 3.1), так что это один из возможных путей продвижения вперед.

Но если вы используете только английский алфавит, обходной путь XPath 1.0 использует

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

должно работать нормально.

Вы можете либо перевести все в верхний регистр и проверить по поисковому термину в верхнем регистре, либо перевести все в нижний регистр и проверить по поисковому термину в нижнем регистре.

0 голосов
/ 10 июня 2019

Вот две функции, которые я использую, которые могут пригодиться. На самом деле вам не нужно указывать весь алфавит при выполнении перевода, ему нужны только буквы слова, которое вы ищете:

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") + "]";
0 голосов
/ 08 июня 2019

Вот xpath.

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

Chrome: enter image description here Консоль enter image description here

...