我正在尝试弄清楚如何使这个基本测试始终如一地通过。
describe('home page', function () {
beforeEach(function () {
browser.driver.get('https://localhost:0000/xxxx/');
});
it('should have a title', function () {
var userName = browser.driver.findElement(by.id('userid_inputtext')).sendKeys('userNameXX');
var passWord = browser.driver.findElement(By.id("password_inputtext")).sendKeys("passWordXX");
var login = browser.driver.findElement(By.id('sign_in_button'));
login.click();
browser.driver.getCurrentUrl();
browser.driver.getTitle().then(function (title) {
expect(title).toEqual('Webpage Title');
});
});
});
页面中的登录不是 Angular,但登录后会加载 Angular 应用程序。现在我的测试有时会通过。问题是有时它会获取登录页面的标题,有时会获取主页的标题(我希望它在登录后始终测试主页的标题)。
我一直在尝试使用 promise 和浏览器。稍等一下,但还没有真正确定下来。任何建议都会很棒!
最佳答案
我能想到的一些事情 - Protractor API 中的大多数方法都是异步的并且返回 promise 。
在您的登录页面中,一旦您login.click()
,您的主页需要一些时间来加载,因此遵循异步方法,如 - browser.getCurrentUrl
& browser.getTitle
首先被调用。正如您所指出的那样,这种情况不一致。
您还应该将变量分配给元素定位器,然后对它们执行操作!您应该使用页面对象来存储您的定位器。请引用Official Protractor Style Guide
browser.getCurrentUrl
也返回一个你必须解决它的 promise 。
要解决此问题,您应该以正确的方式使用 browser.wait
:
describe('home page', function () {
beforeEach(function () {
browser.driver.get('https://localhost:0000/xxxx/');
});
it('should have a title', function () {
var userName = browser.driver.findElement(by.id('userid_inputtext'));
userName.clear();
userName.sendKeys('userNameXX');
var passWord = browser.driver.findElement(By.id("password_inputtext"));
passWord.clear();
passWord.sendKeys("passWordXX");
var login = browser.driver.findElement(By.id('sign_in_button'));
browser.driver.wait(login.click(),5000,'homePage should be loaded within 5 secs'); // would throw an error if the page takes more than 5 secs to load
// you could also use `browser.driver.sleep(500)` but not advisable as sleeps slow the tests down!
browser.driver.getCurrentUrl().then(function (url) {
expect(url).toEqual('homePage url');
});
browser.driver.getTitle().then(function (title) {
expect(title).toEqual('Webpage Title');
});
});
});
此外,由于您的登录页面是非 Angular ,您可以以正确的方式编写测试,即使用 browser.ignoreSynchronization
并以更简洁的方式使用 Protractor api 方法。
describe('home page', function () {
beforeEach(function () {
browser.get('https://localhost:0000/xxxx/');
});
it('should have a title', function () {
browser.ignoreSynchronization = true; // set it to true for non-angular pages(loginPage)
var userName = element(by.id('userid_inputtext'));
userName.clear();
userName.sendKeys('userNameXX');
var passWord = element(By.id("password_inputtext"));
passWord.clear();
passWord.sendKeys("passWordXX");
var login = element(By.id('sign_in_button'));
browser.wait(login.click(),5000,'homePage should be loaded within 5 secs');
browser.ignoreSynchronization = false; // set it to false for angular pages(homePage)
browser.getCurrentUrl().then(function (url) {
expect(url).toEqual('homePage url');
});
browser.getTitle().then(function (title) {
expect(title).toEqual('Webpage Title');
});
});
});
注意不需要访问browser.driver
对象,可以直接使用 Protractor 的方法!
关于javascript - Protractor 排序基本测试。登录后运行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41171159/