目前,我正在自动化CMS中的编辑器,其中包括多种选项,例如插入链接和更改文本颜色。
我面临的问题是,点击其中一个工具栏按钮后,会执行一个javascript命令启动模态对话框
由于某种原因,这个模式对话框会导致我的代码在click命令上挂起,直到它被手动关闭或者60秒后点击超时
以下是我的代码示例
try
{
// the click that opens the modal dialog
driver.FindElement(By.Id("CreatArticle")).Click();
// the code then hangs on the click command above until
//it times out or the modal dialog is manually closed
System.Windows.Forms.MessageBox.Show("This message box never shows");
}
catch(exception e)
{
//this writes the exception to an error log
testLog("Page creation failed, reason: " + e);
}
我收到的异常消息
> Article creation failed, reason: OpenQA.Selenium.WebDriverException:
> The HTTP request to the remote WebDriver server for URL
> http://localhost:63377/session/adde8cea404a930e9086e1782afcbcf5/element/0.03468421520665288-16/click
> timed out after 60 seconds. ---> System.Net.WebException: The
> operation has timed out at System.Net.HttpWebRequest.GetResponse()
> at
> OpenQA.Selenium.Remote.HttpCommandExecutor.CreateResponse(WebRequest
> request) in
> c:\Projects\webdriver\dotnet\src\webdriver\Remote\HttpCommandExecutor.cs:line
> 142 --- End of inner exception stack trace ---
我还尝试通过js.executeScript()命令单击工具栏按钮,并且得到了相同的结果,但异常是“60秒后执行超时”。
我建议的一个选项是多线程,第二个线程在初始线程挂起时处理对话框。硒能够做到这一点还是我可以尝试另一种方法?
EDIT 这是我发现我的问题的一个例子 https://developer.mozilla.org/samples/domref/showModalDialog.html
答案 0 :(得分:0)
你可以提供一个UI屏幕,你面对什么样的对话?
1)案例1.如果它像jsAlert我会尝试:
Alert alert = driver.switchTo().alert();
alert.accept();
2)另一种方法(在以多个浏览器实例的并行方式进行测试时,不被认为是一种强大的方法):
//使用Robot类实例
按Enter键处理对话框Robot robot = new Robot();
robot.delay(2000);
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);
Robot class in Java将提供更多机器人使用案例。
希望这适合你。
答案 1 :(得分:0)
我找到了解决自己问题的方法
https://code.google.com/p/selenium/issues/detail?id=284
大家好,
针对同一问题在Firefox上为我工作的解决方法 - 使用异步点击,例如JavaScript setTimeout。
所以而不是
element.click
使用类似
的内容driver.execute_script(' var el = arguments [0]; setTimeout(function(){el.click();},100);',element)
希望它有所帮助,因为它很简单 - 直到这个问题得到解决。