Selenium:打开模态对话框时单击超时

时间:2014-07-29 15:48:56

标签: c# selenium modal-dialog browser-automation

目前,我正在自动化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

2 个答案:

答案 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

134 de ... @ mingulov.com

大家好,

针对同一问题在Firefox上为我工作的解决方法 - 使用异步点击,例如JavaScript setTimeout。

所以而不是

element.click

使用类似

的内容

driver.execute_script(' var el = arguments [0]; setTimeout(function(){el.click();},100);',element)

希望它有所帮助,因为它很简单 - 直到这个问题得到解决。