Sto costruendo un modello di oggetto Page in Selenium WebDriver per C#, utilizzando PageFactory.Come inizializzare SelectElements usando PageFactory/FindsBy in Selenium C#?
Sfortunatamente, ho scoperto che lo FindsByAttribute
non inizializzerà un SelectElement
(HTML <select>
menu/menu a discesa). Ho capitato su o venire con alcune idee per lavorare intorno ad esso fino ad ora, ma nessuno di loro è l'ideale:
PageFactory
eFindsByAttribute
sonosealed
, quindi non posso costringerlo a semplicemente ereditare quelle .- L'istanzializzazione manuale di
SelectElement
da unIWebElement
in ciascun metodo è piuttosto disordinata e duplicata. Ignora anche l'apparenza incorporata apparente inPageFactory
e generaNoSuchElementException
s a meno che non aggiungo un'attesa ogni volta che lo faccio - il che richiederebbe la ripetizione del localizzatore ovunque, sconfiggendo (in parte) lo scopo del POM. - Il wrapping di ciascuna proprietà
IWebElement
con una proprietàSelectElement
è meno disordinato, ma presenta ancora lo stesso problema di attesa di cui sopra.
L'opzione migliore finora è # 3 e la scrittura di un wrapper per SelectElement
che aggiunge solo un'attesa a ogni metodo. Anche se questa soluzione sarà lavoro, sarà irrobustirsi il codice di ogni pagina un sacco, come invece di questo (ipotetico) Codice abbastanza:
[FindsBy(How = How.Id, Using = "MonthDropdown")]
public SelectElement MonthDropdown;
mi sono bloccato con un wrapper involucro (qualcosa che mi volentieri a meno), e:
[FindsBy(How = How.Id, Using = "MonthDropdown")]
private IWebElement _monthDropdown;
public Selector MonthDropdown
{
get { return new Selector(MonthDropdown, Wait); }
}
Con Selector
essere il SelectElement
involucro, che deve anche prendere in IWait<IWebDriver>
in modo che possa aspettare, e istanziare un nuovo Selector
ogni volta che vi accedono.
C'è un modo migliore per farlo?
MODIFICA: Modificatori di accesso errati inseriti in modo assente. Fisso. Grazie, @JimEvans.
Grazie mille per questa domanda e risposta. +1 –