我有一个网页,它使用DatePicker控件输入DoB作为搜索条件之一。我必须解决的问题是,datepicker隐藏了按钮来执行搜索。要删除日期选择器,我单击另一个字段,然后使用一个等待搜索按钮可见的方法并单击它。我的问题是,有时它可以工作,但更多时候它没有,我得到元素不可点击..其他元素将收到点击异常。调用代码如下。
WebDriverSupport.ClearAndEnterDataIntoFieldById(driver, "txtDateOfBirthNew", "01/01/1980"); // causes the datepicker to appear
WebDriverSupport.ClickElementById(driver, "txtSurnameNew"); // to close date picker click on another field
WebDriverSupport.ClickElementById(driver, "btnSearch"); // wait for the search button to appear and click
ClickElementById方法定义为,
/// <summary>
/// WebDriver: Clicks on an element
/// </summary>
/// <param name="driver">WebDriver object</param>
/// <param name="id">Name of element (by ID) to click</param>
/// <returns>None</returns>
public static void ClickElementById(IWebDriver driver, string id)
{
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
IWebElement element = wait.Until(ExpectedConditions.ElementIsVisible(By.Id(id)));
element.Click();
}
如果我在调试模式下运行并在单击“搜索”按钮的语句上放置一个断点,然后从那里继续,它每次都有效。但我想这是因为有时间让datepicker消失并且按钮变得可见。 我无法弄清楚的是ClickElementById方法在进行点击之前等待元素可见,那么为什么会出现异常呢?为什么它有时会起作用,而不是其他的。
有关解决此问题的任何建议吗?是否有更健壮的方法来检查元素是否可见并且可以单击?
答案 0 :(得分:0)
ElementIsVisible
检查是否至少显示了部分元素。但是,click()
方法并不总是足够好。尝试使用Actions类
MoveToElement
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
IWebElement element = wait.Until(ExpectedConditions.ElementIsVisible(By.Id(id)));
Actions actions = new Actions(driver);
actions.MoveToElement(element).Perform();
element.Click();