Транспортир ожидать currenturl не удается

Я пытаюсь получить тест e2e, выполняемый против моего локального сервера, и проверить, что полученный URL-адрес (после нажатия кнопки навигации) является правильным результатом. Однако полученный URL всегда неверен.

Мой код показан ниже:

HTML:

//http://localhost/#/current_Page
<html>
    <head><title></title></head>
    <body>
    //should change the current url to
    //http://localhost/#/new_page
    <button class="button" ng-click="change_page()">Change Page</button>
</html>

ИСПЫТАТЕЛЬНЫЙ КОД:

var protractor = require('protractor');
require('protractor/jasminewd');

describe('Tests', function() {      
    var ptor;

    describe('Test 1', function() {
        var ptor = protractor.getInstance();
        ptor.get('#/current_page'); 
        it('change page and current url', function() {
            ptor.findElement(protractor.By.className('.button').click().then(function() {
                expect(ptor.currentUrl()).toContain('#/new_page');
            });
        });
    }, 30000);
});

Проблема заключается в текущем URL-адресе после нажатия кнопки остается #/current_url и не изменяется на ожидаемый результат #/new_page.

Кто-нибудь знает, где я ошибся?

Ответ 1

После поиска ответа на этот вопрос я сам понял:

Текущий url не терпит неудачу, я не ожидал, что обещание вернется к angular. Приведенный ниже код показывает, где я ошибся.

var protractor = require('protractor');
require('protractor/jasminewd');

describe('Tests', function() {      
var ptor;

describe('Test 1', function() {
    var ptor = protractor.getInstance();
    ptor.get('#/current_page'); 
        it('change page and current url', function() {
            ptor.findElement(protractor.By.className('.button').click().then(function() {
                ptor.waitForAngular();
                expect(ptor.currentUrl()).toContain('#/new_page');
            });
        });
    }, 30000);
});

Затем он ждет, пока angular перейдет на новую страницу и обновит любые привязки, а затем продолжит проверку ожидаемого результата, который теперь является тем, что я ожидаю.

Обратите внимание, что это не решает все проблемы, связанные с неожиданными результатами getCurrentUrl(). если вы используете driver.findElement(), вам может потребоваться обратиться к ответу JulieMR на этот вопрос

Я надеюсь, что это поможет кому-то застрять в этой проблеме.

Ответ 2

В Protractor 1.5.0 protractor.getInstance(); больше не работает, поэтому вместо этого нужно использовать browser.

var protractor = require('protractor');
require('protractor/jasminewd');

describe('Tests', function() {      

describe('Test 1', function() {
    browser.get('#/current_page'); 
        it('change page and current url', function() {
            ptor.findElement(protractor.By.className('.button').click().then(function() {
                browser.waitForAngular();
                expect(browser.getCurrentUrl()).toContain('#/new_page');
            });
        });
    }, 30000);
});

Ответ 3

Вы также можете написать пользовательское ожидаемое условие для wait для текущий url, чтобы быть равным желаемому. Кроме того, используйте обозначения browser и element:

browser.get("#/current_page"); 

it("change page and current url", function() {
    element(by.css(".button")).click();

    browser.wait(urlChanged("#/new_page")), 5000);
});

где urlChanged:

var urlChanged = function(url) {
  return function () {
    return browser.getCurrentUrl().then(function(actualUrl) {
      return actualUrl.indexOf(url) >= 0;
    });
  };
};

Или, приложение Protractor >= 4.0.0 и urlContains ожидаемое условие:

element(by.css(".button")).click();

var EC = protractor.ExpectedConditions;
browser.wait(EC.urlContains("#/new_page"), 5000);