未处理的警报异常:存在模式对话框(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 - 异常

你需要知道的有关Selenium异常处理的都在这儿

线程“主”org.openqa.selenium.NoAlertPresentException 中的异常:没有打开警报

离开页面前的 Jquery 未保存更改警报

使用 selenium 和 python 检查是不是存在任何警报

Selenium Python - 处理没有这样的元素异常