preceptorjs/taxi

View on GitHub
examples/structure.js

Summary

Maintainability
A
1 hr
Test Coverage
var taxi = require('..');
var fs = require('fs');
var PNGImage = require('pngjs-image');

var loadStructure = require('../lib/scripts/structure').load;

var user = process.env.SAUCE_USERNAME;
var accessKey = process.env.SAUCE_ACCESS_KEY;

var sauceLabsUrl = "http://" + user + ":" + accessKey + "@ondemand.saucelabs.com/wd/hub";

var tests = [
    //{ url:'http://localhost:9515/', capabilities: { browserName:'chrome' }, beforeFn: function () { chromedriver.start(); }, afterFn: function () { chromedriver.stop() } },
    //
    //{ url:'http://localhost:9517/', capabilities: { browserName:'phantomjs', browserVersion:'1.9.8' } },
    { url:'http://localhost:4444/wd/hub', capabilities: { browserName:'firefox' } },
    //
    //{ url:'http://makingshaking.corp.ne1.yahoo.com:4444', capabilities: { browserName:'phantomjs', browserVersion: '2.0.0 dev' } },
    //
    //{ url:sauceLabsUrl, capabilities: { browserName:'chrome', version:'41.0', platform:'Windows 8.1' } },
    //
    //{ url:sauceLabsUrl, capabilities: { browserName:'firefox', version:'37.0', platform:'Windows 8.1' } },
    //
    //{ url:sauceLabsUrl, capabilities: { browserName:'internet explorer', version:'11.0', platform:'Windows 8.1' } },
    //{ url:sauceLabsUrl, capabilities: { browserName:'internet explorer', version:'10.0', platform:'Windows 8' } },
    //{ url:sauceLabsUrl, capabilities: { browserName:'internet explorer', version:'9.0', platform:'Windows 7' } },
    //
    //{ url:sauceLabsUrl, capabilities: { browserName:'safari', version:'5.1', platform:'Windows 7' } },
    //{ url:sauceLabsUrl, capabilities: { browserName:'safari', version:'8.0', platform:'OS X 10.10' } },
    //
    //{ url:sauceLabsUrl, capabilities: { browserName:'iphone', version:'8.2', platform: 'OS X 10.10', deviceName:'iPad Simulator', "device-orientation":'portrait' } },
    //{ url:sauceLabsUrl, capabilities: { browserName:'iphone', version:'8.2', platform: 'OS X 10.10', deviceName:'iPad Simulator', "device-orientation":'landscape' } },
    //{ url:sauceLabsUrl, capabilities: { browserName:'iphone', version:'8.2', platform: 'OS X 10.10', deviceName:'iPhone Simulator', "device-orientation":'portrait' } },
    //{ url:sauceLabsUrl, capabilities: { browserName:'iphone', version:'8.2', platform: 'OS X 10.10', deviceName:'iPhone Simulator', "device-orientation":'landscape' } }
];

tests.forEach(function (test) {

    // Do we need to run something before the test-run?
    if (test.beforeFn) {
        test.beforeFn();
    }

    try {
        var driver = taxi(test.url, test.capabilities, {mode: taxi.Driver.MODE_SYNC, debug: true, httpDebug: true});

        var browser = driver.browser();
        var activeWindow = browser.activeWindow();

        // Navigate to Yahoo
        activeWindow.navigator().setUrl('http://www.yahoo.com');

        var buffer = activeWindow.captureDocument();
        var image = PNGImage.loadImageSync(buffer);

        var structure = JSON.parse(activeWindow.execute(loadStructure));

        function drawNode (node, image) {
            if (node.width) {
                drawRect(image, node.x, node.y, node.width, node.height, {red: 255, green: 0, blue: 0});
            }
            for(var i = 0; i < node.nodes.length; i++) {
                drawNode(node.nodes[i], image);
            }
        }
        function drawRect (image, x, y, width, height, color) {

            var i,
                index;

            for (i = x; i < x + width; i++) {
                index = image.getIndex(i, y);
                image.setAtIndex(index, color);

                index = image.getIndex(i, y + height);
                image.setAtIndex(index, color);
            }

            for (i = y; i < y + height; i++) {
                index = image.getIndex(x, i);
                image.setAtIndex(index, color);

                index = image.getIndex(x + width, i);
                image.setAtIndex(index, color);
            }
        }
        drawNode(structure.dom, image);
        structure.dom = null;
        console.log(JSON.stringify(structure, null, 4));

        // Write screenshot to a file
        fs.writeFileSync(__dirname + '/structure.png', image.toBlobSync());
    } catch (err) {
        console.error(err.stack);

    } finally {

        driver.dispose();

        // Do we need to run something after the test-run?
        if (test.afterFn) {
            test.afterFn();
        }
    }
});