Selenium Webdriver C#在使用PageFactory时等待存在

时间:2017-06-05 19:46:25

标签: c# selenium selenium-webdriver

我需要点击完成字段后可能出现的okay按钮 - 可能需要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

   }

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

Pages.PTW.PopulateFields();

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

2 个答案:

答案 0 :(得分:0)

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

继承DefaultWait类的WebDriverWait类用于此目的。以下是代码段。

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

答案 1 :(得分:0)

管理解决它 - 在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指点。