Ответ 1
Когда я хочу отлаживать с помощью CasperJS, я делаю следующее: я запускаю свой script с помощью slimerJS (он открывает окно firefox, поэтому я могу легко увидеть проблему с кликом, проблемы заполнения формы - ошибку возврата ajax, загрузку мультимедиа...-, и на каком этапе блокирует код).
С этим мне не нужно часто смотреть на консоль, и я не вызываю this.capture('img.jpg') несколько раз, чтобы отлаживать (на данный момент я не тестирую отзывчивый дизайн, поэтому я не знаю, t нужно использовать захват, взгляните на PhantomCSS, если вы его протестируете).
Я использую slimerJS для отладки (всегда с casper), но phantomJS в непрерывном Integration-jenkins- (без головы), хотя вы можете использовать slimerjs тоже (без головы) с xvfb на linux или Mac.
Но иногда я должен посмотреть на консоль для получения более подробной информации, поэтому я использую эти параметры (их также можно вызвать в командной строке):
casper.options.verbose = true;
casper.options.logLevel ="debug";
Назовите ваши закрытия будут полезны с этими параметрами, потому что имя будет отображаться.
Я не думаю, что есть среда IDE: если шаг завершается неудачно, стек со всеми последующими шагами останавливается в любом случае (ну, возможно, все же можно сделать "вид взлома", используя несколько ожиданий и инкапсулировать их - выполнить различие замыканий и результат каждого из них, даже если один из них терпит неудачу, но в этом случае мы не выполняем синхронные шаги, а выполняем асинхронные команды: позаботьтесь о тайм-ауте и логическом потоке, если вы попробуете). Уход: я сказал: "если сбой в шаге", если это просто инструкция в закрытии, которая не выполняется, конечно, будут выполняться следующие шаги.
Так происходит замыкание, которое не выполняется → выполняются следующие шаги. Шаг, который не выполняется (ex: thenOpen (fssfsf) с fssfsf не определено), стек остановится. Несколько wait() можно выполнить асинхронно.
Итак, если у вас много ошибок и последовательно выполняйте свои тесты (шаги стекирования), вы можете отлаживать их только один за другим или закрывать для независимых шаговых функций - я думаю, что IDE может работать в этом случае - (- > для одного файла. Стеки, конечно, независимы, если вы запускаете папку). И обычно в начале вы запускаете свой файл каждый раз, когда вы заканчиваете шаг. И когда вы привыкли к инструменту, вы сразу пишете весь script.
В большинстве случаев ошибка возникает из-за асинхронности, области видимости, контекстных проблем (на самом деле проблемы с js, хотя casper упрощает асинхронные проблемы: "Обратный вызов/слушатель - это реализация шаблона Promise." ):
-
Если вы хотите закодировать макет инструкций, не забывайте о IIFE или используйте каждую функцию, и включайте все с помощью инструкции then() (или непосредственно eachThen). При необходимости я могу показать некоторые примеры. В противном случае он зациклирует последнее значение индекса "i.length", в js нет области цикла, по умолчанию у меня есть эта же ссылка.
-
Когда вы нажимаете на ссылку в конце шага, используйте функцию wait() - step too-statement after; вместо a then(). Если я хорошо понял оператор then(), он запускается при завершении предыдущего шага. Поэтому он запускается сразу после щелчка(). Если этот клик запускает возврат ajax, и ваш следующий шаг очистит или проверит результат этого возврата ajax, он будет случайно терпеть неудачу, потому что вы явно не просите ждать ресурса. В моих первых тестах я видел некоторые проблемы.
-
Не смешивайте два контекста: среда для кассового сервера и среда DOM страницы. Используйте функцию оценки() для перехода от одного к другому. В функции оценки вы можете передать аргумент из контекста casper на страницу DOM...
... Вот так:
var casperContext = "phantom";
casper.evaluate(function(pageDomContext) {
console.log("will echo ->phantom<- in the page DOM environment : " + pageDomContext + ", use casper.on('remote.message') to see it in the console");
}, casperContext);
Или вы можете увидеть его непосредственно в браузере с помощью slimerJS, используя alert() вместо console.log().
-
Используйте setFiltrer для обработки приглашения и подтверждения.
-
Если ваш сайт существует и в мобильной версии, вы можете манипулировать userAgent для своих мобильных тестов.
-
Вы можете вызывать модули node в файле casperJS, в файлах с помощью модуля тестера. Ну, это не совсем так, см. использовать node модуль от casper, Некоторые основные функции node реализованы в phantom (и slimer too), как fs, дочерний процесс, но они не всегда хорошо документированы. Я предпочитаю выполнять мои тесты с помощью node так. node полезно запускать ваши тесты параллельно (дочерний процесс). Я предлагаю вам выполнить столько процессов, сколько у вас есть. Ну, это зависит от вашего типа script, с обычным сценарием (открыть страницу и проверить некоторые элементы). Я могу выполнить 10 дочерних процессов параллельно без случайного сбоя (локальный компьютер), но с некоторыми элементами, которые медленно загружаются (как multi svg, иногда xml...), используйте require('os').cpus().length или script следующим образом: Повторите шаг X раз. В противном случае у вас будет случайный сбой, даже если вы увеличите время ожидания. Когда он выйдет из строя, вы не сможете сделать что-либо другое, что
reload()
страница.
Затем вы можете интегрировать свои тесты в jenkins с помощью команды xunit. Просто укажите индекс differents для каждого файла log.xml, jenkins (XUnit → JUnit) будет управлять ими: pattern *.xml.
Я знаю, что я действительно не отвечал на ваш вопрос, но я думаю, что отлаживать, перечислять основные конкретные проблемы остается лучшим способом.
Есть еще полезные функции для отладки:
var fs = require('fs');
fs.write("results.html", this.getPageContent(), 'w');
Я предпочитаю этот путь, а не this.debugHTML(). Я могу проверить файл results.html, если отсутствуют теги (относительно браузера с помощью firebug или другого инструмента). Или иногда, если мне нужно проверить только один тег, вывод результата в консоли не является проблемой, поэтому: this.getHTML( "my selector" ); и вы все равно можете выполнить вывод журнала: casperjs test test.js > test.html
- Еще один трюк: если вы выполняете свои тесты в локальном режиме, иногда тайм-аут по умолчанию недостаточен (замораживание сети) (5 секунд).
So → 10sec:
casper.options.waitTimeout = 10000;
Некоторые различия между phantom и Slimer:
-
С slimer, если вы установите casper.options.pageSettings.loadImages = false; и в вашем файле вы пытаетесь очистить или проверить вес/высоту... элемента, он будет работать со слайдером, но не с phantom. Поэтому установите для него значение true в конкретном файле, чтобы сохранить совместимость.
-
Необходимо указать абсолютный путь с slimer (с include, import- > input media,...).
Пример:
this.page.uploadFile('input[name="media"]', fs.absolute(require('system').args[4]).split(fs.separator).slice(0, -1).join(fs.separator) + '/../../../../avatar.jpg');
Чтобы включить файл из корневой папки (работайте в каждом поддирексе/ОС, лучше, чем предыдущее включение) - вы также можете сделать это nodeLike, используя require() -:
phantom.injectJs(fs.workingDirectory + '/../../../../global.js');