6

我正在用 Protractor 测试我的 Angular 应用程序。我浏览了文档,但找不到任何获取警报文本的方法。它本身不是 DOM 中的元素(至少,我无法弄清楚;当出现警报时,Chrome 的检查器将不允许您检查它)。我将如何测试警报是否包含正确的消息?甚至,那个存在?

编辑

这是我的代码。HTML:

  <button id='alertButton' data-ng-click='ngAlert()'>Button</button>

JS:

$scope.ngAlert = function(){
  window.alert('Hello');
};

量角器规格:

  describe('alert', function(){
    var ptor = protractor.getInstance();
    beforeEach(function(){
      button = $('#alertButton');
      button.click();
    });
    it('tells the alert message', function(){
      expect(button.getText()).toEqual('Button');
    });
  });

当我对按钮文本做出这样的断言时:

it('tells the alert message', function(){
  expect(button.getText()).toEqual('Button');
});

它通过了。但是,如果我尝试阅读这样的警报:

it('tells the alert message', function(){
  var alertDialog = ptor.switchTo().alert();
  expect(alertDialog.getText()).toEqual('Hello');
});

我收到此错误:

$ protractor spec/e2e/conf.js 在 http://localhost:4444/wd/hub .F使用 selenium 服务器

失败:

1) alert 告诉警报消息 Message: NoSuchAlertError: no alert open (Session info: chrome=30.0.1599.101) (Driver info: chromedriver=2.2,platform=Mac OS X 10.9.0 x86_64) (WARNING: The server did not provide任何堆栈跟踪信息)命令持续时间或超时:3毫秒构建信息:版本:'2.35.0',修订:'c916b9d',时间:'2013-08-12 15:42:01'系统信息:os.name:' Mac OS X', os.arch: 'x86_64', os.version: '10.9', java.version: '1.6.0_65' 会话 ID: edbaa752eb14ad45f7e961903b69a466 驱动程序信息: org.openqa.selenium.chrome.ChromeDriver Capabilities [{platform =MAC,acceptSslCerts=true,javascriptEnabled=true,browserName=chrome,chrome={chromedriverVersion=2.2},rotatable=false,locationContextEnabled=true,版本=30.0.1599.101,cssSelectorsEnabled=true,databaseEnabled=true,handlesAlerts=true,browserConnectionEnabled=false,nativeEvents=true,webStorageEnabled=true,applicationCacheEnabled=false,takeScreenshot=true}]

在 2.125 秒内完成 2 个测试,2 个断言,1 个失败

/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/promise.js:1542 抛出错误;^ NoSuchAlertError:没有打开警报

但是我在页面上测试过,它可以工作,并且测试可以清楚地找到DOM中的按钮。所以要么该click()功能不起作用,要么发生了其他事情?

4

2 回答 2

10

在您的测试中,获取当前的 Protractor 实例并使用它switchTo().alert()来访问alert对话框:

var ptor = protractor.getInstance();

var alertDialog = ptor.switchTo().alert();

expect(alertDialog.getText()).toEqual("Hello");

请记住,Protractor 基本上只是 Selenium WebDriver 的包装器,因此,据我所知,您可以使用 Selenium WebDriver 执行的任何操作都可以使用 Protractor 执行。

编辑以包括完整的测试:

describe('Alert dialog', function () {

    var ptor = protractor.getInstance(),
        button;

    beforeEach(function () {
        // This line is necessary on my end to get to my test page.
        // browser.driver.get('http://localhost:8000/test.html');
        button = ptor.findElement(protractor.By.id('alertButton'));
        button.click();
    });

    it('tells the alert message', function () {
        var alertDialog = ptor.switchTo().alert();
        expect(alertDialog.getText()).toEqual("Hello");
    });

});

您的应用程序可能在执行测试时仍在初始化,这可以解释为什么似乎没有出现任何对话框。确保您的应用程序“准备就绪”并且可以在做出断言之前实际显示警报。希望有帮助!

于 2013-11-09T23:21:41.457 回答
5

您必须等待浏览器打开/显示警报。使用量角器 2.2.0 的示例:

   var timeoutInMilliseconds = 1000;
   browser.wait(protractor.ExpectedConditions.alertIsPresent(), timeoutInMilliseconds);
   var alertDialog = browser.switchTo().alert();
   expect(alertDialog.getText()).toEqual("Hello World!");
于 2015-11-24T12:50:51.720 回答