我正在使用Protractor测试我的Angular应用程序。我查看the docs并找不到任何方法来获取警报文本。这不是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使用selenium服务器 http://localhost:4444/wd/hub .F
故障:
1)警告告诉警报消息消息: NoSuchAlertError:没有警报打开(会话信息:chrome = 30.0.1599.101)(驱动程序信息:chromedriver = 2.2,platform = 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 =真}]
在2.125秒完成2次测试,2次断言,1次失败
/usr/local/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/promise.js:1542 抛出错误; ^ NoSuchAlertError:没有警报打开
但是我已经在页面上测试了它并且它可以工作,测试可以清楚地找到DOM中的按钮。那么要么click()
函数不起作用,要么正在发生其他事情?
答案 0 :(得分:9)
在测试中,获取当前的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");
});
});
您的应用程序可能仍在执行测试时初始化,这可以解释为什么没有出现对话框的原因。确保您的应用程序“准备就绪”并且可以在进行断言之前实际显示警报。希望有所帮助!
答案 1 :(得分:2)
您必须等待浏览器打开警报。使用Protractor 2.2.0的示例:
var timeoutInMilliseconds = 1000;
browser.wait(protractor.ExpectedConditions.alertIsPresent(), timeoutInMilliseconds);
var alertDialog = browser.switchTo().alert();
expect(alertDialog.getText()).toEqual("Hello World!");