А никто случаем не знает ответа (может, разработчики селениума где-то писали об этом?), зачем нужна эта куча методов, возвращающих один произвольный объект? Не эта ли рандомность рождает ежедневные топики типа "Проблема с локаторами"? Возвращается ведь непонятно что, нечто, попавшееся драйверу первым. А что именно - сокрыто в глубинах алгоритма.
К примеру, мы делаем dir или Get-ChildItem и получаем в ответ массивчик, т.е. вообще всё. Если нам надо фильтровать результат, мы фильтруем (параметры на входе или фильтр на выходе. Я специально не даю кода фильтрации, потому что это можно сделать и на языках с точечной нотацией, в этих, неприятно глазу выглядящих строк кода с кучей скобок :) недавно был примерчик : "улица Октября".equals(element.FindElement(by.Name="улица Октября")).getText() - тут тоже можно задать фильтр в виде параметров).
Т.е. правильная выборка (FindElements) плюс фильтрация дают верный результат.
Выборка наугад (FindElement) даёт непредсказуемый результат.
А вот пример кода (я всё ещё мусолю пример из доки селениума про сыр). Пример, конечно, не фонтан, просто пример с TagName чётче покажет то, что есть и в семи остальных вариантах FindElement:
создаём драйвер и навигируем на сыр:
Теперь посмотрим результаты.
Результат не определён (выдало что-то одно, по выбору драйвера):
Get-SeWebElement -TagName input
полная коллекция результатов, которую затем можно фильтровать:
Get-SeWebElementCollection -TagName input
Обращаем внимание, что в разных браузерах коллекции разного размера, т.е. рандомный возврат FindElement запросто может привести к ошибкам тестового кода при работе с разными браузерами. "Разные результаты в разных браузерах".
Кусок исходника страницы из хрома:
<input type=hidden name="hl" value="ru"><input type=hidden name="newwindow" value="1"><input type=hidden name="output" value="search"><input type=hidden name="sclient" value="psy-ab"></div></fieldset><fieldset class=gbqff id=gbqff><legend class=gbxx></legend><div id=gbfwa class="gbqfwa "><div id=gbqfqw class=gbqfqw>
Возвращаемся к вопросу - зачем тогда нужен FindElement? Ведь логичнее использовать только вывод в виде коллекции или перечислителя. Оптимизация памяти или времени? Ну и зачем такая оптимизация, если могут выйти разные результаты?