【问题标题】:(C# Selenium) How to wait until an element is present?(C# Selenium)如何等到元素出现?
【发布时间】:2015-08-29 11:15:18
【问题描述】:

我对 Selenium 完全陌生,昨天开始使用它,我已经完成了我项目的第一部分,我真的很喜欢它的方式。

尽管我遇到了一个问题,目前我正在使用 Thread.Sleep 进行暂停,直到元素出现。有时会出现一些动画或者只是加载缓慢,我怎样才能让它等到元素出现然后与之交互?

例如:

        LoginPageElements loginPage = new LoginPageElements();
        loginPage.continueLink.Click();
        Thread.Sleep(5000); //here it has to wait until the next page loads

        ClickDailyBonusPopUp();

        Driver.driver.Navigate().GoToUrl(.....);
        Thread.Sleep(2000); //here it has to wait until a login form pops up

        LoginFormElements loginForm = new LoginFormElements();
        loginForm.userPasswordLogin.Click();
        Thread.Sleep(2000); //here it has to wait until a different login form pops up

【问题讨论】:

    标签: c# selenium


    【解决方案1】:

    您需要使用WebDriverWait 类。 Here 非常适合您的问题。

    【讨论】:

    • 非常感谢,但这个解决方案对我不起作用,因为我没有使用 FindElement 访问元素。对于网站的不同部分,我有不同的文件,其中包含不同的元素。正如您在我的第一行代码中看到的那样,我正在初始化我的登录页面元素,然后可以从 loginPage 访问所有元素。如果我使用您建议的方法,构造函数要求我指定一个 By 而我没有。比如继续初始化:[FindsBy(How = How.LinkText, Using = @"Продължи")]public IWebElement continueLink { get; set; }
    • 没关系,我使用了同一个线程中的另一个解决方案,它奏效了!为了将来参考解决此问题的任何人,我使用的解决方案是:driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));来自 Mike Kwan。 “隐式等待是告诉WebDriver在尝试查找一个或多个元素时轮询DOM一段时间(如果它们不是立即可用的)。默认设置为0。一旦设置,隐式等待就会设置为生命WebDriver 对象实例。”
    • 但请注意,当您导航到新页面时,您可以通过尝试选择其上的某些元素来等待页面加载。您可以选择任何您想要的内容,直到它通知您页面已加载,它可以是标题文本、徽标或其他元素,或 continueLink(如您的示例中),然后当您可以选择它时,您将确保它是可见的,你可以点击它。
    【解决方案2】:

    如果你的应用程序使用 jQuery,我会使用 Selenium 的 IJavaScriptExecutor 来做这样的事情:

    public void WaitForAjax()
    {
      if ((bool)((IJavaScriptExecutor)WebDriver).("return window.jQuery != undefined"))
      {
        while (true)
        {
          var ajaxIsComplete = (bool)((IJavaScriptExecutor)WebDriver).ExecuteScript("return jQuery.active == 0");
          if (ajaxIsComplete)
            break;
          Thread.Sleep(100);
        }
      }
    }
    

    (更多关于jQuery.activehere。)

    主要思想是找到一些条件或元素来轮询/等待,当页面没有准备好时,这些条件或元素始终存在。

    【讨论】:

      猜你喜欢
      • 2011-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-12
      • 2020-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多