Есть ли способ войти в код CasperJS и отлаживать шаг за шагом

Хотя я использовал CasperJS в течение некоторого времени и полагаюсь на ведение журнала консоли для отладки. Мне было интересно, есть ли какой-либо IDE, который поддерживает пошаговую отладку CasperJS или есть другой способ (удаленная отладка), чтобы войти в код CasperJS? Кто-нибудь успешно это сделал? Любая информация будет полезна.

Спасибо,

Ответы

Ответ 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');