Имеется набор тестов (на C#). Все замечательно бегает на ФФ и Хром. На ИЕ9 тесты начинают непредсказуемо падать в разных местах, не находя объекты.
Вычитал про способ подмены стандартного метода FindElement():
public static IWebElement FindElement(this IWebDriver driver, By by, int timeoutInSeconds) { if (timeoutInSeconds > 0) { var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds)); return wait.Until(drv => drv.FindElement(by)); } return driver.FindElement(by); }
В принципе так работает, но в тестах всюду юзается Page Object, а в примере метод хочет явный локатор
Вот такая конструкция работает :
new WebDriverWait(_driver, TimeSpan.FromSeconds(5)).Until(ExpectedConditions.ElementExists(By.CssSelector("input[title='Unapprove']"))).Click();
А вот так - нет:
var dash = new DashboardPage(_driver);
new WebDriverWait(_driver, TimeSpan.FromSeconds(5)).Until(ExpectedConditions.ElementExists(dash.Unapprove)).Click();
Елемент Unapprove объявлен в классе DashboardPage:
[FindsBy(How = How.CssSelector, Using = "input[title='Unapprove']")] public IWebElement Unapprove;
Если прописывать явные ожидания для ИЕ с конкретными локаторами, то вся концепция Page Object теряет смысл.
Можно-ли как-то заюзать элементы Page Object типа dash.Unapprove в ожиданиях Until(ExpectedConditions.ElementExist(), т.е. не By().
public DashboardPage(IWebDriver driver) { _driver = driver; PageFactory.InitElements(driver, this); } [FindsBy(How = How.XPath, Using = "//a[@id='zz15_Menu']/span")] private IWebElement userName;
[FindsBy(How = How.Id, Using = "zz15_Menu_t")] private IWebElement menuLink;
[FindsBy(How = How.XPath, Using = "//span[@id='zz13_ID_Logout']/span")] private IWebElement menuLinkSignout;
.................................
В тесте вызывается:
[Test, Description("Data Approve"), Category("Release")] public void _15_DataApprove() { _driver.Navigate().GoToUrl(_targetUrl); var dash = new DashboardPage(_driver); var set = new AdminSettings(_driver); set.TimeSetSetup(0);
dash.Unapprove.Click(); // такой код временами падает в ИЕ
new WebDriverWait(_driver, TimeSpan.FromSeconds(5)).Until(ExpectedConditions.ElementExists(By.CssSelector("input[title='Unapprove']"))).Click(); // такой идет, но в нем не могу заюзать ранее объявленный елемент FindsBy - "input[title='Unapprove']"
Дело в том, что таких мест много. Пока поставил Thread.Sleep(period); через отдельный метод который запускается только под ИЕ, но это "не наш метод" - коряво, да и срабатывает не всегда
Комизм положения в том, что на пошаговом дебаге тесты проходят, все элементы на месте. На прогонах всего пакета валяться (на ИЕ), причем в разных местах. Чисто визуально все элементы на месте.
Код new WebDriverWait(_driver, TimeSpan.FromSeconds(5)).Until(ExpectedConditions.ElementExists(dash.Unapprove)).Click(); - невалидный. Метод ElementExists() не принимает елемента объявленного PageFactory. Хочет исключительно (By.....). В том-то и вопрос, существует-ли какое-то хитрое колдунство способное скормить методу ElementExists() елемент PageFactory. Альтернатива - переопределять все елементы без использования FindsBy и т.д. но елементов дофига, а все уже написано и работает (за исключением ИЕ)