Добрый день.
Есть тесты на C#+Selenium WebDriver
Раньше в тестах у меня везде, где надо ждать загрузки стоят Thread.sleep(1000);
Потом я решил, что это не очень кошерно и сделал метод
public void WaitForLoad()
{
Manage().Timeouts().SetPageLoadTimeout(new TimeSpan(0,0,60));
}
После чего тесты начали падать с ошибкой:
Test(s) failed. OpenQA.Selenium.ElementNotVisibleException : Cannot click on element
at OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(Response errorResponse)
at OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters)
at OpenQA.Selenium.Remote.RemoteWebElement.Click()
at driver.GeniusFirefoxDriver.Click(IWebElement element) in c:\TestNew\Driver\GeniusFirefoxDriver.cs:line 140
at NKBSTests.Pages.ROAgentPage.OpenCertainDocMenu(String group, String type) in c:\TestNew\NKBSTests\Pages\ROAgent\ROAgentPage.cs:line 56
at NKBSTests.Tests.Docs.CreateDocTests.AAPublishDocAndCheckInMenuROAgent() in c:\TestNew\NKBSTests\Tests\Docs\CreateDocTests.cs:line 329
Вот метод, который валит ошибку:
public static void OpenCertainDocMenu(string group, string type)
{
Actions actions = new Actions(Browser);
Browser.WaitForLoad();
actions.MoveToElement(Browser.FindElement(By.XPath(XpathForMenuInAgent + group + "']"))).Perform();
Browser.Click(Browser.FindElement(By.XPath(XpathForMenuInAgent + type + "']")));
}
Т.е. по задумке надо дождаться загрузки страницы, потом навести на пункт меню и кликнуть по подпункту в выпадающем списке.
56 строка - это последняя в этом методе. Если навтыкать Thread.sleep’ов, то всё работает, т.е. элементы присутствуют, просто не успевают прогрузиться.
Добавил ещё в метод Click(); такую шляпу:
public void Click(IWebElement element)
{
WaitForAjax();
element.Click();
WaitForLoad();
WaitForAjax();
}
Но тест всё равно падает с той же ошибкой.
Подскажите, в чём я неправ и как это грамотно сделать?