我需要点击完成字段后可能出现的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);返回页面;
答案 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指点。