【问题标题】:C# Selenium Implicit WaitC# Selenium 隐式等待
【发布时间】:2016-04-13 16:11:20
【问题描述】:

我正在使用 selenium/firefox/c# 将数据输入网页中的多个字段,然后通过单击提交按钮将其提交到网站。我尝试使用ImplicitlyWait,以便程序等待结果页面加载最多 45 秒,然后从该页面获取结果。我目前将其编码为这样

driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(45));
driver.FindElement(By.Id("dnn_ctr1734_Professional_btnSubmit")).Click();

我在单击提交按钮之前进行了隐式等待,但即使页面加载仅需要 15 秒,它也不会在最终加载时获取结果。 ImplicitWait 的顺序是否正确?

【问题讨论】:

  • 不,45 秒很长。当这种情况发生时,这意味着正在发生其他事情。确保按钮可见。通过代码进行屏幕截图。在单击之前还要最大化窗口。有时问题只是窗口的默认大小太小并且元素不可见。你用的是什么浏览器?

标签: c# selenium-webdriver wait


【解决方案1】:

放置隐式等待的正确位置通常是在您初始化驱动程序之后。它基本上充当操作完成的默认等待时间。

有几种方法可以解决您的问题...

  1. 使用带有预期条件的显式等待来等待忙碌的微调器消失。

    var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(10)); wait.Until(driver => !driver.FindElement(By.Id("busySpinnerID")).Displayed);

  2. 等到特定元素在页面上可见

    var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(10)); wait.Until(driver => driver.FindElement(By.Id("knownElementId")).Displayed);

  3. 使用 JavaScript 等待页面加载完毕

    var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30)); wait.Until(driver1 => ((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete"));

【讨论】:

    【解决方案2】:

    我同意 Dmitry 的观点,处理等待的最佳方式是使用显式等待函数。为了让您的生活更轻松,您可以将其添加到扩展方法中,这样您总是会在单击之前等待元素存在。示例:

    Class Actions {
    
            public static IWebDriver ClickOn(IWebDriver driver, string button) 
            {
                var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
                wait.Until(ExpectedConditions.ElementExists(By.XPath(button)));
                driver.FindElement(By.XPath(button)).Click();
                return driver;
            }
    }
    

    那么你的代码就可以这么简单了

    Actions.ClickOn(d, SignInButton);
    

    而且您的代码仍然会等待元素存在后再点击。

    【讨论】:

      【解决方案3】:

      你应该使用显式等待,使用如下代码:

       new WebDriverWait(driver, TimeSpan.FromSeconds(45)).Until(ExpectedConditions.ElementExists((By.Id("dnn_ctr1734_Professional_btnSubmit"))));
       driver.FindElement(By.Id("dnn_ctr1734_Professional_btnSubmit")).Click();
      

      【讨论】:

      • 我正在使用火狐。我应该重申,在这个项目中,提交按钮总是存在并且可以点击。我想要做的是在单击提交按钮后,我希望页面等到结果加载,然后查找页面加载后始终出现的其他元素。我应该把隐式等待放在 driver.FindElement(By.Id("dnn_ctr1734_Professional_btnSubmit")).Click();
      • 这里有更多代码,所以你可以看到我在找什么。单击提交按钮后,加载结果页面可能需要 5-45 秒(单击提交后会出现一个旋转徽标,直到加载)。
      • driver.FindElement(By.Id("dnn_ctr1734_Professional_btnSubmit")).Click(); if (driver.FindElements(By.XPath(".//tr[td[contains(text(),'Claim Status')]]/td[2]")).Count > 0) { activeSheet.Range[" P" + n].Value = driver.FindElement(By.XPath(".//tr[td[contains(text(),'Claim Status')]]/td[2]")).Text; activeSheet.Range["Q" + n].Value = driver.FindElement(By.XPath(".//tr[td[contains(text(),'Claim ICN')]]/td[2]")) 。文本; activeSheet.Range["R" + n].Value = driver.FindElement(By.XPath(".//tr[td[contains(text(),'Paid Amount')]]/td[2]")) 。文本; }
      猜你喜欢
      • 1970-01-01
      • 2012-12-08
      • 1970-01-01
      • 2018-11-29
      • 1970-01-01
      • 2023-04-08
      • 2018-01-24
      • 2020-10-28
      相关资源
      最近更新 更多