量角器:获取警报文本?

nic*_*tme 5 javascript webdriver jasmine angularjs protractor

我正在用Protractor测试我的Angular应用程序.我查看了文档,找不到任何方法来获取警报文本.这不是DOM本身的一个元素(至少,不是我能弄明白的;当有警报时,Chrome的检查员将不允许你检查它).我如何测试警报是否有正确的消息?或者甚至,那个存在?

编辑

这是我的代码.HTML:

  <button id='alertButton' data-ng-click='ngAlert()'>Button</button>
Run Code Online (Sandbox Code Playgroud)

JS:

$scope.ngAlert = function(){
  window.alert('Hello');
};
Run Code Online (Sandbox Code Playgroud)

量角器规格:

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

当我对按钮文本进行断言时,如下所示:

it('tells the alert message', function(){
  expect(button.getText()).toEqual('Button');
});
Run Code Online (Sandbox Code Playgroud)

它过去了.但是,如果我尝试读取这样的警报:

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

我收到此错误:

$量角器规格/ E2E/conf.js使用硒服务器的 HTTP://本地主机:4444/WD /集线器 .F

失败:

1)警告告诉警报消息消息:NoSuchAlertError:没有警报打开(会话信息:chrome = 30.0.1599.101)(驱动程序信息:chromedriver = 2.2,平台= Mac OS X 10.9.0 x86_64)(警告:服务器未提供任何堆栈跟踪信息)命令持续时间或超时: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},rotate = false,locationContextEnabled = true,version = 30.0.1599.101,cssSelectorsEnabled = true,databaseEnabled = true,handlesAlerts = true,browserConnectionEnabled = false,nativeEvents = true,webStorageEnabled = true,applicationCacheEnabled = false,takesScreenshot = true}]

完成2.125秒2次测试,2次断言,1次失败

/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/promise.js:1542 throw error; ^ NoSuchAlertError:没有警报打开

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

Col*_*ock 9

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

var ptor = protractor.getInstance();

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

expect(alertDialog.getText()).toEqual("Hello");
Run Code Online (Sandbox Code Playgroud)

请记住,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");
    });

});
Run Code Online (Sandbox Code Playgroud)

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

  • 我刚刚给Protractor添加了一个测试,它显示了一个使用Alerts的例子.查看https://github.com/angular/protractor/commit/196c83a9d728e40fecd7a9f206bb985533550fde (2认同)

Uli*_*Uli 5

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

   var timeoutInMilliseconds = 1000;
   browser.wait(protractor.ExpectedConditions.alertIsPresent(), timeoutInMilliseconds);
   var alertDialog = browser.switchTo().alert();
   expect(alertDialog.getText()).toEqual("Hello World!");
Run Code Online (Sandbox Code Playgroud)