2017-10-02 2 views
3

Je suis nouveau à Protractor et j'essaie d'exécuter mon script.Protractor - ScriptTimeoutError: timeout du script asynchrone: le résultat n'a pas été reçu en 20 secondes

describe('Navigator homepage', function() { 
it('should proceed to login', function() { 
browser.get('url'); 
}) 
it('Clicks the proceed button',function() { 
const proceedButton = element(by.id('auth-login-page-button')); 

proceedButton.click(); 
}); 
}); 

Mais chaque fois que je le lance le navigateur ouvre et le produit sur le site, puis attend 20 sec et j'obtiens l'erreur: ScriptTimeoutError: asynchronous script timeout: result was not received in 20 seconds. L'élément est clairement là et peut être cliqué, mais pas pour le rapporteur. Est-ce que je fais quelque chose de mal? fichier de configuration ressemble à ceci:

// An example configuration file. 
exports.config = { 
    directConnect: true, 

    // Capabilities to be passed to the webdriver instance. 
    capabilities: { 
    'browserName': 'chrome' 
    }, 

    // Framework to use. Jasmine is recommended. 
    framework: 'jasmine', 

    // Spec patterns are relative to the current working directory when 
    // protractor is called. 
    specs: ['login_spec.js'], 

    allScriptsTimeout: 20000, 
    getPageTimeout: 15000, 
    framework: 'jasmine', 
    jasmineNodeOpts: { 
    isVerbose: false, 
    showColors: true, 
    includeStackTrace: false, 
    defaultTimeoutInterval: 40000 
    } 
    }; 

Répondre

4

Compte tenu de votre AJOUTÉE message d'erreur (voir le commentaire), la cause semble un sondage $timeout, qui laisse en permanence une promesse non résolue à durée indéterminée et conduit donc à un délai d'attente asynchrone de protractor (see details here).

solution

La bonne solution est d'éviter l'utilisation de $timeout et utiliser $interval à la place. De cette façon, le rapporteur peut rester en charge de ControlFlow, gérant vos tâches asynchrones. C'est donc un bug logiciel, pas une erreur de rapporteur.

votre message d'erreur:

Failed: Timed out waiting for asynchronous Angular tasks to finish after 20 seconds. This may be because the current page is not an Angular application. Please see the FAQ for more details: https://github.com/angular/protractor/blob/master/docs/timeo‌​uts.md#waiting-for-a‌​ngular While waiting for element with locator - Locator: By(css selector, md-raised md-primary md-button md-ink-ripple). *The following tasks were pending: - $timeout: function(){return _this.getVersion()}*

Solution

Le pas si belle solution de contournement est de désactiver la partie waitForAngular de Protractor en mettant browser.waitForAngularEnabled(false); (soit dans un beforeeach ou directement dans la spécification

Cependant, cela signifie également, en prenant manuellement soin du controlFlow dans les spécifications de test lui-même. Cela nécessite d'utiliser beaucoup de .then() et ExpectedConditions, en perdant l'un des principaux avantages de Protractor.

possibilités de débogage

Vérifiez les descriptions here for potential causes and workarounds. Spécifiquement, essayez aussi browser.waitForAngularEnabled(false); pour exclure les problèmes de protractor angulaire.

Si vous ne pouvez pas trouver la cause, cela pourrait être un problème de synchronisation (peu probable, mais qui mérite d'être examiné à ce moment-là).

Vous pouvez essayer d'ajouter log-messages pour restreindre l'ordre effectif d'exécution:

describe('Navigator homepage', function() { 
    it('should proceed to login', function() { 
    browser.get('url').then(function(){ 
     console.log("Page is fully loaded"); 
     }); 
    }); 
    it('Clicks the proceed button',function() { 
     console.log("Start 2nd Test"); 
     const proceedButton = element(by.id('auth-login-page-button')); 
     proceedButton.click(); 
    }); 
}); 

Ou vous mettez les actions dans le même cas de test, en utilisant then() de les exécuter de manière synchrone:

describe('Navigator homepage', function() { 
    it('should proceed to login', function() { 
    browser.get('url').then(function(){ 
     const proceedButton = element(by.id('auth-login-page-button')); 
     proceedButton.click(); 
    }); 
}); 

Ouvrir Page d'accueil au sein onPrepare

Comme un beau côté re mark: Si vous chargez toujours la page d'accueil, placez-la dans une partie onPrepare de votre conf.js et il sera toujours exécuté une fois avant vos tests commencent:

onPrepare: function() { 
    browser.driver.manage().window().maximize(); 
    browser.get('url'); 
}, 
+0

Merci, essayé toutes ces options, quand je mets 'waitForAngular = false' il me donne l'erreur' '' a échoué: Délai d'attente dépassé asynchrone angulaire tâches à terminer après 20 secondes. Cela peut être dû au fait que la page en cours n'est pas une application Angular. S'il vous plaît voir la FAQ pour plus de détails: https://github.com/angular/protractor/blob/master/docs/timeouts.md#waiting-for-angular En attendant l'élément avec locator - Locator: By (sélecteur css, md-raised md-primary md-bouton md-ink-ripple). Les tâches suivantes étaient en attente: - $ timeout: function() {return _this.getVersion()} '' ' – Qucu

+0

Il semble que votre réponse arrive dans votre message d'erreur: ' Les tâches suivantes étaient en attente: - $ timeout : function() {return _this.getVersion()} ' Il y a donc un ensemble $ timeout qui n'est pas résolu. Plus ici: https://github.com/angular/protractor/issues/169 et ici: https://github.com/angular/protractor/blob/master/docs/timeouts.md#angularjs Pourriez-vous (ou votre dev) remplacer '$ timeout' par' $ interval' sur la page que vous testez ... ou peut-être faire juste attention à ce que 'this.getVersion()' soit résolu? –

+0

oups ... J'ai vu que j'ai donné une entrée buggy pour 'waitForAngular'. Syntaxe correcte pour cela: 'browser.waitForAngularEnabled (false);' Je vais modifier ma réponse pour cela. –