Поиск только HTML-узлов, чьи атрибуты точно совпадают

1

Я работаю над тестом 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, но это показалось мне наиболее вероятной элегантной возможностью.

Теги:
xpath
selenium
beautifulsoup
lxml

3 ответа

2
Лучший ответ

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

//input[@value='something' and @name='test' and count(attribute::*)=2]
  • 0
    Подсчет атрибутов - хорошая идея. Я должен был подумать об этом.
  • 1
    +1 лаконично и надежно. Возможно, вы можете использовать сокращенный синтаксис //input[@value='something' and @name='test' and count(@*)=2] .
1

Если вы не наклонены на 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][...]");
  • 0
    Интересная идея. Является ли эта ссылка оригинальным источником вдохновения? eviltester.com/index.php/2010/03/13/...
  • 0
    да - использовать его все время - отличный кусок проверки
0

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню