Режим отладки транспортира выдает "FATAL ERROR: CALL_AND_RETRY_LAST Распределение не выполнено - процесс исчерпал память"
Я запускаю сценарий для автоматизации входа на веб-страницу с использованием NodeJS 0.12.4, Protractor 2.1.0., Моя система - Win 8.1, i7 2,5 ГГц, 16 ГБ ОЗУ, поэтому я думаю, что вряд ли я исчерпал памяти! Просто к сведению, когда я комментирую все операторы в коде, НО browser.get(), и я выполняю их один за другим в интерактивном режиме с помощью browser.pause() в начале, код работает. Это код для файла spec.js:
describe('Web Page Login', function() {
it('should login', function() {
browser.get('http://URL_HERE'); // opens page
//browser.pause();
element(by.css('[ng-click="showLogin(true);"]')).click();// clicks the login link to open the login dialog
var user = element(by.model('user.login.username'));// input user name
user.sendKeys('user');
var pass = element(by.model('user.login.password')); // input password
pass.sendKeys('pass');
element(by.css('[ng-click="login();"]')).click();// clicks the login button
var userName = element(by.className('ng-binding'));// locates the logged in user from the player details element and store it in "userName"
userName.getText(); //extracts the text that contains the user name
expect(userName).toBe("user"); //compare the string obtained above with the one expected
});
});
И это код для файла conf.js:
var HtmlReporter = require('protractor-html-screenshot-reporter');
var reporter=new HtmlReporter({
baseDirectory: './results', // the location to store the screen shots and results.
docTitle: 'Login test result',
docName: 'login-tests-report.html'
});
exports.config = {
seleniumAddress: 'http://localhost:4444/wd/hub',
specs: ['login-spec.js'],
onPrepare: function() {
jasmine.getEnv().addReporter(reporter);
}
};
транспортир conf.js
без комментирования всех строк я получаю эту ошибку:
FATAL ERROR: CALL_AND_RETRY_LAST Распределение не выполнено - процесс исчерпал память
Но если я закомментирую все строки в spec.js, кроме browser.get(), и использую repl для перехода в интерактивный режим отладки и наберу каждую строку из кода одну за другой, как я уже говорил выше, я могу выполнить весь код до конца без ошибок. Я начал использовать Protractor и JavaScript 2 недели назад, поэтому я мог что-то упустить. Спасибо за любую помощь.
2 ответа
Я как-то понял, как заставить код работать, а не то, что вызывает эту ошибку, я подозреваю, что это может быть что-то из библиотек Node, после обсуждения с одним из моих разработчиков. Изменение способа выполнения утверждения устранило ошибку. Вот код, который работает:
describe('Web Page Login', function() {
it('should login', function() {
browser.get('http://URL_HERE');//opens Web page
element(by.css('[ng-click="showLogin(true);"]')).click();//clicks the login link to open the login dialog
element(by.model('login.user.login.username')).sendKeys('username');//input user name
element(by.model('login.user.login.password')).sendKeys('password');//input password
element(by.css('[ng-click="login.login(false, loginForm.$valid);"]')).click(); //clicks the login button
var userName = element(by.className('ng-binding'));// locates the logged in user from the player details element and store it in "userName"
expect(userName.getText()).toContain('username');//compares the string found with the one expected and asserts if it's true or false
});
});
Надеюсь, что эти факты будут полезны.
Всегда держите код чистым и оптимизированным. Лучше не объявлять ненужные переменные.
getText возвращает обещание, поэтому вам нужно выполнить его.
element(by.className('ng-binding')).getText().then(function (text) { expect(text).toContain('username'); });
это лучший способ справиться с этим.
- Лучше знать, когда использовать getText
getText вернет текстовое содержимое между открывающим и закрывающим тегами элемента. Поскольку userName является текстовым вводом, это самозакрывающийся тег, поэтому getText не сможет захватить содержимое.
Так что для самозакрывающихся тегов всегда используйте
getAttribute('value')
вместо getText.
- Ошибка "Недостаточно памяти" обычно возникает, если память, выделенная для выполнения, меньше требуемой памяти. Этот ответ поможет вам исправить это. Увеличить кучу памяти
--max-old-space-size=1024
увеличит память до 1ГБ--max-old-space-size=2048
увеличит память до 2ГБ--max-old-space-size=3072
увеличит память до 3ГБ--max-old-space-size=4096
увеличит память до 4Гб--max-old-space-size=5120
увеличит память до 5Гб--max-old-space-size=6144
увеличит память до 6ГБ--max-old-space-size=7168
увеличит память до 7ГБ--max-old-space-size=8192
увеличит память до 8 ГБ
Кроме того, лучше не использовать toContain для проверки userName, так как это критическое поле. Вы должны проверить, содержит ли оно точное имя пользователя. Таким образом, toEqual будет более подходящим, чем toBe, так как toEqual проверит на глубокое равенство.