javascript - Protractor :获取警报文本?

标签 javascript angularjs webdriver jasmine protractor

我正在使用 Protractor 测试我的 Angular 应用程序。我已经看过 the docs并且找不到任何方法来获取警报文本。它本身不是 DOM 中的一个元素(至少,不是我能弄清楚的;当出现警报时,Chrome 的检查器将不允许您检查它)。我将如何测试警报是否包含正确的消息?甚至,那个存在?

编辑

这是我的代码。 HTML:

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

JS:

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

Protractor 规范:

  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 Using the selenium server at http://localhost:4444/wd/hub .F

Failures:

1) alert tells the alert message 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 any stacktrace information) Command duration or timeout: 3 milliseconds Build info: version: '2.35.0', revision: 'c916b9d', time: '2013-08-12 15:42:01' System info: os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.9', java.version: '1.6.0_65' Session ID: edbaa752eb14ad45f7e961903b69a466 Driver info: org.openqa.selenium.chrome.ChromeDriver Capabilities [{platform=MAC, acceptSslCerts=true, javascriptEnabled=true, browserName=chrome, chrome={chromedriverVersion=2.2}, rotatable=false, locationContextEnabled=true, version=30.0.1599.101, cssSelectorsEnabled=true, databaseEnabled=true, handlesAlerts=true, browserConnectionEnabled=false, nativeEvents=true, webStorageEnabled=true, applicationCacheEnabled=false, takesScreenshot=true}]

Finished in 2.125 seconds 2 tests, 2 assertions, 1 failure

/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/promise.js:1542 throw error; ^ NoSuchAlertError: no alert open

但是我已经在页面上测试过了,是可以用的,而且测试可以很清楚的在DOM中找到按钮。那么,要么 click() 函数不工作,要么发生了其他事情?

最佳答案

在您的测试中,获取当前 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");
    });

});

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

关于javascript - Protractor :获取警报文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19879631/

相关文章:

javascript - 我对 Angular 状态 promise 解决有什么误解?

angularjs - 发生服务器端更新时,如何更新 AngularJS 中的 $scope?

ruby - 获取包含文本的 webdriver 中的特定元素

javascript - jQuery选择伪元素:after

javascript - 类型错误 : undefined is not an boject (evaluating '_ref$i18n.currentLanguage' )

angularjs - 托管 angularjs 应用程序的最佳方式是什么?

java - 如何设置 selenium webdriver 获取超时?

selenium - 如何在现有的 REAL 浏览器中启动 selenium 或 puppeteer

javascript - JS Slide div 类不起作用 - 简单问题

javascript - NODE.JS - 使用 URL.parse 传递路径名