2016-08-08 49 views
0

Das folgende Skript mocha und webdriadio übergibt Assertionen, bevor die Seite geladen wird.Mocha-Assertionen, die vor dem Laden der Seite übergeben wurden

Ich verstehe nicht, wie es alles passiert, wenn wahrscheinlich die Elemente selbst noch nicht vorhanden sind. Nach dem Laden der Seite konnte ich sehen, dass das Element nicht angeklickt wurde. Ist das ein gefälschter Pass? Wie behebe ich das im Code?

var webdriverio = require('webdriverio'); 
var should = require('chai').should() 
var expect = require('chai').expect() 
var options = { 
    desiredCapabilities: { 
     browserName: 'chrome' 
    } 
}; 

before(function() { 

    browser=webdriverio.remote(options) 
    return browser.init() 

    }); 


describe('sauce labs page test', function() { 
    it('should assert page title', function(done) { 




      browser.url('https://docs.saucelabs.com/reference/platforms-configurator/?_ga=1.5883444.608313.1428365147#/'); 
      browser.getTitle().then(function(title){ 
      title.should.equal('Platform Configurator'); 
      }); 
      done(); 
    }); 



    it('should assert sub heading', function(done) { 

    browser.getText('h3').then(function(text) { 
    text.should.equal('API'); 
    console.log(text); 
    }); 
    done(); 
}); 


    it('should click on selenium', function(done) { 

    browser.click('#main-content > div > ng-view > div > div:nth-child(1) > div.choice-buttons.choice-api > div:nth-child(2)') 


    done(); 
}); 


}); 

Antwort

2

Sie die done Rückruf innerhalb der .then() Handler aufrufen sollte, sonst wird es zuvor hat der Browser die Seite zu laden, eine Chance hatte, genannt:

it('should assert page title', function(done) { 
    browser.url('https://docs.saucelabs.com/reference/platforms-configurator/?_ga=1.5883444.608313.1428365147#/'); 
    browser.getTitle().then(function(title) { 
    title.should.equal('Platform Configurator'); 
    done(); 
    }); 
}); 

Dies führt jedoch ein anderes Problem: Wenn die Behauptung schlägt fehl, done wird niemals aufgerufen (weil die Ausnahme davor ausgelöst wird).

Stattdessen können Sie die Tatsache nutzen, dass Mocha eingebaute Versprechen unterstützt. Statt den done Rückruf von der Verwendung wieder ein Versprechen und Mokka wird es (und alle Ausnahmen) ordnungsgemäß behandeln:

it('should assert page title', function() { 
    browser.url('https://docs.saucelabs.com/reference/platforms-configurator/?_ga=1.5883444.608313.1428365147#/'); 
    return browser.getTitle().then(function(title) { 
    title.should.equal('Platform Configurator'); 
    }); 
}); 
+0

Ihnen danken. Das hat funktioniert. Ich werde Versprechungen verwenden, aber zu meinem Verständnis weiß doest 'done()', dass es warten muss, bis ein Element erscheint, auf dem 'browser.getTitle()' aufgerufen werden kann und schließlich 'title.should.equal ('Platform Configurator') 'kann aufgerufen werden, damit alles zusammenpasst. So viel von versteckten Teil, dass es schwer zu verstehen ist – user1207289

+1

Der Code, den Sie testen, ist asynchron, so wie mit jedem Async-Code müssen Sie warten, bis die asynchrone Aktion abgeschlossen ist, bevor Sie fortfahren können (durch Aufruf von 'done', die signalisiert Mocha, dass der Test durchgeführt wurde). Bei Versprechungen ist die asynchrone Aktion abgeschlossen, wenn der 'then/onFullfilled'-Callback aufgerufen wird (oder, falls Sie einen haben, der 'catch/onRejected'-Callback). – robertklep