未处理的警报异常:存在模式对话框(Selenium)
Posted
技术标签:
【中文标题】未处理的警报异常:存在模式对话框(Selenium)【英文标题】:Unhandled Alert Exception : Modal Dialog Present (Selenium) 【发布时间】:2014-07-15 23:47:50 【问题描述】:我面临一个问题,其中我收到一个异常说 UnhandledAlertException Modal Dialog Present ,下面是一些跟踪
org.openqa.selenium.UnhandledAlertException:模态对话框存在: 此页面要求您确认您要离开 - 您的数据 已输入可能无法保存。构建信息:版本:'2.41.0',修订: '3192d8a6c4449dc285928ba024779344f5423c58',时间:'2014-03-27 11:29:39'系统信息:主机:'NCESEPBLRNRE16',ip:'172.16.137.213', os.name: 'Windows XP', os.arch: 'x86', os.version: '5.1', java.version: '1.6.0_26'会话 ID: bda22089-a586-4cd8-b7ac-778c98581e11驱动信息: org.openqa.selenium.firefox.FirefoxDriverCapabilities [平台=XP, acceptSslCerts=true, javascriptEnabled=true, browserName=firefox, 可旋转=false,locationContextEnabled=true,版本=23.0, cssSelectorsEnabled=true,databaseEnabled=true,handlesAlerts=true, browserConnectionEnabled=true, nativeEvents=false, webStorageEnabled=true, applicationCacheEnabled=true, 需要屏幕截图 = true] 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:513) 在 org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:193) 在 org.openqa.selenium.remote.ErrorHandler.createUnhandledAlertException(ErrorHandler.java:174) 在 org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:141) 在 org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:595) 在 org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:348) 在 org.openqa.selenium.remote.RemoteWebDriver.findElementById(RemoteWebDriver.java:389) 在 org.openqa.selenium.By$ById.findElement(By.java:214) 在 org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:340) 在 com.amadeus.selenium.runner.SEPWebDriverWrapper.findElement(SEPWebDriverWrapper.java:141)
我搜索了一些解决方案并得到了以下sn-p来处理问题
//现在警报出现了。警报警报 = driver.switchTo().alert(); alert.accept();
它工作正常,但是警报弹出窗口出现在不同的实例(或不同的场景)中,在所有代码块中都无法处理警报
请让我知道是否有任何常用方法,我可以通过一些 Firefox 配置文件设置或任何其他通用方法永久禁用此警报弹出窗口
我正在使用 Selenium Java 和 Firefox 浏览器
【问题讨论】:
我会建议按照预期的行为处理警报,而不是到处禁用它们。 感谢您的回复,但问题是 AlertPopup 的出现并非始终在同一个实例中,您想到了任何设置,其中 firefoxprofile 可以像下载窗口弹出一样永久禁用它 您肯定知道警报什么时候出现,什么时候不出现?这是你的网站,对吧?您知道应用程序实际上做了什么,对吧? 我已经看到了在不同情况下发生的警报弹出窗口,尽管我能够在一个实例中使用 Alert alert = driver.switchTo().alert(); 来处理警报。警报.accept(); 。所以只是为了确保它不会出现在不同的场景中,我觉得如果我们永久禁用它会更好。 Tas 我要问是否有永久禁用它的原因 如果你在你拥有的接受警报代码周围使用 try/catch,然后不做任何事情,除非它会尝试在你需要的任何地方关闭弹出窗口,但如果弹出窗口不是你的测试不会出错。不是最佳做法,但取决于您的目标,它可能会奏效。 【参考方案1】:这样写一个方法:
protected boolean isAlertPresent()
try
driver.switchTo().alert();
return true;
catch (NoAlertPresentException e)
return false;
调用上面的方法来验证alert是否存在如下:
if(isAlertPresent())
System.out.println(isAlertPresent());
driver.switchTo().alert().accept();
【讨论】:
我试过了,但仍然收到org.openqa.selenium.UnhandledAlertException: Modal dialog present
。
你在哪里写过第一种方法(isAlertPresent())?同班还是不同班?如果您在同一个班级写作,请使用 private 或 public 而不是 protected。【参考方案2】:
这可以通过结合使用 Robot 类和 selenium Alert switch to command来解决。
driver.switchTo().alert();
// invoke Robot class
Robot rb = new Robot();
rb.KeyPress(KeyEvent.VK_ENTER);
rb.KeyPress(KeyRelease.VK_ENTER);
试试这个,如果有任何问题,请告诉我。它对我有用,因为我之前遇到过这个问题。
【讨论】:
以上是关于未处理的警报异常:存在模式对话框(Selenium)的主要内容,如果未能解决你的问题,请参考以下文章
警报处理 - Selenium WebDriver/Selenium RC 2.18.0 - 异常
线程“主”org.openqa.selenium.NoAlertPresentException 中的异常:没有打开警报