我正在尝试使用Internet Explorer开发一个用于点击内容的黑客攻击。我的目标是让我可以使用一种方法,首先尝试正常的Click()
,如果失败将执行SendKeys("\n")
,这似乎是公认的解决方法。
这是我的尝试
public void ClickByCssSelectorIeSafe(string cssSelector)
{
try
{
_driver.FindElement(By.CssSelector(cssSelector)).Click();
}
catch (WebDriverException)
{
_driver.FindElement(By.CssSelector(cssSelector)).SendKeys("\n");
}
}
当单击成功时,一切正常,但是当我在try子句中得到WebDriverException时,catch子句中的FindElement失败,即使它在try子句中成功。为什么呢?
另一个有趣的观点是,在某些情况下,我可以看到Click()
在浏览器中成功,但它仍会抛出异常并最终出现在catch子句中。
我想要这个,因为我们在Chrome,Firefox和IE中运行我们的测试,我不希望IE浏览器无处不在。
catch子句中失败的FindElement的异常消息如下所示
A first chance exception of type 'OpenQA.Selenium.WebDriverException' occurred in WebDriver.dll
Additional information: The HTTP request to the remote WebDriver server for URL
http://localhost:58124/session/21337088-7630-4709-a902-0a5d1bc7a669/element timed out after 60 seconds.
try子句中单击失败的异常消息如下所示
A first chance exception of type 'OpenQA.Selenium.WebDriverException'
occurred in WebDriver.dll
Additional information: The HTTP request to the remote WebDriver server for URL
http://localhost:58124/session/21337088-7630-4709-a902-0a5d1bc7a669/element/bcee1534-00e6-4155-b4cc-7171db39f112/click timed out after 60 seconds.
答案 0 :(得分:1)
尝试将代码更改为以下内容,以便解决问题。
public void ClickByCssSelectorIeSafe(string cssSelector)
{
IWebElement element = null;
try
{
element = _driver.FindElement(By.CssSelector(cssSelector));
element.Click();
}
catch (NoSuchElementException e)
{
Console.WriteLine("element not found. {0}", e.Message);
//do something here when your element is not found
}
catch (WebDriverException e)
{
if (element != null) element.SendKeys("\n");
}
}
现在你会知道在找到元素或点击它时是否抛出异常并且仍然能够处理这两种情况。
但是,看起来你在这两种情况下都会出现超时问题,这表明浏览器/ AUT挂起/没有响应。检查selenium服务器和节点日志以获取更多信息,以找出抛出异常之前发生的事情。
答案 1 :(得分:1)
我最终在日志中找到了这个:D 2015-04-27 14:01:08:497 Browser.cpp(379) Browser busy property is true.
,它引导我朝着正确的方向前进。
我面临的问题似乎是网页很忙,并且不允许我与之互动。我找到了一个建议here来设置 页面加载超时并在发生这种情况时处理(吞下)异常。那很有效。
换句话说,如果页面繁忙,我只是吞下异常,如果因某些其他原因导致点击失败,我会执行SendKeys("\n")
黑客攻击。
所以当我初始化我的驱动程序时,我会这样做:
driver.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromSeconds(5));
我的扩展方法现在看起来像这样:
public static void ClickWithIeHackFailover(this IWebElement element)
{
try
{
element.Click();
}
catch (WebDriverException e)
{
if (e.Message != "Timed out waiting for page to load.")
{
element.SendKeys("\n");
}
}
}
感谢@ user903039帮助我找到问题。