рдПрдХреНрд╕реНрдЯрд╕ / рд╕реЗрдиреНрдЪрд╛ рдШрдЯрдХреЛрдВ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛

PhantomJS рдПрдХ рдЧреНрд░рд╛рдлрд┐рдХрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдмрд┐рдирд╛ WebKit рдЗрдВрдЬрди рдХрд╛ рдПрдХ рдирд┐рд░реНрдорд╛рдг рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдХрдВрд╕реЛрд▓ рдореЛрдб рдореЗрдВ рдПрдХ рд╡реЗрдм рдкреЗрдЬ рд▓реЛрдб рдХрд░рдиреЗ, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдФрд░ рдбреЛрдо, рдХреИрдирд╡рд╕ рдФрд░ рдПрд╕рд╡реАрдЬреА рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред PhantomJS рдХреЗ рдореБрдЦреНрдп рджрд╛рд╡рд╛ рдХрд┐рдП рдЧрдП рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкрд░реАрдХреНрд╖рдг рд╣реИред PhantomJS рдХрд╛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рд╡реЗрдм рдкреГрд╖реНрдареЛрдВ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд░реВрдкрд░реЗрдЦрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рд╣реИред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдПрдХ рдЕрд▓рдЧ рдШрдЯрдХ рдФрд░ ExtJS / Sencha рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдПрдХ рд╕рдВрдкреВрд░реНрдг рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ PhantomJS рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдПрдХ рддреГрддреАрдп-рдкрдХреНрд╖ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рджрд░реНрд╢рд╛рдиреЗ рд╡рд╛рд▓реЗ рдкрд░реАрдХреНрд╖рдг рдврд╛рдВрдЪреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рд░рд▓ рддреИрдпрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░реВрдВрдЧрд╛ред рд▓реЗрдЦ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рд╕рднреА рдХреЛрдб GitHub рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ ред



рдШрдЯрдХ рдкрд░реАрдХреНрд╖рдг



рдорд╛рдирдХ Ext.form.ComboBox рдбреНрд░реЙрдк-рдбрд╛рдЙрди рд╕реВрдЪреА рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдШрдЯрдХ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЗрд╕рдореЗрдВ рдорд╣реАрдиреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдорд╣реАрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдиреБрдХреВрд▓рди - рдПрдХ рд╕рд░рдгреА рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдорд╣реАрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╢реВрдиреНрдп рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╕рд░рдгреА рдореЗрдВ рд╕рдВрдЦреНрдпрд╛ 1, 3 рдФрд░ 5 рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рддреЛ рдбреНрд░реЙрдк-рдбрд╛рдЙрди рд╕реВрдЪреА рдХреЛ рдлрд░рд╡рд░реА, рдЕрдкреНрд░реИрд▓ рдФрд░ рдЬреВрди рдХреЗ рдорд╣реАрдиреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

Ext.define('MonthComboBox', { extend : 'Ext.form.ComboBox', alias : 'widget.monthcombo', store : Ext.create('Ext.data.Store', { fields : [ 'num', 'name' ] }), queryMode : 'local', displayField: 'name', valueField : 'num', allMonths : ['', '', '', '', '', '', '', '', '', '', '', '' ], months: [], initComponent: function() { /** *     ,      {@link MonthComboBox#months} */ for (var i = 0; i < this.months.length; i++) { this.store.add({ num : this.months[i], name: this.allMonths[this.months[i]] }); } this.callParent(arguments); } }); 


HTML рдкреЗрдЬ ExtjsTesterPage.html рдмрдирд╛рдПрдВ, рдЬрд┐рд╕рдХреЗ рднреАрддрд░ рдШрдЯрдХ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдХрд┐рд╕реА рдкреГрд╖реНрда рдореЗрдВ рдПрдХреНрд╕рдЯреАрдЬреЗрдПрд╕ рд╢реИрд▓рд┐рдпреЛрдВ рдФрд░ рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо ext-all.css рдФрд░ ext-all.js рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЖрдпрд╛рдд рдХрд░реЗрдВред рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХреНрд╕рдЯреАрдЬреЗрдПрд╕ 4.0.2 рдП рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕реЗ рдХреИрд╢реЗрдлрд▓реА рдкрд░ рд╣реЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

 <!DOCTYPE html> <html> <head> <title>ExtJS Test Page</title> <link rel="stylesheet" type="text/css" href="http://extjs.cachefly.net/ext-4.0.2a/resources/css/ext-all.css"> <script type="text/javascript" src="http://extjs.cachefly.net/ext-4.0.2a/ext-all.js"></script> </head> <body></body> </html> 


рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдирдореВрдирд╛ рдврд╛рдВрдЪрд╛ рддреИрдпрд╛рд░ рдХрд░реЗрдВред рдпрд╣ рдлрд╝рд╛рдЗрд▓ ExtjsTester.js рд╣реИ, рдЬрд┐рд╕реЗ PhantomJS рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдирд╛рдо рд▓рд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣рдордиреЗ рдПрдХ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рддрд░реНрдХ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪреЗрдХ рд▓рдЧрд╛рдпрд╛:

 if (phantom.args.length == 0) { console.log('      '); phantom.exit(1); } 

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдлреИрдВрдЯрдордЬрд╕ рдПрдкреАрдЖрдИ рдХреЗ рджреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рддрддреНрд╡реЛрдВ рдХреЛ рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдкрд╛рд╕рд┐рдВрдЧ рдкреИрд░рд╛рдореАрдЯрд░: phantom.args рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЖрд░реНрдЧреНрдпреБрдореЗрдВрдЯреНрд╕ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИред рджреВрд╕рд░рд╛ API рддрддреНрд╡ phantom.exit () рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рд╣реИ, рдЬреЛ PhantomJS рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рддреНрд░реБрдЯрд┐ рдХреЛрдб рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред

рд╣рдо рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдПрдлрдПрд╕ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХрд╛рдлреА рд╡реНрдпрд╛рдкрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИ, рдпрд╣ рдЖрдкрдХреЛ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ, рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
 var fs = require('fs'); 


рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдореМрдЬреВрджрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрдирдХреЗ рд╕рд╛рде рдлреИрдВрдЯрдордЬреЗрдПрд╕ рдХрд╛ рдПрдХреАрдХрд░рдг рд╣реИред рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдПрдХ рдорд╛рдирдХ рд╡рд░реНрдЧ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВ:
 function AssertionError(message) { this.message = message; } AssertionError.prototype.toString = function() { return 'AssertionError: ' + this.message; }; 


рдЕрдм рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рдорд╛рдирдХ PhantomJS рд╡рд░реНрдЧ - рд╡реЗрдмрдкреЗрдЬ рдкрд░ рдПрдХ рдЖрд╡рд░рдг рдмрдирд╛рдПрдВрдЧреЗред

 function TestPage(scriptUnderTest, testFun) { //      if (!fs.exists(scriptUnderTest)) { console.log("File " + scriptUnderTest + " not found"); phantom.exit(1); } var me = this; //   this.page = require('webpage').create(); //           this.page.onConsoleMessage = function (msg) { console.log(msg); }; //    this.page.open("ExtjsTesterPage.html", function() { //    me.page.injectJs(scriptUnderTest); //   ExtJS     me.waitForExtReady(function() { me.doTest(testFun); }); }); } 


рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдкреИрд░рд╛рдореАрдЯрд░ scriptUnderTest рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рд╣реИ рдЬрд┐рд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, ExtJS рдШрдЯрдХ рдХреЗ рдХреЛрдб рдХреЗ рд╕рд╛рдеред рдкрд╣рд▓реЗ рд╕реЗ рдЖрдпрд╛рддрд┐рдд fs рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ WebPage # рдЗрдВрдЬреЗрдХреНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдЗрд╕реЗ рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдкреГрд╖реНрда рдореЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдмрдирд╛рдИ рдЧрдИ ExtjsTesterPage.html рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рд╣реИред

рдпрд╣ WebPage # onConsoleMessage рдкрджреНрдзрддрд┐ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкреГрд╖реНрда рдкрд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯ рдЦреЛ рдЬрд╛рдПрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдкреГрд╖реНрда рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИред

TestFun рдкреИрд░рд╛рдореАрдЯрд░ рд╣рдорд╛рд░реЗ рднрд╡рд┐рд╖реНрдп рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдп рд╣реИред рдПрдХреНрд╕рдЯреАрдЬреЗрдПрд╕ рдШрдЯрдХ рдХреЗ рд╕рд╣реА рдкрд░реАрдХреНрд╖рдг рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХреНрд╕рдЯреАрдЬреЗрдПрд╕ рд░реВрдкрд░реЗрдЦрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рднрд░реА рд╣реБрдИ рд╣реИ рдФрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╣реИред Ext.onReady () рд╡рд┐рдзрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рддрдереНрдп рд╕реЗ рдмрд╛рдзрд┐рдд рд╣реИ рдХрд┐ рдкреГрд╖реНрда рдХреЛ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдкреГрд╖реНрда рдХреЗ рдЕрдВрджрд░ рдХрд┐рд╕реА рднреА рдХреЛрдб рдХрд╛ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХреЗрд╡рд▓ рд╡реЗрдмрдкреЗрдЬ рдХреЗ рдореВрд▓реНрдпрд╛рдВрдХрди рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрднрд╡ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо TestPage рд╡рд░реНрдЧ рдХреЛ рдПрдХ рд╡рд┐рдзрд┐ рдкреНрд░рджрд╛рди рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдПрдХреНрд╕рдЯрдЬреЗрдПрд╕ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИ:

 TestPage.prototype.waitForExtReady = function(fun) { var me = this; console.log(' ExtJS...'); var readyChecker = window.setInterval(function() { var isReady = me.page.evaluate(function() { return Ext.isReady; }); if (isReady) { console.log('ExtJS .'); window.clearInterval(readyChecker); fun.call(me); } }, 100); }; 


рдЬрдм ExtJS рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд▓реЛрдб рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ doTest рд╡рд┐рдзрд┐ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧреА:

 TestPage.prototype.doTest = function(testFun) { try { //    testFun.call(this); phantom.exit(0); } catch (e) { console.log(e); phantom.exit(1); } }; 


рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХреЙрд▓ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд░рд┐рдЯрд░реНрди рдХреЛрдб рдХреЗ рд╕рд╛рде PhantomJS рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред

рдЕрдВрдд рдореЗрдВ, рдкреГрд╖реНрда рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреЛрдб рдбрд╛рд▓рдиреЗ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЗрд╕реНрдЯрдкреЗрдЬ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдХрдИ рд╕рдореНрдореЗрд▓рдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВ:

 TestPage.prototype.evaluate = function(fun) { return this.page.evaluate(fun); }; TestPage.prototype.assert = function assert(test, message) { if (!test) { throw new AssertionError(message); } }; TestPage.prototype.evaluateAndAssertEquals = function(expectedValue, actualFun, message) { this.assert(expectedValue === this.evaluate(actualFun), message); }; 


рдореВрд▓реНрдпрд╛рдВрдХрди рд╡рд┐рдзрд┐ рд▓рд┐рдкрдЯреЗ WebPage рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рд╕рдорд╛рд░реЛрд╣ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ Assert рд╡рд┐рдзрд┐ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдирд┐рджрд╛рди рдХрдерди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреА рд╣реИред рдореВрд▓реНрдпрд╛рдВрдХрдирдПрдВрдбрдПрд╕реЗрд░реНрд╕рдПрдХреНрд╡рд╛рд▓реНрд╕ рд╡рд┐рдзрд┐ рдкреГрд╖реНрда рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рддреА рд╣реИред

ExtjsTester рдлрд╝рд╛рдЗрд▓ рдХреА рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рдкрд░реАрдХреНрд╖рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд▓реЛрдб рдХрд░ рд░рд╣реА рд╣реЛрдЧреА, рдЬрд┐рд╕реЗ рд╣рдо рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗ рдЧреБрдЬрд░реЗрдВрдЧреЗред рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ - рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ eval рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:

 eval(fs.read(phantom.args[0])); 


рдФрд░ рдпрд╣рд╛рдБ рдкрд░реАрдХреНрд╖рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реА рд╣реИ - MonthComboBoxTest.js рдлрд╝рд╛рдЗрд▓:
 new TestPage("MonthComboBox.js", function() { //   MonthComboBox      this.evaluate(function() { Ext.widget('monthcombo', { months : [1, 2, 5], renderTo: Ext.getBody() }); }); // ,        this.evaluateAndAssertEquals(3, function() { return Ext.ComponentQuery.query('monthcombo')[0].store.getCount(); }, "Wrong element count"); }); 


рдпрд╣рд╛рдВ рд╣рдо рдЕрдкрдирд╛ рдЯреЗрд╕реНрдЯрдкреЗрдЬ рд░реИрдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рддрд╣рдд рдШрдЯрдХ рдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдореЗрдВ, рд╣рдо рдкрд╣рд▓реЗ рдРрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд╛рд▓реЗ рдкреГрд╖реНрда рдкрд░ рдПрдХ рдШрдЯрдХ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рддреАрди рдорд╣реАрдиреЗ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рд╣рдорд╛рд░реА рдпреЛрдЬрдирд╛ рд╕рд╣реА рд╣реИ, рдШрдЯрдХ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреГрд╖реНрда рдкрд░ рдореМрдЬреВрдж рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рднрдВрдбрд╛рд░рдг рдореЗрдВ рдареАрдХ рддреАрди рддрддреНрд╡ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

phantomjs ExtjsTester.js MonthComboBoxTest.js


рдЖрд╡реЗрджрди рдкрд░реАрдХреНрд╖рдг



рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрд╡реЗрджрди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдврд╛рдВрдЪреЗ рдХреЛ рдереЛрдбрд╝рд╛ рдкрд░рд┐рд╖реНрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдкреГрд╖реНрда рдкрд░ рд╡реНрдпреВрдкреЛрд░реНрдЯ рдШрдЯрдХ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рд╣реИред TestPage рд╡рд░реНрдЧ рдореЗрдВ рдирд┐рдореНрди рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ, рдЖрдо рддреМрд░ рдкрд░ TestPage # WaitForExtReady рд╡рд┐рдзрд┐ рдХреЗ рд╕рдорд╛рди:

 TestPage.prototype.waitForViewport = function(fun) { var me = this; console.log('  Viewport...'); var launchedChecker = window.setInterval(function() { var isLaunched = me.page.evaluate(function() { return typeof Ext.ComponentQuery.query('viewport')[0] !== 'undefined'; }); if (isLaunched) { console.log('Viewport .'); window.clearInterval(launchedChecker); fun.call(me); } }, 100); }; 


рд╣рдо TestPage рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП waForViewport рдкреИрд░рд╛рдореАрдЯрд░ рднреА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдорд╛рди рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╡реНрдпреВрдкреЛрд░реНрдЯ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╣рдо рдЙрд╕ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:
 me.waitForExtReady(function() { if (waitForViewport) { me.waitForViewport(function() { me.doTest(testFun); }) } else { me.doTest(testFun); } }); 


рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдХреЗ рддрд╣рдд рдЖрд╡реЗрджрди рдХреЗ рд╕рднреА рдХреЛрдб рдпрд╣рд╛рдВ рдирд╣реАрдВ рджреВрдВрдЧрд╛ - рдЖрдк рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рд╕рдордЭрд╛рдКрдВрдЧрд╛ рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдХ рдмрдЯрди рдФрд░ рдПрдХ рд╡рд┐рдВрдбреЛ рдХреЗ рд╕рд╛рде рдПрдХ рдореБрдЦреНрдп рд░реВрдк рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдореБрдЦреНрдп рд░реВрдк рдФрд░ рдЦрд┐рдбрд╝рдХреА рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкрд░реЛрд╕рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ-рд╕реНрддрд░реАрдп рд╕рдВрджреЗрд╢реЛрдВ (Ext.app.Application # fireEvent) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рд╣реИ рдХрд┐ рдЬрдм рдПрдХ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкреЙрдкрдЕрдк рд╡рд┐рдВрдбреЛ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ:

 new TestPage("app.js", function() { //     this.evaluate(function() { Ext.ComponentQuery.query('mainform > button[action=popup]')[0].btnEl.dom.click(); }); // ,      this.evaluateAndAssertTrue(function() { return typeof Ext.ComponentQuery.query('popupwindow')[0] !== 'undefined'; }, "Popup window not opened"); }, true); 


рдШрдЯрдХ рдЕрдиреБрд░реЛрдз 'рдореЗрдирдлреЙрд░реНрдо> рдмрдЯрди [рдПрдХреНрд╢рди = рдкреЙрдкрдЕрдк]' рдПрдкреНрд▓реАрдХреЗрд╢рди рдХреЗ рдореБрдЦреНрдп рд░реВрдк рдХреЗ рдмрдЯрди рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдХреНрд╡реЗрд░реА 'рдкреЙрдкрдЕрдкрд╡рд┐рдВрдбреЛ' рдПрдХ рдкреЙрдкрдЕрдк рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред рдЯреЗрд╕реНрдЯрдкреЗрдЬ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ (рдЯреНрд░реВ) рдХреЗ рддреАрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЯреЗрд╕реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╡реНрдпреВрдкреЛрд░реНрдЯ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдкрд░реАрдХреНрд╖рдг рд╕рдорд╛рд░реЛрд╣ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ:
phantomjs ExtjsTester.js AppTest.js


рдпрд╣ рд▓реЗрдЦ рдлреИрдВрдЯрдордЬреЗрдПрд╕ рдЗрдВрдЬрди рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХреНрд╕рдЯреАрдЬреЗрдПрд╕ / рд╕реЗрдиреНрдЪрд╛ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдШрдЯрдХреЛрдВ рдФрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдврд╛рдВрдЪреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрдорд╛рдирд┐рдд рд░рд┐рдХреНрдд рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЕрдиреНрдп рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдпрд╣ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкрд░реАрдХреНрд╖рдг WebKit рдЗрдВрдЬрди рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рддрдХ рд╕реАрдорд┐рдд рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдзреБрдирд┐рдХ рд╡реЗрдм рдорд╛рдирдХреЛрдВ рдХреЗ рд╕рд╛рде рдЗрд╕ рдЗрдВрдЬрди рдХреЗ рдЙрдЪреНрдЪ рдЕрдиреБрдкрд╛рд▓рди рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд╕рд╛рде рд╣реА рд╕рд╛рде рдПрдмреНрд╕рдЯреНрд░реИрдХреНрд╢рди рдФрд░ рдХреНрд░реЙрд╕-рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдПрдХреНрд╕рдЯреАрдЬреЗрдПрд╕ (рд╕реЗрдиреНрдЪрд╛) рдХрд╛ рдПрдХ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╕реНрддрд░, рд╣рдо рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрд╡реЗрджрди рдХреЗ рддрд░реНрдХ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдпрд╛ рдШрдЯрдХ рдлреИрдВрдЯрдо рдЬреЗрдПрд╕ рдХреЗ рдХрд╛рдордХрд╛рдЬ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдкрд░реАрдХреНрд╖рдг рдШрдЯрдХ рдФрд░ рдЖрд╡реЗрджрди рдХрд╛ рдХреЛрдб, рд╕рд╛рде рд╣реА рд▓реЗрдЦ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдкрд░реАрдХреНрд╖рдг рд░реВрдкрд░реЗрдЦрд╛, GitHub рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ ред

Source: https://habr.com/ru/post/In141165/


All Articles