在做任何断言之前,如何要求Selenium2在. click上完成加载页面

本文关键字:click Selenium2 加载 断言 任何 | 更新日期: 2023-09-27 18:02:31

我想使用selenium2 c# webdriver来测试我们的登录机制。如果我在调试模式下运行下面的测试,并给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。点击是否加载完下一页?

在做任何断言之前,如何要求Selenium2在. click上完成加载页面

像这样设置隐式等待:

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

这将允许Selenium阻塞,直到FindElement成功或超时。

我通常为驱动程序提供一些扩展方法:

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。

我为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;
    }
}