Рано или поздно при разработке автоматических тестов вы столкнётесь с задачей, когда надо будет найти элемент (html тег), у которого нет атрибутов «class» и «id». Представьте ситуацию, когда на странице есть несколько элементов без «class» и «id» и все они содержат одинаковый текст, но в определённый момент только один из них видимый, а остальные в коде есть, но визуально не видны.
В этом случае можно обращаться к элементу по «By.XPath», но как только разработчик добавит на страницу ещё пару элементов (span, div и т.д.), то ваш «By.XPath» будет уже некорректен и тесты надо будет переписывать.
Я столкнулся с подобной ситуацией, опишу условия. Есть страница и на странице есть ссылки при нажатии на которые всплывают формы для заполнения. Чтобы принять внесённые изменения в форме надо нажать на кнопку «ОК», которая закрывает форму и внесённые данные отображаются на странице. При закрытии форма скрывается, но в коде страницы она присутствует. Таких форм около пяти. У всех форм есть кнопки «ОК». Все кнопки «ОК» реализованы в виде нажатие на кнопки отслеживает JavaScript. Кроме кнопки «ОК» есть кнопки «Очистить» и «Отмена».
Чтобы нажать на нужную нам кнопку надо:
— определить, что она содержит текст «ОК»;
— определить, что она видимая на данный момент.
Для себя я написал простое решение:
private void func1 () { // тут произвольный код... var iElement = driver.FindElements(By.TagName("span")); for (int i = 0; i < iElement.Count; i = i + 1) { if (iElement [i].Text == "Ок" && iElement [i].Displayed) { iElement [i].Click (); } } // тут произвольный код... }
Описание строк кода:
строка 4: находим все элементы (теги) на странице.
строка 5: запускаем цикл, который будет выполняться пока не пройдёт по всей коллекции (массиву) найденных элементов, а их всего «iElement.Count».
строка 6: условие, при выполнении которого мы кликнем на требуемый нам элемент, а именно:
— если текущий элемент из коллекции содержит текст «ОК» и…
— если текущий элемент из коллекции видимый.
строка 7: нажимаем на найденный элемент, который удовлетворяет нашему условию, которое задано в строке 6.
Однако надо помнить, что если в коде много мест, где поиск элементов происходит методом перебора, а также если в переборе участвует много элементов, то ваши тесты будут выполняться долго. К примеру, если на странице сотни ссылок и вы в процессе теста многократно ищете нужные ссылки методом перебора, то вы даже визуально будете видеть, как медленно выполняются тесты. Оптимальный вариант — это когда разработчик всем значимым элементам присваивает уникальные «id» и по этим «id» вы будете обращаться к элементам. Просите об этом разработчиков и если они адекватные, то они пойдут вам навстречу.
Хороший вариант, но в моем случае после клика на элемент — цикл продолжался и выдавал ошибку, потому что список с элементами уже закрылся. Помогло добавление break;
Примерно вот так:
private void func1 ()
{
// тут произвольный код…
var iElement = driver.FindElements(By.TagName(«span»));
for (int i = 0; i < iElement.Count; i = i + 1) {
if (iElement [i].Text == "Ок" && iElement [i].Displayed) {
iElement [i].Click ();
break;
}
}
// тут произвольный код…
}
Спасибо, зашло с первого тыка 🙂