Поиск только HTML-узлов, чьи атрибуты точно совпадают - PullRequest
1 голос
/ 28 июня 2011

Я работаю с тестом Selenium, в котором я хочу утверждать, что конкретный узел HTML точно совпадает с тем, какие атрибуты присутствуют и их значения (порядок не важен), а также с тем, что другие атрибуты отсутствуют. Для примера приведен следующий фрагмент:

<input name="test" value="something"/>

Я пытаюсь найти хороший способ подтверждения его присутствия в выводе HTML, так что следующие ( произвольные ) примеры не будут соответствовать:

  • <input name="test" value="something" onlick="doSomething()"/>
  • <input name="test" value="something" maxlength="75"/>
  • <input name="test" value="something" extraneous="a" unwanted="b"/>

Я полагаю, что могу написать оператор XPath следующим образом, чтобы найти все это, например:

//input[value='something' and @name='test']

Но я не понял, как писать так, чтобы исключать неточные совпадения в обобщенном виде. Обратите внимание, что это не должно быть решение XPath, но это показалось мне наиболее вероятной элегантной возможностью.

Ответы [ 3 ]

2 голосов
/ 28 июня 2011

Как насчет проверки того, что атрибуты value и name присутствуют, а общее количество атрибутов равно 2:

//input[@value='something' and @name='test' and count(attribute::*)=2]
1 голос
/ 28 июня 2011

Если вы не склонны к XPath, вы также можете использовать локаторы CSS. Вот фрагмент кода для подсчета количества элементов, регистрирующих точное совпадение CSS -

private int getCSSCount(String aCSSLocator){ 
        String jsScript = "var cssMatches = eval_css(\"%s\", window.document);cssMatches.length;"; 
        return Integer.parseInt(selenium.getEval(String.format(jsScript, aCSSLocator))); 
    }

Не уверен, как исключить атрибуты, но дополнительные атрибуты могут быть указаны как-

int count = getCSSCount("input[name=test][maxlength=75][...]");
0 голосов
/ 28 июня 2011

Невозможно исключить неожиданные атрибуты с помощью XPath.

Поэтому вы должны найти более безопасный способ найти нужные элементы.Вещи, которые вы должны учитывать:

  1. В form каждый input должен иметь свое имя.То же самое верно и для самого form.Так что вы можете попробовать //form[@name='...']/input[@name='...']

  2. Добавить класс к интересующим вас полям.Классы не упоминаются ни в одной таблице стилей.Фактически, я использовал это для проверки поля формы, используя классы типа decimal number или alpha number

...