Несколько вещей, о которых я мог думать - большинство методов в API-интерфейсе транспортира являются асинхронными и возвращают обещания.
В вашей странице входа в системе, как только вы login.click()
, ваша домашняя страница занимает некоторое время, чтобы загрузить и поэтому следующие методы асинхронных как - browser.getCurrentUrl
& browser.getTitle
называют первым. Это происходит непоследовательно, как вы указали.
Также вы должны назначить переменные для локаторов элементов, а затем выполнить действия над ними! Вы должны использовать объекты страницы для хранения ваших локаторов. Пожалуйста, обратитесь к Official Protractor Style Guide
browser.getCurrentUrl
также возвращает обещание, которое вы также должны решить.
Чтобы решить эту проблему, вы должны использовать 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');
});
});
});
Кроме того, поскольку ваша страница Логина не является угловой, вы могли бы написать тест на правильном пути, который должен использовать browser.ignoreSynchronization
и используя методы транспортировщика 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
объекта, вы можете напрямую использовать методы транспортир в!
Возможно ли использовать метод '.click()'? –
Это, но он по-прежнему захватывает название страницы входа, когда я помещаю код ниже 'login.click()' внутри. –