Я создаю объектную модель страницы в Selenium WebDriver для С#, используя класс PageFactory.
К сожалению, я обнаружил, что FindsByAttribute
не инициализирует SelectElement
(тег HTML <select>
/выпадающее меню). До сих пор я встречал или придумал несколько идей, чтобы обойти это, но ни одна из них не идеальна:
PageFactory
иFindsByAttribute
- этоsealed
, поэтому я не могу заставить это, просто унаследовав их.- Ручное создание экземпляра
SelectElement
изIWebElement
в каждом методе довольно беспорядочно и дублирует. Он также игнорирует очевидное встроенное ожидание вPageFactory
и выдаетNoSuchElementException
s, если только я не добавлю ожидание каждый раз, когда делаю это, что потребовало бы повторения локатора повсюду, нарушая (частично) цель POM. - Обертывание каждого свойства
IWebElement
свойствомSelectElement
менее запутанно, но по-прежнему имеет ту же проблему ожидания, что и выше.
На данный момент лучшим вариантом является № 3 и написание оболочки для SelectElement
, которая просто добавляет ожидание к каждому методу. Хотя это решение будет работать, оно значительно увеличит объем кода каждой страницы, так как вместо этого (гипотетического) красивого кода:
[FindsBy(How = How.Id, Using = "MonthDropdown")]
public SelectElement MonthDropdown;
Я застрял с оберткой-оболочкой (чего я бы предпочел избежать) и:
[FindsBy(How = How.Id, Using = "MonthDropdown")]
private IWebElement _monthDropdown;
public Selector MonthDropdown
{
get { return new Selector(MonthDropdown, Wait); }
}
Поскольку Selector
является оболочкой SelectElement
, он также должен принимать IWait<IWebDriver>
, чтобы он мог ждать, и создавать новый экземпляр Selector
каждый раз, когда я к нему обращаюсь.
Есть ли лучший способ сделать это?
РЕДАКТИРОВАТЬ: Сонно вставил неправильные модификаторы доступа. Исправлено. Спасибо, @JimEvans.