Рано или поздно при разработке автоматических тестов вы столкнётесь с задачей, когда надо будет найти элемент (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» вы будете обращаться к элементам. Просите об этом разработчиков и если они адекватные, то они пойдут вам навстречу.