【问题标题】:NoSuchElementException despite using WebDriverWaitNoSuchElementException 尽管使用了 WebDriverWait
【发布时间】:2016-08-05 01:39:41
【问题描述】:

我正在使用 Selenium 来定位一个元素并用文本填充它。当我浏览到我的 URL 时,首先会显示一个文本框来加载页面。加载应用程序后,将显示登录用户名/密码。我只想等到显示登录用户名/密码以避免 NoSuchElementException。我引用了this post,但无法让那里的任何解决方案发挥作用。

当我运行测试时,它不会等待元素出现并立即在 x.FindElement(By.Id("UserName") 上失败并返回 NoSuchElementException

using (IWebDriver driver = new ChromeDriver(@"<my path>"))
{
    driver.Manage().Window.Maximize();

    driver.Navigate().GoToUrl("<my url>");

    var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(600));
    var userName = wait.Until(x => x.FindElement(By.Id("UserName")));

    userName.SendKeys("username");

    IWebElement pass = driver.FindElement(By.Id("Password"));
    pass.SendKeys("password");
}

我在这里做错了什么?我应该如何更改我的代码以等待UserName id 出现后再查找它?

【问题讨论】:

    标签: c# selenium


    【解决方案1】:

    我认为您需要先等待加载元素的不可见性,然后再等待用户名的可见性,如下所示:-

     var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(20));
    
    wait.Until(ExpectedConditions.InvisibilityOfElementLocated(By.ID("id of loading element ")));
    
    //Now go to find username element 
    var userName = wait.Until(ExpectedConditions.ElementIsVisible(By.ID("UserName")));
    userName.SendKeys("username");
    

    【讨论】:

    • 谢谢!我最终只使用了wait.Until(ExpectedConditions.VisibilityOfAllElementsLocatedBy(By.Id("UserName"))); 并且有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 2010-12-11
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多