Как мне зафиксировать ошибки JavaScript, сгенерированные на странице, извлеченной PhantomJS? - PullRequest
12 голосов
/ 21 сентября 2011

У меня есть скрипт PhantomJS, который загружает локальный файл HTML, вставляет некоторые файлы javascript, а затем выполняет некоторый javascript в контексте страницы.Javascript, который выполняется, генерирует исключение, но я получаю вывод только из консоли, которая, кажется, не различает ошибку и обычный журнал и не имеет файла, номеров строк или трассировки стека.

Что мне нужно, так это способ уловить или иначе отличить эти ошибки.Я уже попробовал:

  • Завершение моего скрипта PhantomJS в try-catch
    • Результат: ничего не выбрасывается достаточно далеко, чтобы быть пойманным этим
  • Определить функцию window.onerror
    • Результат: ничего не происходит.WebKit не реализует событие onerror в окне

Я бы предпочел иметь возможность получать сам объект ошибки, чтобы я мог получить трассировку стека.

Ответы [ 2 ]

8 голосов
/ 29 декабря 2011

Я думаю, что были проблемы с window.onerror, некорректно работающим в WebKit (https://bugs.webkit.org/show_bug.cgi?id=8519). Не знаю, было ли это вообще исправлено, и если да, если версия QT WebKit уже обновлена.

Тем не менее, вы должны быть в состоянии перехватить исключения, возникающие в вашем коде. Если вы используете что-то вроде webPage.evaluate(...) для запуска кода, вы не можете заключить полный вызов в блок try / catch, так каксценарий оценивается в другом контексте, и ошибки не будут отображаться в главном контексте выполнения. Вместо этого вам нужно будет отловить ошибки в контексте выполнения страницы. К сожалению, нет никакого доступа к функциям, определенным в основном контексте, поэтому мы имеемчтобы явно написать оберточный код вокруг исполняемого кода.

Ниже приведен модифицированный пример файла phantomwebintro.js, включенного в исходный код PhantomJS: он загружает страницу HTML, вставляет скрипт и затем запускаетнекоторый код в контексте страницы (здесь со строкой, которая выдает ошибку типа). Этот код переносится с помощью trБлок y / catch и вернет завернутый результат или объект ошибки в основной контекст.

...

// Load an HTML page:
page.open("http://www.phantomjs.org", function(status) {
    if (status == "success") {

        // Inject some scripts:
        page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() {

            // Run your own code in the loaded page context:
            var resultWrapper = page.evaluate(function() {
                var wrapper = {};
                try {
                    // Your code goes here
                    // ...

                    var x = undefined.x; // force an error

                    // store your return values in the wrapper
                    wrapper.result = 42;
                } catch(error) {
                    wrapper.error = error;
                }
                return wrapper;
            });

            // Handle the result and possible errors:
            if (resultWrapper.error) {
                var error = resultWrapper.error;
                console.log("An error occurred: " + error.message);
                // continue handling the error
                // ...
            } else {
                var result = resultWrapper.result;
                // continue using the returned result
                // ...
            }

            ...

        });
    }
});

...
2 голосов
/ 30 октября 2016

Решение? return true!

      // Error tracking
      page.onError = function(msg, trace) {
          console.log('= onError()');
          var msgStack = ['  ERROR: ' + msg];
          if (trace) {
            msgStack.push('  TRACE:');
            trace.forEach(function(t) {
              msgStack.push('    -> ' + t.file + ': ' + t.line + (t.function ? ' (in function "' + t.function + '")' : ''));
            }); 
          }   
          console.log(msgStack.join('\n'));

          // Consider error fully handled
          return true;
      };
...