Как попросить Selenium2 завершить загрузку страницы на .Click, прежде чем делать какие-либо утверждения? - PullRequest
4 голосов
/ 12 июля 2011

Я хотел бы использовать веб-драйвер selenium2 c # для проверки нашего механизма входа в систему. Следующий тест пройден, если я проведу его в режиме отладки и укажу метод Click некоторое время. Если я запускаю его как обычно, хотя тест завершается с NoSuchElementException.

    [Test]
    public void TestClickLogonLink()
    {
        _driver.Navigate().GoToUrl("http://nssidManager.local/");
        IWebElement loginElement = _driver.FindElement(By.Id("loginWidget"));
        IWebElement logonAnchor = loginElement.FindElement(By.LinkText("Log On"));

        logonAnchor.Click();

        IWebElement userNameTextBox = _driver.FindElement(By.Id("UserName"));

        Assert.IsNotNull(userNameTextBox);
    }

Как мне сказать Selenium ждать, пока logonAnchor.Click завершит загрузку следующей страницы?

Ответы [ 3 ]

9 голосов
/ 12 июля 2011

Установить неявное ожидание так:

driver.Manage().Timeouts().ImplicitlyWait(new TimeSpan(0, 0,30));

Это позволит Selenium блокироваться до тех пор, пока FindElement не преуспеет или не истечет время ожидания.

0 голосов
/ 21 января 2016

Я сделал следующий метод расширения для класса IWebElement:

public static void ClickAndWaitForNewPage(this IWebElement elementToClick, IWebDriver driver)
{
    elementToClick.Click();
    new Wait(driver).Until(d => elementToClick.IsStale(), 5);
}

private static bool IsStale(this IWebElement elementToClick)
{
    try
    {
        //the following will raise an exception when called for any ID value
        elementToClick.FindElement(By.Id("Irrelevant value"));
        return false;
    }
    catch (StaleElementReferenceException)
    {
        return true;
    }
}
0 голосов
/ 22 января 2013

У меня обычно есть несколько методов расширения для драйвера:

public static class SeleniumDriverExtensions
{
    public static void GoToUrl(this IWebDriver driver, string url, By elementToWaitFor = null)
    {
        driver.Navigate().GoToUrl(url);
        driver.WaitUntillElementIsPresent(elementToWaitFor ?? By.CssSelector("div.body"));
    }

    public static void WaitUntillElementIsPresent(this IWebDriver driver, By by)
    {
        WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
        wait.Until(d => d.IsElementPresent(by) && d.FindElement(by).Displayed);
    }
          .....
}

У меня есть div.body на всех моих страницах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...