我在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();
再次运行没有抛出异常,所以我假设它已找到元素并且它都显示并启用。
如果您需要更多信息,请与我们联系。感谢
答案 0 :(得分:6)
我无法解释为什么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);
}
答案 1 :(得分:4)
我遇到了类似的问题。如果是同样的问题,那么ChromeDriver就会出现故障,由于周围的div等原因,它无法点击某些元素。真的很蹩脚。
一个简单的解决方法是发送Enter键,例如element.SendKeys(Keys.Enter)。似乎适用于所有浏览器。
答案 2 :(得分:0)
我有一些测试在Firefox中一直有效,而在Chrome中它让我很生气,因为有时它会成功通过,有时候“.click”无法正常工作,而且测试也会失败。
花了很长时间才注意到它,但原因是:我曾经有时将浏览器最小化到80%,以便能够在我的IDE旁边看到浏览器。当我这样做时,“.click”似乎不起作用。
至少对我来说这就是问题