рдпрд╣рд╛рдВ рдЖрдк рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐ рдЙрддреНрдкрд╛рдж рдХреЗ рднреБрдЧрддрд╛рди рдХрд┐рдП рдЧрдП (рдорд╛рдирдХ) рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдХрдВрд╕реЛрд▓ рд╕реЗ Siesta рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рдП (рдЬрд┐рд╕рдХреА рдХреАрдордд $ 499 рд╣реИ)ред
рд╕рдорд╕реНрдпрд╛
рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐
рд╕рд┐рд╕реНрдЯрд╛ рдЯреВрд▓ рдХрд╛ рдореБрдлреНрдд (рд╣рд▓реНрдХрд╛) рд╕рдВрд╕реНрдХрд░рдг рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдФрд░ рдпрджрд┐ рдЖрдкрдХреЛ рдХрдВрд╕реЛрд▓ рд╕реЗ CI рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдорд╛рдирдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдХрдВрд╕реЛрд▓ рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рд╕рд╣рд┐рдд рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЙрдкрд╣рд╛рд░ рд╣реИрдВред рдЗрд╕ рдЙрдкрдХрд░рдг рдореЗрдВ рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬреНрдЮрд╛рдд рдореБрдХреНрдд
рдкреНрд░реЗрдд рдЗрдВрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдирд┐рд░реНрдгрдп
рдлреИрдВрдЯрдордЬ, рд╕рд┐рд╕реНрдЯрд╛ рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдФрд░ рдЬреИрд╕реНрдореАрди рдФрд░ рдХреНрд╡рдиреАрдЯ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкреИрд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХреЛрдб рд▓рд┐рдЦреЗред
рдЯреВрд▓рдХрд┐рдЯ рдЕрд╡рд▓реЛрдХрди
рд╕рд┐рд╕реНрдЯрд╛ рдЙрдкрдХрд░рдг
рдПрдХреНрд╕рдЯреАрдЬреЗрдПрд╕ рдврд╛рдВрдЪреЗ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рдХреЛ рд╡рд┐рднрд┐рдиреНрди рд▓реЛрдХрдкреНрд░рд┐рдп рд░реВрдкрд░реЗрдЦрд╛рдУрдВ рдЬреИрд╕реЗ рдХрд┐ рдПрдХреНрд╕рдЯреАрдЬреЗрдПрд╕, рдЬреЗрд╡рд╛рдИрдХреЗ, рдбреЛрдЬреЛ, рдЖрджрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкрд░реАрдХреНрд╖рдг рдХреЛ рдореЙрдбреНрдпреВрд▓рд░ рдФрд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рджреЛрдиреЛрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдкреВрд░реА рдирдХрд▓ рддрдХред
PhantomJS рдЯреВрд▓
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдВрд╕реЛрд▓ рд╕реЗ рд╡реЗрдм рдкреЗрдЬ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ WebKit рдЗрдВрдЬрди рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдЗрдВрдЯрд░рдиреЗрдЯ рдХреЗ рд░реВрд╕реА рднрд╛рд╖рд╛ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╣реИрдмреЗ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред рд╕рд┐рд╕реНрдЯрд╛ рдЙрдкрдХрд░рдг рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬрд┐рд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЬрд╛рдирдХрд╛рд░реА "рдмрд┐рд▓реНрд▓реА рд░реЛрддреА рд╣реИ"ред
рджрд░рдЕрд╕рд▓, рдЗрд╕реАрд▓рд┐рдП рдореИрдВ рдпрд╣ рдкреЛрд╕реНрдЯ рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВред
рдЖрд╡рд╢реНрдпрдХ рд╢рд░реНрддреЗрдВ
- рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ Siesta рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдпрд╣рд╛рдБ )ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдПрдВрдЧреЗ
localhost/tests/index.html
- рдЖрдкрдиреЗ PhantomJS рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ (рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдпрд╣рд╛рдБ )
рдЖрд╡рд╢реНрдпрдХ рдХреЛрдб
рдореИрдВрдиреЗ рдлреЗрд╕реНрдЯреЙрдордЬреЗрдПрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдзрд╛рд╡рдХ- siesta.js рд╕реНрдХреНрд░рд┐рдкреНрдЯ
рд░рдирд░ рд▓рд┐рдЦрд╛ рдерд╛ рдЬреЛ рд╕рд┐рд╕реНрдЯрд╛ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛ рд░рд╣рд╛ рдерд╛ред
рдХреЛрдб рд░рди- siesta.js var start = new Date().getTime(), system = require('system'), page = require('webpage').create(); console.log('\nStart tests...\n'); var globalLog = (function() { var store = []; return { add: function(msg) { store.push(msg); }, console: function() { var log = ''; for (var i= 0; i < store.length; i++) { log += store[i] + '\n'; } console.log(log); } }; }()); if (system.args.length !== 2) { globalLog.add('Usage: phantomjs run-siesta.js URL'); myExit(1); } function myExit(exitCode) { globalLog.add('Total time: ' + (new Date().getTime() - start) + ' ms'); globalLog.add('Exit code: ' + exitCode); globalLog.console(); phantom.exit(exitCode); } page.onConsoleMessage = function(msg) { if (msg.match(/END_TESTS/)) { var exitCode = page.evaluate( function() { var totalPass = document.getElementsByClassName('total-pass')[0].innerText; var totalFail = document.getElementsByClassName('total-fail')[0].innerText; if (totalFail !== '0') { console.log('\nFailed!'); } else { console.log('\nCompleted!'); } console.log('\nTotal pass: ' + totalPass); console.log('Total fail: ' + totalFail); return totalFail === '0' ? 0 : 1; } ); myExit(exitCode); } else if (!msg.match(/\[object Object\]/)) { console.log(msg); } }; page.open(system.args[1], function(status) { if (status !== "success") { globalLog.add("Unable to access network"); myExit(1); } } );
рдпрд╣ рдХреЛрдб рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдПрдХ рдкреГрд╖реНрда рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП PhantomJS API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХрдВрд╕реЛрд▓ рдореЗрдВ index.html рдкреГрд╖реНрда рдкрд░ рдЙрддреНрдкрдиреНрди рд▓реЙрдЧ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ, index.html рдореЗрдВ index.js рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред
Index.js рдХрд╛ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдЖрдзрд┐рдХрд╛рд░рд┐рдХ Siesta рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рд╣реИред
рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
autoRun: true
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЬрдм PhantomJS рдкреГрд╖реНрда рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ, рддреЛ рдкрд░реАрдХреНрд╖рдг рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЪрд▓реЗрдВрдЧреЗред рдпрджрд┐ рдЖрдкрдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ "рдСрдЯреЛ рд▓реЙрдиреНрдЪ" рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЪрдпрди рдХрд░рдХреЗ рдкреГрд╖реНрда рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдиреВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдкреНрд░рддреНрдпреЗрдХ рдкрд╛рд╕ рдХрд┐рдП рдЧрдП рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрддрдЬреЗрдПрд╕ рдХреЗ рд▓рд┐рдП,
рд╕рд┐рд╕реНрдЯрд╛ рдШрдЯрдирд╛ -
рдЯреЗрд╕реНрдЯрдлрд┐рдирд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рд░ рдмрд╛рд░ рдЕрдЧрд▓реЗ рдкрд░реАрдХреНрд╖рдг рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдИрд╡реЗрдВрдЯ рдХреЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреЗрдЬ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдлрдВрд╕реЗ рд╣реБрдП рдЯреЗрд╕реНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ (рдЬреЛ рдХрд┐ PhantomJS, рдмрджрд▓реЗ рдореЗрдВ, рдкреЗрдЬ.рдиреЙрди рдХрдВрд╕реЛрд▓ рдХрдВрд╕реЛрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдард╛рддрд╛ рд╣реИ)ред
рд╕рднреА рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░
рдЯреЗрд╕реНрдЯрд╕реБрдЗрдЯреЗрдВрдб рдЗрд╡реЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛
рдЬрд╛рддрд╛ рд╣реИ ред рдЗрд╕ рдИрд╡реЗрдВрдЯ рдХрд╛ рд╣реИрдВрдбрд▓рд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХреЛрдб рдХрдВрд╕реЛрд▓ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ PhantomJS рдЬрд╛рдирддрд╛ рд╣реИред рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╡рд╣ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЛ рдкреВрд░рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкрд░рд┐рдгрд╛рдореА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рд╣реИрдВрдбрд▓рд░ рдХреЛрдб listeners: { testfinalize: function(event, test) { var fail = test.$failCount, pass = test.$passCount; var log = (fail ? '~~~~~~~~\n FAILED ' : '[PASSED] ') + test.url + ' [pass: ' + pass + ', fail: ' + fail + ']' + (fail ? '\n~~~~~~~~' : ''); console.log(log); }, testsuiteend: function(event, harness) { console.log('END_TESTS'); } }
рдпрджрд┐ рдЖрдк рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдм рдХреБрдЫ рдПрдХ рд╕рд╛рде рд░рдЦрддреЗ рд╣реИрдВред рд╕рд╛рдЗрдЯ Siesta, рддреЛ
index.js рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛
рдХреЛрдб index.js var Harness = Siesta.Harness.Browser.ExtJS; Harness.configure({ title : 'Awesome Test Suite',
рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░, рд░рди- siesta.js рдкрд╛рд╕ рдХрд┐рдП рдЧрдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдкреГрд╖реНрда рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИ, рдХреБрд▓ рдмреАрддрд╛ рд╣реБрдЖ рд╕рдордп рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реА рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдХрдВрд╕реЛрд▓ (0 - рд╕рдлрд▓рддрд╛, 1 - рддреНрд░реБрдЯрд┐) рдкрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬреЛ CI рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
рдпрд╣ рд╕рдм рдХреИрд╕реЗ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рджрд┐рдЦрддрд╛ рд╣реИ рдЗрд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг
рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдпрд╣ рдХрд░реЗрдВ
рдпрджрд┐ рд╡рд╣ рдХрднреА рднреА END_TESTS рд╕рдорд╛рдкреНрддрд┐ рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЯрд╛рдЗрдордЖрдЙрдЯ рджреНрд╡рд╛рд░рд╛ рдлреИрдВрдЯрдордЬрд╕ рд╢рдЯрдбрд╛рдЙрди рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдкрд░рд┐рдгрд╛рдо
$ 499 рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдзрд╛рд░рдг рдХреЛрдб рд╡рд╛рд▓реА рдХреЗрд╡рд▓ рджреЛ рдЫреЛрдЯреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд▓рд┐рдпрд╛ред
рд▓рд╛рдн?