рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЧреЗрдм
рдмрддрд╛ рджреЗрдВ, рдореБрдЭреЗ рдкреНрдпрд╛рд░ рд╣реИ рдЬрдм рд░реЛрдмреЛрдЯ рдореЗрд░реЗ рд▓рд┐рдП рд╣рд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рд▓рд┐рдкрд┐рдпреЛрдВ, рдирд┐рд░реАрдХреНрд╖рдгреЛрдВ, рд╡рд░реНрддрдиреА рдЬрд╛рдВрдЪрдХреЛрдВ рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╕рдордЭрддрд╛ рд╣реВрдВред рд╡реИрд╕реЗ, рдЖрдкрдХреЛ рдпрд╣ рдкрд░реАрдХреНрд╖рд╛ рдХреИрд╕реА рд▓рдЧреА:
Browser.drive(driver: new InternetExplorerDriver()) { go "http://www.google.com" $('form', action:endsWith('/search')).q = ' geb spock' $('button', value:'').click() waitFor { $('#search') } assert $('#search').size() == 1 assert $('#search').find('li.g a.l').size() > 0 println " : " + $('#res').find('li.g a.l', 0).text() }.quit()
рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдХреА рдкрдардиреАрдпрддрд╛ рд╣реИ - рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рднрд╛рд╖рд╛ рдореЗрдВ рд╣реИред рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдХреБрдЫ рдФрд░ рд╕рдорд╛рди рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдЧреЗрдм, рдЧреНрд░реВрд╡реА рдФрд░ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рдкреВрд░реА рд╕рдордЭ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдореВрд▓ рдмрд╛рддреЛрдВ рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЦреБрджрд╛рдИ рдХрд░реЗрдВред
рдЧреЗрдм рдФрд░ рд╕реЗрд▓реЗрдирд┐рдпрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдЗрди рджрд┐рдиреЛрдВ
рд╕реЗрд▓реЗрдирд┐рдпрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд┐рд╕рдиреЗ рдирд╣реАрдВ рд╕реБрдирд╛ рд╣реИ? рд╕рдВрднрд╡рдд: рдЬрд┐рд╕рдиреЗ рдмрд╛рд░реВрдж рдХреЛ рд╕реВрдБрдШрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЕрдм рднреА рд╕реЛрдЪрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдорд╛рди рд╣реИрдВред рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдмрд╛рдд рдирд╣реАрдВ рдХрд░рддрд╛, рдмрд╕ рдкрддрд╛ рд╣реИ:
- рд╕реЗрд▓реЗрдирд┐рдпрдо рдЖрдкрдХреЛ рд╕реАрдзреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧреНрд▓рд┐рдЪ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИред
- рдЖрдк рдпрд╣ рд╕рдм рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдкрд╛рда, рд╕реНрдХреНрд░реЙрд▓, рдорд╛рдЙрд╕ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ, рдЖрджрд┐ред рдЙрд╕реА рд╕рдордп, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдкреГрд╖реНрда рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдзреНрдпрд╛рдирдкреВрд░реНрд╡рдХ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░реЗрдВред
рдпрд╣ рд╕рдм рдЗрддрдирд╛ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдХреНрдпреЛрдВ рд╣реИ? рдЖрдзреБрдирд┐рдХ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб, рд╡рд┐рд╢реЗрд╖ рдкреНрд░рднрд╛рд╡, рдПрдиреАрдореЗрд╢рди, AJAX рдФрд░ рдЕрдиреНрдп рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рдПрдХ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░рд╛рд╢рд┐ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░,
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдмрд┐рдирд╛ рдЧреБрдгрд╡рддреНрддрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдХрд░рдг рдирд╣реАрдВ рд╣реИрдВред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕реЗрд▓реЗрдирд┐рдпрдо рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдХреЗ рд▓рд┐рдП рдпрдерд╛рд╕рдВрднрд╡ рдХрд░реАрдм рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдг рд░реЛрдмреЛрдЯ рд╣реИред (рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд░реВрдк рд╕реЗ, рдЖрдк рддрд░реНрдХрд╕рдВрдЧрдд рд░реЛрдмреЛрдЯ рдХреЛ рднреА рдпрд╛рдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдЗрдВрдЯрд░рдиреЗрдЯ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ рджреНрд╡рд╛рд░рд╛ рддреЗрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдкреГрд╖реНрда рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓реНрдк рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рдереАрдВред)
рд╕реЗрд▓реЗрдирд┐рдпрдо рд╣реА рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:
- рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдкрд░реАрдХреНрд╖рдг рд╕реАрдзреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЪрд▓рддреЗ рд╣реИрдВ рдФрд░ рд▓реЛрдб рдХрд┐рдП рдЧрдП рд╡реЗрдм рдкреЗрдЬ рддрдХ рд╕реАрдзреА рдкрд╣реБрдВрдЪ рд░рдЦрддреЗ рд╣реИрдВ, рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рднреА рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреЛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
- рдкреНрд░рдмрдВрдзрди рд╕рд░реНрд╡рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдПрдХ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рднрд╛рд╖рд╛ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдХреЛрдб рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдпрдХреНрд░рдо - рд╡реЗрдмрдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ - рдЬреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдХрдорд╛рдВрдб рднреЗрдЬрддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдкреЗрдЬ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рд╣рд░ рдХреЛрдИ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ - рд╡реЗрдмрдбреНрд░рд╛рдЗрд╡рд░ - рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реЛ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ, рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рднреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдорд╢реАрди рдкрд░ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рддреЛ,
рдЧреЗрдм рд╡реЗрдмрдбреНрд░рд╛рдЗрд╡рд░ рдФрд░ рдЧреНрд░реВрд╡реА рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рдЕрдиреНрдп рдкрд░реАрдХреНрд╖рдг рд▓реЗрдЦрдХ рд╣реИред рдЖрдк рдирд┐рдореНрди рдЬрд╛рджреБрдИ рд╢рдмреНрджреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЧреНрд░реВрд╡реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЕрдВрджрд░ рдЧреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
@Grab(group='org.codehaus.geb', module='geb-core', version='0.6.2') @Grab(group='org.seleniumhq.selenium', module='selenium-api', version='2.14.0') @Grab(group='org.seleniumhq.selenium', module='selenium-firefox-driver', version='2.19.0') @Grab(group='org.seleniumhq.selenium', module='selenium-ie-driver', version='2.19.0') import geb.Browser import org.openqa.selenium.firefox.FirefoxDriver ...
рдЧреЗрдм рднрд╛рд╖рд╛
рдЧреНрд░реВрд╡реА (рд╕рд╛рде рд╣реА рд╕рднреА рдЧрддрд┐рд╢реАрд▓ рднрд╛рд╖рд╛рдУрдВ) рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП - рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд╣рдЪрд╛рдирдиреЗ рдпреЛрдЧреНрдп рднрд╛рд╖рд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЧреЗрдм рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдирд┐рдпрдВрддреНрд░рдг рднрд╛рд╖рд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЖрдк рд╡рд╣ рд╕рдм рдХреБрдЫ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдорд╛рдирд╡ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ:
- URL рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ
- рдлреЙрд░реНрдо рднрд░реЗрдВ
- рдореВрд╡ рдХрд░реЗрдВ
- рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
- рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреЙрдкрдЕрдк-рд╡рд┐рдВрдбреЛ рдФрд░ рдлрд╝реНрд░реЗрдо рдХреЗ рд╕рд╛рде рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдХрд░реЗрдВред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
Browser.drive { go "http://www.gramant.ru" $('.block .caption', text: 'Grails') .closest('.block') .find('a', text: startsWith('')) .click() assert $('title', text:'Grails | Gramant').size() == 1 }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЧреЗрдм рдЖрдкрдХреЛ рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ jQuery рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛)ред рдпрд╣ рдкреГрд╖реНрда рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рддрддреНрд╡реЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
рдХреНрд▓рд┐рдХ () рд╡рд┐рдзрд┐ рдЖрдкрдХреЛ DOM рддрддреНрд╡реЛрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдСрдкрд░реЗрд╢рди
<< - рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдкрд╛рда рднреЗрдЬрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реА рддрд░рд╣ред
рдпрд╣ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рд╕рдЪ рд╣реИ, рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдЕрднреА рднреА рдПрдХ рдкреГрд╖реНрда рдкрд░ рдЬрд╛рдирдХрд╛рд░реА рдкрдврд╝рдирд╛ рдЬрд╛рдирддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрд╕рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рд╕рдордЭрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╡рд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд┐рд╕ рдкреГрд╖реНрда рдкрд░ рд╣реИред рдЖрдЗрдП рдПрдХ рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рд╕реЛрдЪреЗрдВ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдПрдХ
рдкреГрд╖реНрда рдХреНрдпрд╛ рд╣реИред
рдкреЗрдЬ рдФрд░ рдореЙрдбреНрдпреВрд▓
рд╣рдордиреЗ рдЖрдЬреНрдЮрд╛ рджреА рд╣реИ
go 'http:
рдФрд░ gramant.com рдкрд░ рдЧрдпрд╛ред рдЕрдм рдЖрдк рдЗрд╕ рдкреГрд╖реНрда рдХреЛ "рдкрдврд╝" рд╕рдХрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдвреВрдВрдвреЗрдВред рддреЛ? рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВред рдЬрдм рдХреЛрдИ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкреГрд╖реНрда рдХреЛ рд╣рд┐рдЯ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
- HTTP рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд
- рдХреБрдЫ рд░рд╣рд╕реНрдпрдордп рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЖрдкрдХреЛ рджреВрд╕рд░реЗ рдкреГрд╖реНрда рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░реЗрдВрдЧреЗред
рд╣рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рдкреГрд╖реНрда рдкрд░ рд╣реИрдВ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реЗ рдкрд░ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ред рдЖрдЧреЗ рдХреЗ рдкрд░реАрдХреНрд╖рдг
рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдЪрд▓реЗрдВрдЧреЗред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рд╕рдордЭрдирд╛ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рд╕
рддрд╛рд░реНрдХрд┐рдХ рдкреГрд╖реНрда рдкрд░ рд╣реИрдВред
Geb рддрд╛рд░реНрдХрд┐рдХ рдкреГрд╖реНрда (рдкреЗрдЬ) рдФрд░ рддрдерд╛рдХрдерд┐рдд рдореЙрдбреНрдпреВрд▓ (рдореЙрдбреНрдпреВрд▓) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИред рдЖрдЗрдП рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рд╕рдордЭрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:
рдкреГрд╖реНрда рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдореВрд░реНрдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╕ рд╡рд░реНрддрдорд╛рди URL рдХреЛ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рд╣рдо рд╕рднреА рдЬрд╛рдирддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:
class SearchResultsPage extends Page { static url = "/yandsearch" }
рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╣реА
рддрд╛рд░реНрдХрд┐рдХ рдкреГрд╖реНрда рдореЗрдВ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ URL рдФрд░ рд░рд╛рдЬреНрдп рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ URL рджреНрд╡рд╛рд░рд╛ рдкреГрд╖реНрда рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рд╕рд╣реА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ (рдЬреЛ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд░реВрдк рд╕реЗ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ)ред рдЖрдк рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╢реАрд░реНрд╖рдХ рджреНрд╡рд╛рд░рд╛:
class SearchResultsPage extends Page { static at = { $('title').text() ==~ '.*: .* ' } }
рд╡рд░реНрддрдорд╛рди рдкреГрд╖реНрда рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ; рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рд╕рдм рдЖрд╡реЗрджрди рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИред рдХрднреА-рдХрднреА, рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ URL рдПрдХ рд╣реА рдкреГрд╖реНрда рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрддреЗ рд╣реИрдВ; рдХрднреА-рдХрднреА рдПрдХ рд╣реА URL рдкрд░, рдЖрдВрддрд░рд┐рдХ рд╕рдВрджрд░реНрдн рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреГрд╖реНрда рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЫрджреНрдо рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рддрд░реНрдХ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЗрд╕ рдкреГрд╖реНрда рдкрд░ рд╣реИ рдпрд╛ рдирд╣реАрдВред
рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрджред рдЖрд░реЗрдЦ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐
рдореЙрдбреНрдпреВрд▓ рдкреГрд╖реНрда (рдмреНрд▓реЙрдХ) рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдФрд░ рдРрд╕реЗ рдореЙрдбреНрдпреВрд▓ рд╣реИрдВ рдЬреЛ рдХрдИ рдкреГрд╖реНрдареЛрдВ рдкрд░ рдореМрдЬреВрдж рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпреИрдВрдбреЗрдХреНрд╕ рдЦреЛрдЬ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреЛрд░реНрдЯрд▓ рдкреГрд╖реНрда рдкрд░ рдФрд░ рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдКрдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЕрд░реНрде рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред
рдореЙрдбреНрдпреВрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:
class LoginModule extends Module { static content = { username {} password {} loginButton { $("input", type: "submit") } } }
рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
class HomePage extends Page { static content = { login { module LoginModule } } } Browser.drive { to HomePage login.username << 'user' login.password << 'password' login.loginButton.click() }
рдмреЗрд╢рдХ, рдПрдХ рдкреГрд╖реНрда рдХреЗ рднреАрддрд░ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ - рдпрд╣ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдЪ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдо - рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рдгрд╛рдо рдореЙрдбреНрдпреВрд▓ рджреНрд╡рд╛рд░рд╛ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣
рдореЙрдбреНрдпреВрд▓рд▓рд┐рд╕реНрдЯ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдореИрдВ рд╡рд╛рд╕ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред
AJAX рдФрд░ рд╕рднреА, рд╕рднреА, рд╕рднреА
рдЖрдзреБрдирд┐рдХ рд╕рдордп рдореЗрдВ, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдЕрдВрджрд░ рдХрдИ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдЪреАрдЬреЗрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ:
- AJAX рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ
- рдПрдиреАрдореЗрд╢рди
- рдЦреАрдВрдЪреЗрдВ рдФрд░ рдЫреЛрдбрд╝реЗрдВ
- рд╡рд┐рднрд┐рдиреНрди рдкреЙрдкрдЕрдк рд╡рд┐рдВрдбреЛ
рдРрд╕реА рдЪреАрдЬреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓-рдЗрди-рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред Geb рдХрдИ рдЙрдкрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:
рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд░ рдкрд░ рдкрд╣реБрдБрдЪреЗрдВ
рдЬреЗрдПрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдЖрдк
рд╡реИрд╢реНрд╡рд┐рдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд░ рдХреЗ рдореВрд▓реНрдп рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ:
Browser.drive { assert js.myGlobalVar == 1 }
рдЖрдк
рд╡реИрд╢реНрд╡рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
Browser.drive { js.globalCall() assert js.globalFunc() == 1 js."document.write"("go geb!") js.exec("return document.location.href") == 'http://www.gramant.ru' }
рдореИрдВрдиреЗ рдЗрд╕ рддрдВрддреНрд░ рдХрд╛ рдереЛрдбрд╝рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреЗрдм рд╕рднреА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ (рдЬреИрд╕рд╛ рдХрд┐
рдпрд╣рд╛рдВ рд╡рд░реНрдгрд┐рдд
рд╣реИ ) рдХреЛ рдЧреНрд░реВрд╡реА рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рджрд╛рдВрдд рдирд╣реАрдВ рджреЗрддрд╛ред
рдорд╛рдЙрд╕ рдШрдЯрдирд╛рдУрдВ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП jQuery рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреА рдХреЙрд▓ рдХреЗ рд▓рд┐рдП Geb рдПрдХ рд╡рд┐рд╢реЗрд╖ jQuery рдЧреБрдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:
Browser.drive { $().jquery.mouseover() }
рдпрд╣ рд▓рд╛рдЗрди
рдХреЗрд╡рд▓ рддрднреА рдХрд╛рдо рдХрд░реЗрдЧреА рдЬрдм jQuery рд╕рдВрд╕реНрдХрд░рдг 1.4 рдФрд░ рдЙрдЪреНрдЪрддрд░ рдкрд░реАрдХреНрд╖рдг рдкреГрд╖реНрда рдкрд░ рд▓реЛрдб рд╣реЛред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдРрд╕рд╛ рдХреЛрдб
js.exec () рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИред
рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреА рд╕реНрдерд┐рддрд┐
рдЖрдк рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдпрд╛ рддреЛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд░ рдХреЛ рд╕реЗрдЯ рдХрд░реЗрдВ, рдпрд╛
рд╡рдлрд╝рд░ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреГрд╖реНрда рдкрд░ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ред
Browser.driver { go 'http://www.youtube.com/watch?v=8d1hp8n1stA' $('button#watch-share').click() waitFor { $('#watch-actions-share').displayed } $('#watch-actions-share').find('button.share-panel-embed').click() waitFor { $('textarea.share-embed-code').displayed } println "Embed code : " + $('textarea.share-embed-code').value() }
рдпрд╣ рд╕реНрдХреНрд░рд┐рдкреНрдЯ YouTube рд╡реАрдбрд┐рдпреЛ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдмрдЯрди рджрдмрд╛рдХрд░ рдФрд░ рдПрдиреАрдореЗрд╢рди рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдореНрдмреЗрдб рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред
рдмреЗрд╢рдХ, рд╡реЗрдЯрдлрд╝реЛрд░ рд╡рд┐рдзрд┐ рд╣рдореЗрд╢рд╛ рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдЧреА рдФрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдкрд░ рдкрд╣реБрдВрдЪрдиреЗ рдкрд░ рджреБрд░реНрдШрдЯрдирд╛ рдХреЛ рд░реЛрдХ рджреЗрдЧреА, рдЬрд┐рд╕рд╕реЗ рдкрд░реАрдХреНрд╖рд╛ рдмрд╛рдзрд┐рдд рд╣реЛрдЧреАред рдбрд┐рдлрд╝реЙрд▓реНрдЯ 5 рд╕реЗрдХрдВрдб рд╣реИред
WebElement рдФрд░ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рд╣рдордиреЗ рдбреНрд░реИрдЧ рдПрдВрдб рдбреНрд░реЙрдк рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИред рдлрд┐рд▓рд╣рд╛рд▓ (рд╕рдВрд╕реНрдХрд░рдг 0.6.2) рдЧреЗрдм рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЕрдореВрд░реНрддрддрд╛ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡реЗрдмрд░рд╛рдЗрд╡рд░ рдЙрджрд╛рд╣рд░рдг (Browser.driver рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рддрдХ рдкрд╣реБрдВрдЪрдХрд░ рд╕реАрдзреЗ рд╕реЗрд▓реЗрдирд┐рдпрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рд╕рдВрднрд╡ рд╣реЛрддрд╛ рд╣реИ:
WebElement underlyingElement = $('#myElement').getElement(0) Action action = new Actions(browser.driver) .clickAndHold(underlyingElement) .moveByOffset(15,15) .release() .build() action.perform()
рдкреНрд░рджрд░реНрд╢рди () рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП
рдХреНрд░рд┐рдпрд╛рдПрдБ рд╡рд░реНрдЧ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рддрд░реАрдХрд╛ рд╣реИред рдореИрдВ рдЗрд╕ рддрдереНрдп рдкрд░ рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрд░рд┐рдпрд╛рдПрдБ рдЕрдкрдиреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрдВ
рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИрдВ , рдХреЗрд╡рд▓ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ-рдХреЛрдб рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдФрд░ рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреБрдХрд░рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рд╛рдЗрдб рдкрд░ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрддреНрдпрдзрд┐рдХ рдирд┐рд░реНрднрд░ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдбреНрд░рд╛рдЗрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреЛрд░реНрдЯреЗрдмрд▓ рдирд╣реАрдВ рд╣реИред рдЯрдЪ рд╕реНрдХреНрд░реАрди рдХреЗ рд╕рд╛рде рдЯреИрдмрд▓реЗрдЯреНрд╕ рдкрд░ рдЯреИрдк рдИрд╡реЗрдВрдЯ рдЬрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд▓рдЧрднрдЧ рдПрдХрдорд╛рддреНрд░ рд╡рд┐рдХрд▓реНрдк рд╣реИред рдХреБрдЫ рд╕реАрдорд╛рдПрдБ рд╣реИрдВ - рдХреНрд░рд┐рдпрд╛рдПрдБ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдкреГрд╖реНрда рдкрд░ рдлрд╝реНрд▓реИрд╢ рдШрдЯрдХреЛрдВ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреА рд╣реИрдВ; рдпрд╣ рдХреЗрд╡рд▓ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдмрд╛рд╣рд░реАрдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрднрд╡ рд╣реИ, рдЬреЛ рдХрд┐ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред
рдЧреНрд░реЗрд▓реНрд╕ рдХреЗ рдЕрдВрджрд░ рдЧреЗрдм
рдЧреНрд░рд┐рд▓реНрд╕ рдореЗрдВ рдЧреЗрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рд╕реНрдкреЙрдХ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдореИрдВ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕реНрдкреЙрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдлреИрд▓рд╛рдКрдВрдЧрд╛, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рд╣реИред рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдорд╛рдирдХ JUnit рдХреА рддреБрд▓рдирд╛ рдореЗрдВ Spock рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рдЕрдкрдиреА рдореЗрдЯрд╛-
рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рднрд╛рд╖рд╛ (рдлрд┐рд░ рд╕реЗ рдЧреНрд░реВрд╡реА рдкрд░ рдЖрдзрд╛рд░рд┐рдд) рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдЫреЛрдЯрд╛ рдФрд░ рдЕрдзрд┐рдХ рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рд╣реЛрддрд╛ рд╣реИред
рдЧреНрд░реЗрдм рдХреЗ рд▓рд┐рдП рдЧреЗрдм рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж 1.3.xред рдЗрд╕ рддрд░рд╣ рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг
рдпрд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз
рд╣реИ ред
BuildConfig.groovy рдореЗрдВ
рд╡рд╛рдВрдЫрд┐рдд рдЦрдВрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
dependencies { test("org.seleniumhq.selenium:selenium-htmlunitdriver:$seleniumVersion") { exclude "xml-apis" } test("org.seleniumhq.selenium:selenium-chrome-driver:$seleniumVersion") test("org.seleniumhq.selenium:selenium-firefox-driver:$seleniumVersion") test "org.codehaus.geb:geb-spock:$gebVersion" } plugins { test ":tomcat:$grailsVersion" test ":hibernate:$grailsVersion" test ":geb:$gebVersion" test ":spock:0.5-groovy-1.7" }
рд╡рд░реНрддрдорд╛рди gebVersion 0.6.2 рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдк рдХреА рдЬрд░реВрд░рдд рд╣реИ рдЙрд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред
рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЧреНрд░реЗрд▓реНрд╕ рдХреЗ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░реАрдХреНрд╖рдг рд╣реИрдВ - рдкрд░реАрдХреНрд╖рдг / рдЗрдХрд╛рдИ рдФрд░ рдкрд░реАрдХреНрд╖рдг / рдПрдХреАрдХрд░рдгред рд╕реНрдкреЙрдХ рдкрд░реАрдХреНрд╖рдг / рдХрд╛рд░реНрдпрд╛рддреНрдордХ - "рдХрд╛рд░реНрдпрд╛рддреНрдордХ" рдкрд░реАрдХреНрд╖рдг рднреА рдЬреЛрдбрд╝рддрд╛ рд╣реИред
рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкрд░реАрдХреНрд╖рдг (Spock рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ) рдХреЗ рдЕрдВрджрд░ Geb рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЕрдВрджрд░ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рд╕рдм рдХреБрдЫ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг (рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реЛрдордкреЗрдЬ, рд▓реЙрдЧрд┐рдирдкреЗрдЬ рд╡рд░реНрдЧреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИ):
@Stepwise class CoreSpec extends GebReportingSpec { def "unauthorized user goes to login page"() { when: to HomePage then: at LoginPage } }
рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рднреАрддрд░ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдПрдХ рдЕрд▓рдЧ рдкрд░реАрдХреНрд╖рдг рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдореБрдЦреНрдп рдкреГрд╖реНрда рдкрд░ рдЬрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓реЙрдЧ рдЗрди рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрд╕реЗ рд▓реЙрдЧрд┐рдирдкреЗрдЬ рдкрд░ рд╕рдорд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, Geb рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓реЗрдВ рднреА рд╣реИрдВ рдЬреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреА рд╣реИрдВ:
- рдХрд┐рд╕ рдмреНрд░рд╛рдЙрдЬрд░ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдХрд┐рд╕ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рд╕рд╛рде
- Geb рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреА рдПрдХ рдХрд┐рд╕реНрдо (рдЬреИрд╕реЗ рдЯрд╛рдЗрдордЖрдЙрдЯ)ред
рдбреЗрдореЛ рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг
GebConfig.groovy рдлрд╝рд╛рдЗрд▓ рд╣реИред
рд▓рдЧрддрд╛ рд╣реИ рдХрд╛рдлреА рд╣реИред рд╣рдо рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ:
grails -Dgeb.env=firefox test-app :spock
рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреИрд╕реЗ рд╣рдорд╛рд░рд╛ рд░реЛрдмреЛрдЯ рд╡рд╣рд╛рдВ рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИред
рдпрд╣ рдЬрд▓реНрджреА рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдХреНрд░реЛрдо рдФрд░ IE рдкрд░ рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдг рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЦрд░реЛрдВрдЪ рд╕реЗ рдФрд░ рд╣рд╛рде рдореЗрдВ рд╕рд╛рдзрди рдХреЗ рдмрд┐рдирд╛ рдпрд╛ рддреЛ HtmlUnit (рдЬреЛ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдмреЗрдХрд╛рд░ рд╣реИ) рдпрд╛ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рд╣реИред рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╛рдж рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рдВ, рд╕реЗрд▓реЗрдирд┐рдпрдо / рдЧреЗрдм рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдкрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдерд╛ рдЬреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
IE рдФрд░ рдХреНрд░реЛрдо рдХреЗ рд▓рд┐рдП, рдЙрдирдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдХреЛ рдЯреИрдмрд▓реЗрдЯ рд╕реЗ рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
рдмреНрд░рд╛рдЙрдЬрд╝рд░ | рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ | рдкреНрд░рддрд┐рдмрдВрдз |
---|
рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ | - | рдХреБрдЫ OS рдХреЗ рдЕрдВрддрд░реНрдЧрдд, TCP рдкреЛрд░реНрдЯ рд╕реЗ рдмрд╛рд╣рд░ рдЪрд▓рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрддреА рд╣реИред |
рдХреНрд░реЛрдо | рдЖрдкрдХреЛ рдПрдХ рдЕрд▓рдЧ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реЗрд╡рд╛ (ChromeDriverService) рдбрд╛рдЙрдирд▓реЛрдб рдФрд░ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреА рд╣реЛрдЧреАред | Actions рд▓рд┐рдП рдХреЛрдИ рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИред |
рдУрдкреЗрд░рд╛ | - | рд╕рдВрд╕реНрдХрд░рдг 11.5 рд╕реЗ рдХрдо рдирд╣реАрдВ, рдПрдХ рд╕рдордп рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЙрджрд╛рд╣рд░рдгред |
рдЗрдВрдЯрд░рдиреЗрдЯ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ | рдПрдХ рдЕрд▓рдЧ рд╕реЗрд╡рд╛ рдХреЗ рд╢реБрднрд╛рд░рдВрдн рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкреВрд░реНрд╡ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди (рд╕реБрд░рдХреНрд╖рд╛ рдореЛрдб) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред | рд╕рдВрд╕реНрдХрд░рдг 6,7,8,9ред рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред |
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрд░реЛрдо рдЪрд╛рд▓рдХ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ! рдЬреЛ рдХрд╛рдлреА рдЕрдкреНрд░рд┐рдп рд╣реИред
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ рд╕реЗрд▓реЗрдирд┐рдпрдо (рдФрд░ рдЗрд╕рд▓рд┐рдП рдЧреЗрдм) рдХрд╛ рдФрд░ рдХреНрдпрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ?
- IPhone рдмреНрд░рд╛рдЙрдЬрд╝рд░
- Android рдмреНрд░рд╛рдЙрдЬрд╝рд░
рдХреНрдпрд╛ рдореИрдВ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддрд╛ рд╣реВрдБ?
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рд╕реБрдВрджрд░рддрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд░реАрдХреНрд╖рдг:
- рд╡реЗ рдзреАрд░реЗ-рдзреАрд░реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ (рдХрд┐рд╕реА рднреА рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдзреАрдорд╛) - рдмрд╕ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдЧрддрд┐ рд╕реАрдорд┐рдд рд╣реИ;
- рдЬрдм рдЬрдЯрд┐рд▓ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ / AJAX-fillings рдХрд╛ рдкрд░реАрдХреНрд╖рдг - рд▓рд┐рдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓;
- рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред CSS рдХрдХреНрд╖рд╛рдУрдВ рдФрд░ рдкреГрд╖реНрда рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдХреЛрдИ рднреА рдкрд░рд┐рд╡рд░реНрддрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рддреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдЫреЛрдЯреЗ рджреГрд╢реНрдп рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрдХреАрдорд╛ рдпрд╛ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИред
рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕реВрддреНрд░ рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:

рд╕реВрддреНрд░ рд╕реБрдВрджрд░ рд╣реИ, рдмрд▓реНрдХрд┐ рдЕрд░реНрдерд╣реАрди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдорд░реНрдерди рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдФрд░ рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рдкрд░реАрдХреНрд╖рдг рдХреА рд▓рд╛рдЧрдд рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рдмрдврд╝рддреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде, рдкрд░реАрдХреНрд╖рдг рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЖрдкрдХреЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдЖрдПрдЧрд╛ред рдЖрдк рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреА рдХрдо рдЧрддрд┐ рдкрд░ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗ - рдпрд╣ рдЕрднреА рднреА рдореИрдиреНрдпреБрдЕрд▓ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рд╕реЗ рдЕрдзрд┐рдХ рддреЗрдЬрд╝ рд╣реИред рд╕рдЪ рд╣реИ, рд╕реВрддреНрд░ рдЗрд╕ рддрдереНрдп рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдореИрдиреБрдЕрд▓ рдХрд╛рдо рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рд░реЛрдмреЛрдЯ рдХреЛ рдпрд╣ рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ, рдХрд┐ "рд▓реЗрдЖрдЙрдЯ рдХреНрдпрд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ"ред
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдореЗрдВ рднреА рд╕реВрдХреНрд╖реНрдорддрд╛рдПрдБ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реЗрд▓реЗрдирд┐рдпрдо рд╣рдореЗрд╢рд╛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рджреНрд╡рд╛рд░рд╛ рджреЗрдЦреА рдЧрдИ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдмрд┐рд▓реНрдХреБрд▓ рд╕реБрд▓рдн рд╣реИ рдпрд╛ рдирд╣реАрдВред рджрд░рдЕрд╕рд▓, рдЗрдВрдЯрд░рдиреЗрдЯ рдХреЗ рдХрдЯрдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдмреНрд░рд╛рдЙрдЬрд╝рд░
рдХреБрдЫ рджрд┐рдЦрд╛ рд░рд╣рд╛
рд╣реИ ред рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдкрдХрд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рдкреГрд╖реНрда рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди "рдЕрдкрдиреА рдЗрдВрдЯрд░рдиреЗрдЯ рд╕реЗрдЯрд┐рдВрдЧ рдЬрд╛рдВрдЪреЗрдВ" рдХреА рд╢реИрд▓реА рдореЗрдВ рдПрдХ рдЖрдВрддрд░рд┐рдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдВрджреЗрд╢ рд╣реИред рдЗрди рд╕рднреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдЖрдкрдХреЛ рдкрд░реАрдХреНрд╖рдг рдкреИрдХреЗрдЬ рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдФрд░ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рдХреБрдЫ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдЕрдиреБрдХреВрд▓ рдмрдирд╛рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдЕрд╕рд╛рдорд╛рдиреНрдп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░реАрдХреНрд╖рдг рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИред рдЗрд╕рд▓рд┐рдП, рдХрднреА-рдХрднреА рдЗрд╕рдХреЗ рд╡рд┐рдХрд╛рд╕ рдФрд░ рд╕рдорд░реНрдерди рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реНрд╕ рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдФрд░ рдкрд░реАрдХреНрд╖рдХ рдХреЗ рдмреАрдЪ рд╢реНрд░рдо рдХреЗ рд╕рдЦреНрдд рд╡рд┐рднрд╛рдЬрди рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдЕрд╕реЗрдВрдмрд▓реА рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреА рдПрдХ рд╕реНрдерд╛рдкрд┐рдд рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░, рдХреБрдЫ рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ "рд╕реНрд╡рдпрдВ рджреНрд╡рд╛рд░рд╛ рдкрд░реАрдХреНрд╖рдг, рд╕реНрд╡рдпрдВ рджреНрд╡рд╛рд░рд╛ рдФрд░ рдорд░рдореНрдорддред" рдпрд╣реА рд╣реИ, рдореЛрдЯреЗ рддреМрд░ рдкрд░, рдпрд╣ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХрд┐рд╕рдиреЗ рд▓рд┐рдЦрд╛ рдерд╛ - рдЬрд┐рд╕ рдХреНрд╖рдг рд╕реЗ рдЗрд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╣ рдЖрдо рд╕рдВрдкрддреНрддрд┐ рдмрди рдЬрд╛рддреА рд╣реИ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдХ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреЛрдиреЛрдВ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВред
рд╣рдореЗрдВ рддрдерд╛рдХрдерд┐рдд рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХрд╛ рднреА рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП - рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЖрдкрдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдФрд░ рдЙрдирдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдореЗрдВ рд╕реЗрд▓реЗрдирд┐рдпрдо рдЖрдИрдбреАрдИ рджреНрд╡рд╛рд░рд╛ рджреА рдЧрдИ рд╣реИред рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрдирд╛рдП рдЧрдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдЖрдорддреМрд░ рдкрд░ рдХрдо
рд╕реНрдерд┐рд░рддрд╛ рд╣реЛрддреА рд╣реИ , рдЕрд░реНрдерд╛рдд, рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреГрд╖реНрда рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде рдЙрдирдХреЗ рдЯреВрдЯрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реЛрддреА рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддреА рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЯрд░реЗрдХреНрдЯ рдХрд┐рдП рдЧрдП рдкреЗрдЬ рдмреНрд▓реЙрдХ рдХреЛ рдХреИрд╕реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП - рдХреНрдпрд╛ рдЖрдкрдХреЛ рд╕реАрдПрд╕рдПрд╕ рдХреНрд▓рд╛рд╕реЗрд╕, # рдПрдб рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рддрд░реАрдХреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдХреЗ рд▓рд┐рдП рд╕реЗрд▓реЗрдирд┐рдпрдо рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рддрд░реНрдХ (рднрд░рд╛рдИ) рдЕрднреА рднреА рд╕рд╛рде рдирд╣реАрдВ рдЖ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ: Geb рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрдЦрдж рдФрд░ рдХрд╛рдлреА рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЙрддреНрдкрд╛рдж рд╣реИ (рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕реЗрд▓реЗрдирд┐рдпрдо рдЬреАрдИрдмреА рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░рддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ), рдпрд╣ рдЧреНрд░реЗрд▓реНрд╕ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЙрдкрдпреБрдХреНрдд рд╣реИред рдЖрдкрдХреЛ рдЙрд╕рдХреЗ рд╕рд╛рде рдЕрдХреЗрд▓рд╛ рдЫреЛрдбрд╝ рдХрд░:
http://gebish.org