我正在用 C# 编写集成测试,当我对对话框内的某些元素使用 click() 方法时,没有任何反应,也没有收到任何错误。它将单击对话框中的某些元素,但不会单击其他元素。我想如果它没有正确选择它们那么它会抛出异常但它运行顺利并说测试通过即使它从未真正点击过按钮。该对话框是一个 iframe。
我认为它可能试图点击一个尚未显示或启用的按钮,所以我在 click() 调用之前添加了这个:
_driver.SwitchTo().Frame(_frameElement);
_wait.Until(d =>
{
var shippingInfoButton = d.FindElement(By.CssSelector("input[title ='Info']"));
return shippingInfoButton.Displayed && shippingInfoButton.Enabled;
});
var infoButton = _driver.FindElement(By.CssSelector("input[title ='Info']"));
ScrollToElement(infoButton);
infoButton.Click();
再次运行时没有抛出异常,所以我假设它已经找到该元素并且它既显示又启用。
如果您需要更多信息,请告诉我。谢谢
最佳答案
我无法解释为什么 selenium 驱动程序 .click() 方法不会在页面中的某些元素上触发,但不会在其他元素上触发,但我确实找到了解决方案。
使用 IJavaScriptExecutor,您可以改为使用 javascript 单击元素,在我的例子中它起作用了。
这是运行 IJavaScriptExecutor 的代码,下面是我的整个方法。
//IJavaScriptExecutor
IJavaScriptExecutor js = _driver as IJavaScriptExecutor;
js.ExecuteScript("arguments[0].click();", infoButton);
//my whole method for clicking the button and returning the page object
public ShippingMethodDetailsPageObject SelectShippingMethodInfo()
{
_driver.SwitchTo().Frame(_frameElement);
_wait.Until(d =>
{
var shippingInfoButton = d.FindElement(By.CssSelector("input[title='Info']"));
return shippingInfoButton.Displayed && shippingInfoButton.Enabled;
});
var infoButton = _driver.FindElement(By.CssSelector("input[title ='Info']"));
IJavaScriptExecutor js = _driver as IJavaScriptExecutor;
js.ExecuteScript("arguments[0].click();", infoButton);
_driver.SwitchTo().DefaultContent();
return new ShippingMethodDetailsPageObject(_driver, false);
}
关于c# - Selenium chrome 驱动程序 click() 方法并不总是点击元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17112363/