我正在使用Selenium来测试网站的用户界面。 95%的时间,事情都很好。我找到了我的元素,执行了我的点击,并检查了结果。不幸的是,可能有5%的时间,我会找到该元素,验证它是可点击的,运行没有错误的点击事件......但实际上没有任何变化。
这是一段代码示例:
WebDriverWait waitForTimeout = new WebDriverWait(Driver, TimeSpan.FromSeconds(60));
IWebElement selectMaskButton = waitForTimeout.Until(ExpectedConditions.ElementToBeClickable(By.Id("mask_expander")));
Thread.Sleep(250); // A slight delay ensures that the button really is clickable
selectMaskButton.ClickAndWait(Driver);
我在那里有那个睡眠声明,因为这种情况常常会导致点击事件出错。四分之一秒等待大部分时间都有效,但并非总是如此。对于这种情况,我可以用自定义代码将其包围以暂停,然后如果指定的后续元素没有解决,则再次单击,但这很笨拙并且涉及到我的任何地方的不同目标点击一下东西。并且在任何地方添加延迟也不是最优的,因为它会导致一堆固定的延迟,随着人们遇到问题而不断增加。
我不知道这完全是一个过快的问题因为我偶尔会在Click命令上设置调试语句,在调试中运行测试,并且在执行Click之前等了几秒钟,但它仍然没有用。作为测试人员,我无法访问某些内部代码,因此我不确切知道在点击内部执行了什么,而我与之交谈的开发人员基本上都在告诉我它们在手动点击它时工作正常,所以他们没有看到问题。
是否有通用方法来处理点击元素并确保操作实际触发?
辅助函数ClickAndWait
的附加代码:
public static void WaitUntilPageLoads(this IWebDriver driver)
{
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
wait.Until(d => ((RemoteWebDriver)d).ExecuteScript("return document.readyState").Equals("complete"));
Thread.Sleep(500);
}
public static void ClickAndWait(this IWebElement element, IWebDriver driver)
{
element.Click();
driver.WaitUntilPageLoads();
}
在这种情况下,ClickAndWait实际上并不实用,因为页面是动态更改而不是一次性更改,因此页面声称立即加载。我忘了更换电话。