5

Je capture des erreurs js dans l'application avec window.onerror, mais le truc est - dans Chrome si les outils de développement ne sont pas ouverts - alors le paramètre url passé au gestionnaire onerror est toujours égal à l'URL ouverte.Capturer des erreurs JS dans Chrome

Alors que si les outils de développement sont ouverts - alors le url pointe vers le fichier exact .js l'erreur causée par js.

Comment gérez-vous cela? Y a-t-il des solutions de contournement?

Et pour être plus clair - voici 2 résultats:

  1. Uncaught ReferenceError: a is not defined index:122 - cela a été reçu après l'extraction d'une page
  2. Uncaught ReferenceError: a is not defined List.js:122 - ceci a été reçu après la récupération de la même page avec les outils de dev ouverts. Ceci est un résultat attendu - J'ai mis a(); appel au fichier List.js pour le test.

UPD: cela se fait pour les tests fonctionnels (en utilisant WebDriver de sélénium) - Je veux saisir js erreurs pour d'autres enquêtes.

+0

Si vous recherchez une exception qui doit être corrigée, je dirais d'ouvrir l'onglet Sources des outils de développement, puis d'utiliser le bouton "Suspendre toutes les exceptions/non interceptées" en bas à gauche du panneau. –

+1

@ Fabrício Matté: c'est pour les tests fonctionnels - je voudrais capturer les erreurs js pour plus d'investigations. Désolé je ne l'ai pas mentionné initialement – zerkms

Répondre

1

Faisons pose l'architecture suivante:

window.addEventListener("error", handleException, false); 

function handleException(I_sMsg) { 

    if (I_sMsg.stack) { 
      sMsg = I_sMsg.stack.replaceAll(getBaseURL(), ""); 
     alert(sMsg); 
    } else if (I_sMsg.message) { 
     alert(I_sMsg.message); 
    } 

    return cancelEvent(I_sMsg); 
} 

Maintenant tout throw new Error("description"); passera par la première partie de l'instruction if et avoir une belle pile pour vous d'analyser avec les urls.

Il fonctionne également des exceptions inattendues, ayant comme résultat le message suivant (dans ce cas, après avoir appelé la fonction unexisting bibi())

screenshot of an unexpected exception

Après une enquête plus poussée, mon cadre utilise une sorte de maison fait la gestion des tâches (comme indiqué dans la pile) où chaque action appartient à un travail.

La méthode d'exécution du travail est le suivant (simplifié)

try { 
     oTask.func.apply(oTask.obj, oTask.prms); 
    } catch(ex) { 
     handleException(ex); 
     return false; 
    } 

Donc cela signifie que chaque exécution unique est encapsulé dans ce seul bloc catch try. Comme vous le voyez, l'exception est interceptée et transmise au gestionnaire. Pas l'erreur .

Je pensais que ça fonctionnait dans l'autre fichier mais c'était parce que l'appel était encapsulé, alors que dans le fichier api.js c'était directement un appel gratuit non géré par le framework.

+0

Il ne s'agit pas vraiment gestion des erreurs au niveau de l'application, mais à propos d'erreurs js inattendues, telles que l'appel de non-fonctions ou l'accès aux propriétés de variables non définies. – zerkms

+0

oui, ça marche aussi bien. Je vais ajouter une capture d'écran en 2 minutes – Sebas

+0

ce serait bien, puisque pour mon exemple avec l'appel d'une fonction 'a()' non existante, elle ne donne rien de nouveau – zerkms

1

Plus d'un quelque chose à essayer réponse vraiment mais il pourrait aider.

Chrome a récemment ajouté chrome://inspect/ à la liste des URL pratiques (voir chrome://chrome-urls/ pour la liste complète). Je ne trouve pas le tweet ou le blog que j'ai lu à ce sujet malheureusement, mais je pense que c'était au cours du dernier mois. L'URL fonctionne sur Chrome 28 à coup sûr.

chrome://inspect/ liste tous les onglets ouverts avec un inspecter le lien qui redirige vers la page ouverte existante mais ouvre également DevTools.

Je pense que le test de sélénium pourrait ouvrir le site en cours de test dans un onglet et dans un second onglet ouvrir la inspectent page, suivez le lien inspect Retour à la page de test, mais cette fois avec DevTools ouvert, ce qui permet window.onerror pour capturer de meilleures erreurs.

Quelque chose comme:

document.getElementsByClassName('row')[n].getElementsByTagName('a')[0].click() 
+0

"et dans un deuxième onglet ouvrir la page d'inspection" --- je ne suis pas sûr, mais si cela pouvait - alors ce pourrait être une solution, merci :-) – zerkms

Questions connexes