【问题标题】:Selenium Webdriver C# wait for existence when using PageFactorySelenium Webdriver C#使用PageFactory时等待存在
【发布时间】:2017-06-05 19:46:25
【问题描述】:

我需要单击一个确定按钮,该按钮可能会在填写完字段后出现 - 可能需要 5 秒钟才会出现。所以我需要(如果)等待存在 5 秒。我在页面框架中使用 PageFactory,我已经看到了一些解决方案,但无法弄清楚如何在这种情况下实现它们。

[FindsBy(How = How.Name, Using = "OK")]
private IWebElement alertOKBtn;

public void PopulateFields //method to populate the form
{
   // Populate fields
   dateFromField.SendKeys(DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss"));
   // Click on this field
   descriptionField.Click();

   //OK button might appear, might take 5secs - pseudcode
   if ( ***alertOKBtn exists, wait for it for 5 secs..*** )
   {
     alertOkBtn.Click();
   }

   //continue populating form

   }

从 [Test] 调用 PopulateFields 方法为:-

Pages.PTW.PopulateFields();

其中 Pages.PTW 是 PageFactory.InitElements(browser.Driver, page) 的 get 方法;返回页面;

【问题讨论】:

    标签: c# selenium selenium-webdriver


    【解决方案1】:

    设法解决它 - 在 PopulateFields 我现在这样做:-

              //wait to see if alert popup appears - give it 8 secs
            string waitToSee = browser.wait(alertOKBtn, 8);
    
            if ( waitToSee == "true" )
            {
                alertOKBtn.Click(); //alert popup did appear
    
            }
    

    然后我在 browser.class 中添加了一个方法:-

        public static string wait(IWebElement elem, int timeout  ) //waits for existence of element up to timeout amount
        {
            try 
            {
                var wait = new WebDriverWait(webDriver, TimeSpan.FromSeconds(timeout));
                wait.Until(ExpectedConditions.ElementToBeClickable(elem));
                return "true";
            }
            catch (Exception e ) //didnt appear so exception thrown return false
    
            {
                return "false";
            }
    

    所以它现在最多等待 8 秒,如果它没有出现,它会忽略并继续前进。感谢 Bendram 的指点。

    【讨论】:

      【解决方案2】:

      需要添加条件等待。这意味着,您的代码应该等到控件出现后再执行操作。

      继承 DefaultWait 类的 WebDriverWait 类用于此目的。下面是代码sn-p。

       var wait = new WebDriverWait(this.driver, waitTime);
       wait.Until(ExpectedConditions.ElementToBeClickable(alertOkBtn));
       alertOkBtn.Click();
      

      【讨论】:

      • 谢谢! - this.driver 无法识别“不包含驱动程序的定义并且没有扩展方法......”我添加了更多关于 [TestFixture] 如何调用 PopulateFields 的代码- 抱歉,我对 c# OO 缺乏了解。不确定如何识别该类中的 this.driver?
      • 另外 - alertOkBtn 可能不会 出现 - 所以测试需要继续而不执行 alertOkBtn.Click();如果发生这种情况。
      • 很高兴您能够解决问题。 this.driver 在我的情况下是浏览器在你的情况下。还尝试让方法返回布尔值而不是字符串,并将代码设置为 if(waittosee) { //your logic }
      猜你喜欢
      • 2016-12-25
      • 2020-07-13
      • 1970-01-01
      • 1970-01-01
      • 2012-05-11
      • 2014-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多