5

Ich versuche, ein einfaches Formular mit Selenium, WebDriver.io & Node.js (mit Mocha) zu testen. So habe ich so etwas wie dieses:Selenium & webdriver.io Wie verwende ich executeScript?

var webdriverio = require('webdriverio'); 
var expect = require('expect'); 

describe('Test form', function(){ 
    beforeEach(function() { 
     browser.url('/'); 
    }); 

    it('should save object', function() { 
     expect(browser.executeScript('return window.data;')).to.be([]); 
    }); 

    afterEach(function() { 
     if (this.currentTest.state !== "passed") { 
      browser.saveScreenshot(); 
     } 
    }); 
}); 

Mein wdio.conf.js:

var selenium = require('selenium-standalone'); 
var seleniumServer; 

exports.config = { 
    host: '127.0.0.1', 
    port: 4444, 

    specs: [ 
     'test/*.spec.js' 
    ], 

    capabilities: [{ 
     browserName: 'chrome' 
    }], 

    baseUrl: 'http://localhost:8080', 
    framework: 'mocha', 

    mochaOpts: { 
     ui: 'bdd' 
    }, 

    onPrepare: function() { 
     return new Promise((resolve, reject) => { 
      selenium.start((err, process) => { 
       if(err) { 
        return reject(err); 
       } 
       seleniumServer = process; 
       resolve(process); 
      }) 
     }); 
    }, 

    onComplete: function() { 
     seleniumServer.kill(); 
    } 
}; 

Aber in der Konsole habe ich: browser.executeScript is not a function. Was ist der richtige Weg, um Skript im Browser-Kontext mit diesen Tools auszuführen?

Antwort

5

Okay, ich suchte in Quellen und finde /build/lib/protocol/execute.js. Beispiel von dort:

client.execute(function(a, b, c, d) { 
    // browser context - you may not access neither client nor console 
    return a + b + c + d; 
}, 1, 2, 3, 4).then(function(ret) { 
    // node.js context - client and console are available 
    console.log(ret.value); // outputs: 10 
}); 

Aber jetzt alle Befehle in WDIO synchron sind (proof issue). Also der richtige Weg für mich ist:

var data = browser.execute(function() { 
    return window.data; 
}); 

expect(data.value).to.be([]); 
/* note, here^is a property with value of execution */