Я работаю над тестом 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, но это показалось мне наиболее вероятной элегантной возможностью.
Как насчет тестирования того, что атрибуты value
и name
присутствуют, и что общее количество атрибутов равно 2:
//input[@value='something' and @name='test' and count(attribute::*)=2]
Если вы не наклонены на 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)));
}
Не знаете, как исключить атрибуты, но могут быть указаны дополнительные атрибуты as-
int count = getCSSCount("input[name=test][maxlength=75][...]");
Невозможно исключить неожиданные атрибуты с помощью XPath.
Поэтому вы должны найти более безопасный способ найти нужные элементы. Вещи, которые вы должны учитывать:
В form
каждый input
должен иметь четкое имя. То же самое верно и для самой form
. Поэтому вы можете попробовать //form[@name='...']/input[@name='...']
Добавьте класс в нужные поля. Классы не упоминаются ни в одной таблице стилей. Фактически, я использовал это для проверки поля формы, используя классы, такие как decimal number
или alpha number
//input[@value='something' and @name='test' and count(@*)=2]
.