Como inicializar SelectElements ao usar PageFactory / FindsBy no Selenium C #?
Estou criando um modelo de objeto de página no Selenium WebDriver para C #, usando o PageFactory.
Infelizmente, descobri que oFindsByAttribute
não inicializará umSelectElement
(HTML<select>
tag / menu suspenso). Encontrei algumas ideias para contornar isso até agora, mas nenhuma delas é ideal:
PageFactory
eFindsByAttribute
estãosealed
, então não posso forçá-lo apenas herdando esses.Instanciando manualmente umSelectElement
de umIWebElement
em cada método é bastante confuso e duplicativo. Também ignora a aparente espera internaPageFactory
e jogaNoSuchElementException
s, a menos que eu adicione uma espera toda vez que fizer isso - o que exigiria repetir o localizador em todo o lugar, derrotando (parte) o propósito do POM.Envolvendo cadaIWebElement
propriedade com umSelectElement
A propriedade é menos bagunçada, mas ainda tem o mesmo problema de espera acima.Até agora, a melhor opção é # 3, e escrever um wrapper paraSelectElement
isso apenas adiciona uma espera a todos os métodos. Embora esta soluçãotrabalhos, aumentará bastante o código de cada página, pois, em vez deste bonito código (hipotético):
[FindsBy(How = How.Id, Using = "MonthDropdown")]
public SelectElement MonthDropdown;
Estou preso com um invólucro de invólucro (algo que prefiro evitar) e:
[FindsBy(How = How.Id, Using = "MonthDropdown")]
private IWebElement _monthDropdown;
public Selector MonthDropdown
{
get { return new Selector(MonthDropdown, Wait); }
}
ComSelector
sendo oSelectElement
invólucro, que também precisa receber oIWait<IWebDriver>
para que possa esperar e instanciar um novoSelector
toda vez que eu acessá-lo.
Existe um jeito melhor de fazer isso?
EDITAR: Coloque sonolentamente modificadores de acesso incorretos. Fixo. Obrigado, @JimEvans.