Selenium 如何使用WebDriver处理页面导航中出现的警报?

Selenium 如何使用WebDriver处理页面导航中出现的警报?,selenium,selenium-webdriver,webdriver,Selenium,Selenium Webdriver,Webdriver,这里的场景是,我正在测试的某些页面将有一个卸载事件,即,如果存在未保存的更改,则提示保存更改是一个常见的示例,我希望能够检测到并处理它 具体问题如下: 我正在测试一个非常复杂的web应用程序,它允许用户在浏览器中编辑丰富的内容,并自动保存用户的更改。因此,该测试执行如下操作: 导航到应用程序 做一些编辑 驶离 但是,由于应用程序在导航离开时自动保存更改,并且存在未保存的更改,因此将显示此提示: 每当Selenium中出现警报时,下一个操作就会失败,调用堆栈如下: org.openqa.selen

这里的场景是,我正在测试的某些页面将有一个卸载事件,即,如果存在未保存的更改,则提示保存更改是一个常见的示例,我希望能够检测到并处理它

具体问题如下:

我正在测试一个非常复杂的web应用程序,它允许用户在浏览器中编辑丰富的内容,并自动保存用户的更改。因此,该测试执行如下操作:

  • 导航到应用程序
  • 做一些编辑
  • 驶离
  • 但是,由于应用程序在导航离开时自动保存更改,并且存在未保存的更改,因此将显示此提示:

    每当Selenium中出现警报时,下一个操作就会失败,调用堆栈如下:

    org.openqa.selenium.UnhandledAlertException: unexpected alert open
      (Session info: chrome=39.0.2171.65)
      (Driver info: chromedriver=2.11.298604 (75ea2fdb5c87f133a8e1b8da16f6091fb7d5321e),platform=Windows NT 6.1 SP1 x86_64) (WARNING: The server did not provide any stacktrace information)
    Command duration or timeout: 87 milliseconds: null
    Build info: version: '2.43.1', revision: '5163bceef1bc36d43f3dc0b83c88998168a363a0', time: '2014-09-10 09:43:55'
    System info: host: 'ip-10-231-174-40', ip: '10.231.174.40', os.name: 'Linux', os.arch: 'amd64', os.version: '3.11.0-19-generic', java.version: '1.7.0_51'
    Session ID: 889cbda1d1a946a38e90e4ec9f32e827
    Driver info: org.openqa.selenium.remote.RemoteWebDriver
    Capabilities [{platform=XP, acceptSslCerts=true, javascriptEnabled=true, hasMetadata=true, browserName=chrome, chrome={userDataDir=C:\Users\ADMINI~1\AppData\Local\Temp\scoped_dir1584_15883}, rotatable=false, mobileEmulationEnabled=false, locationContextEnabled=true, webdriver.remote.sessionid=889cbda1d1a946a38e90e4ec9f32e827, version=39.0.2171.65, takesHeapSnapshot=true, databaseEnabled=false, cssSelectorsEnabled=true, handlesAlerts=true, browserConnectionEnabled=false, nativeEvents=true, webStorageEnabled=true, applicationCacheEnabled=false, takesScreenshot=true}]
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
        at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:204)
        at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:162)
        at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:599)
        at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:614)
        at org.openqa.selenium.remote.RemoteWebDriver.getCurrentUrl(RemoteWebDriver.java:319)
    
    因此,一种解决方案可能是,每当我的测试离开这个页面时,我都会放置try/catch,但我想知道是否有一种更优雅、更系统的解决方案(即,可以检测警报或页面导航以便处理警报)


    有人对此问题有有效的解决方案吗?

    您需要切换到“警报”并接受它。Java中的示例:

    Alert alert = driver.switchTo().alert();
    alert.accept();
    
    在切换之前,您可能还需要等待它出现:

    WebDriverWait wait = new WebDriverWait(driver, 10);
    wait.until(ExpectedConditions.alertIsPresent());
    
    Alert alert = driver.switchTo().alert();
    alert.accept();
    

    或者,您可以首先停止弹出窗口以显示。想法是在使用
    javascript
    卸载事件侦听器之前删除所有

    JavascriptExecutor js = (JavascriptExecutor) driver;
    js.executeScript(
      "window.addEventListener(\"load\", foo, false);" +
      "function foo() { " + 
        "var u = \"beforeunload\";" + 
        "var v = unsafeWindow;" + 
        "if (v._eventTypes && v._eventTypes[u]) {" + 
          "var r=v._eventTypes[u];" + 
          "for(var s=0;s<r.length;s++) { " +
            "v.removeEventListener(u,r[s],false);" + 
          "}" +
          "v._eventTypes[u]=[];" + 
        "}");
    
    JavascriptExecutor js=(JavascriptExecutor)驱动程序;
    js.executeScript(
    window.addEventListener(\'load\',foo,false);“+
    “函数foo(){”+
    “var u=\”在卸载之前\“;”+
    “var v=不安全窗口;”+
    “如果(v._eventTypes&&v._eventTypes[u]){”+
    “var r=v._事件类型[u];”+
    
    “因为(var s=0;用一个更具体的示例和错误CallStackThank回答了这个问题!这正是我现在解决这个问题所要做的,但我仍然想知道是否有一种方法可以倾听是否发生了警报或页面导航而不是轮询。我猜答案是-不太适用于WebDriver Java。@dming好吧,因为它是chrome,你可以还可以尝试使用参数控制其行为。我还没有找到与此提示符相关的特定选项,但应该有一种方法可以禁用此类弹出窗口。例如,有,我非常确定它对此类提示符不起作用,但请尝试..@dming。请也查看更新。我还没有测试过这种方法,但请尝试一下。