рдорд┐рдереБрди рдФрд░ рд╕реНрдЯреЛрд░реАрдмреБрдХ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рджреГрд╢реНрдп рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рд╡рд┐рдХрд╛рд╕

рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░! рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рд╣рдорд╛рд░реА рдЯреАрдо рдореЗрдВ рджреГрд╢реНрдп рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдЕрдиреБрднрд╡ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

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

рдХрд┐рд╕реА рднреА рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдпреВрдирд┐рдЯ рдХреЛрдб рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реЛрддрд╛ рд╣реИред рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдпрд╣ рд╡рд┐рд╢реНрд╡рд╛рд╕ рджрд┐рд▓рд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЯреВрдЯрд╛ред рдЦреИрд░, рдХрдо рд╕реЗ рдХрдо рд╡реЗ рдЙрд╕ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдирд╣реАрдВ рдЯреВрдЯреЗ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рд╣реИрдВред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдПрдХ рд╣реА рд╕рд┐рджреНрдзрд╛рдВрдд рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬрд┐рд╕ рддрд░рд╣ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдкрд░реАрдХреНрд╖рдг рдХрдХреНрд╖рд╛рдПрдВ, рджреГрд╢реНрдп рдкрд░реАрдХреНрд╖рдг рджреГрд╢реНрдп рдШрдЯрдХреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐рд╕реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдмрдирд╛рддреЗ рд╣реИрдВред

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

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

рд╕рдЪреНрдЪрд╛рдИ, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдХрд╣реАрдВ рдмреАрдЪ рдореЗрдВ рд╣реИ - рдЖрдк рдЖрд╡реЗрджрди рдХреЗ рдкреВрд░реЗ рдкреГрд╖реНрда рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреА рддрд╕реНрд╡реАрд░ рд▓реЗрдВ рдЬрд┐рд╕рдХреЗ рддрд╣рдд рдкрд░реАрдХреНрд╖рдг рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдпрд╣ рдХреНрд╖реЗрддреНрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдШрдЯрдХ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдШрдЯрдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рд╡реИрдХреНрдпреВрдо, рд▓реЗрдХрд┐рди рдПрдХ рдмрд╣реБрдд рд╣реА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВред рдФрд░ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЗрдХрд╛рдИ рджреГрд╢реНрдп рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рдорд╛рди рд╣реЛрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╢рд╛рдпрдж рд╣реА рдкреНрд░рддрд┐рд░реВрдкрдХрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЕрдЧрд░ "рдЗрдХрд╛рдИ" рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЬрд╛рдирддрд╛ рд╣реИред рдареАрдХ рд╣реИ, рдареАрдХ рд╣реИ, рдпрд╣ рдЗрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХреА рд╢реНрд░реЗрдгреА рдореЗрдВ рджреГрд╢реНрдп рдкрд░реАрдХреНрд╖рдг - рдореЙрдбреНрдпреВрд▓рд░ рдпрд╛ рдПрдХреАрдХрд░рдг рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред рдЬреИрд╕рд╛ рдХрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, "рдЖрдк рдЬрд╛рдВрдЪ рдХрд░реЗрдВ рдпрд╛ рдЬрд╛рдПрдВ?"

рдЙрдкрдХрд░рдг рдЪрдпрди


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

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

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

//.gemini.js module.exports = { rootUrl: 'http://my-app.ru', gridUrl: 'http://127.0.0.1:4444/wd/hub', browsers: { chrome: { windowSize: '1920x1080', screenshotsDir:'gemini/screens/1920x1080' desiredCapabilities: { browserName: 'chrome' } } }, system: { projectRoot: '', plugins: { 'html-reporter/gemini': { enabled: true, path: './report' }, 'gemini-optipng': true }, exclude: [ '**/report/*' ], diffColor: '#EC041E' } }; 

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

рдПрдХ рдЙрджрд╛рд╣рд░рдг:

 gemini.suite('login-dialog', suite => { suite.setUrl('/') .setCaptureElements('.login__form') .capture('default'); .capture('focused', actions => actions.focus('.login__editor')); }); 

рдбреЗрдЯрд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ


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

рдмреЗрд╢рдХ, рдЖрдк рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрдж рд╣реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдпрд╣ рдмреИрдХрдПрдВрдб рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрджрд░реНрдн рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдЖрдк рдПрдХ рдЧрд┐рдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдирд╣реАрдВ рдбрд╛рд▓ рд╕рдХрддреЗред рдирд╣реАрдВ, рдмреЗрд╢рдХ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреБрдЫ рд╢рд╛рд▓реАрдирддрд╛рдПрдВ рд╣реИрдВред

рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЕрд╕рд▓реА рдмреИрдХрдПрдВрдб рд╕рд░реНрд╡рд░ рдХреЛ рдПрдХ рдирдХрд▓реА рдХреЗ рд╕рд╛рде рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдбреЗрдЯрд╛ рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рд╕реНрдереИрддрд┐рдХ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, json рдкреНрд░рд╛рд░реВрдк рдореЗрдВ, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрд░реЛрддреЛрдВ рдХреЗ рд╕рд╛рдеред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдРрд╕реЗ рдбреЗрдЯрд╛ рдХреА рддреИрдпрд╛рд░реА рднреА рдмрд╣реБрдд рддреБрдЪреНрдЫ рдирд╣реАрдВ рд╣реИред рд╣рдордиреЗ рдЖрд╕рд╛рди рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ - рд╕рд░реНрд╡рд░ рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдмрд╕ рдЖрд╡реЗрджрди рдХреА рд╕реНрдерд┐рддрд┐ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд░рд┐рдбреНрдпреВрдХреНрд╕ рд╕реНрдЯреЛрд░реЗрдЬ рдХреА рд╕реНрдерд┐рддрд┐ ) рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬреЛ рдХрд┐ рдЖрд╡реЗрджрди рдореЗрдВ рдЙрд╕ рд╕рдордп рдерд╛ рдЬрдм рд╕рдВрджрд░реНрдн рдЪрд┐рддреНрд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдкрд░реАрдХреНрд╖рдг рд╕реЗ рдкрд╣рд▓реЗред

Redux рд╕реНрдЯреЛрд░ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реНрдиреИрдкрд╢реЙрдЯ () рд╡рд┐рдзрд┐ рдХреЛ рд╡рд┐рдВрдбреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ:

 export const snapshotStore = (store: Object, fileName: string): string => { let state = store.getState(); const file = new Blob( [ JSON.stringify(state, null, 2) ], { type: 'application/json' } ); let a = document.createElement('a'); a.href = URL.createObjectURL(file); a.download = `${fileName}.testdata.json`; a.click(); return `State downloaded to ${a.download}`; }; const store = createStore(reducer); if (process.env.NODE_ENV !== 'production') { window.snapshot = fileName => snapshotStore(store, fileName); }; 

рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрдВрд╕реЛрд▓ рдХреА рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк Redux рд╕реНрдЯреЛрд░реЗрдЬ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рдПрдХ рдлрд╛рдЗрд▓ рдореЗрдВ рд╕реЗрд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рдЫрд╡рд┐

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

рдЗрд╕рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рджреГрд╢реНрдп рдкрд░реАрдХреНрд╖рдг рдПрдХ рдХрд╣рд╛рдиреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рд╕реЗ рдкрд╣рд▓реЗ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╕рд╣реЗрдЬреЗ рдЧрдП рд░рд┐рдбреНрдпреВрдХреНрд╕ рд╕реНрдЯреЛрд░реЗрдЬ рдХреА рд╕реНрдерд┐рддрд┐ рдмрд╣рд╛рд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИред рдпрд╣ рд░рд┐рдПрдХреНрдЯрд░-рд░рд┐рдбреНрдпреВрдХреНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдкреНрд░рджрд╛рддрд╛ рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕ рд╕реНрдЯреЛрд░ рдХреА рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдмрдЪрд╛рдИ рдЧрдИ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХреА рдЧрдИ рд╕реНрдерд┐рддрд┐ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 import preloadedState from './incoming-letter.testdata'; const store = createStore(rootReducer, preloadedState); storiesOf('regression/Cards', module) .add('IncomingLetter', () => { return ( <Provider store={store}> <MemoryRouter> <ContextContainer {...dummyProps}/> </MemoryRouter> </Provider> ); }); 

рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, ContextContainer рдПрдХ рдШрдЯрдХ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ "рдХрдВрдХрд╛рд▓" рд╢рд╛рдорд┐рд▓ рд╣реИ - рдиреЗрд╡рд┐рдЧреЗрд╢рди рдЯреНрд░реА, рд╣реЗрдбрд░ рдФрд░ рд╕рд╛рдордЧреНрд░реА рдХреНрд╖реЗрддреНрд░ред рд╕рд╛рдордЧреНрд░реА рдХреНрд╖реЗрддреНрд░ рдореЗрдВ, рд╡рд┐рднрд┐рдиреНрди рдШрдЯрдХреЛрдВ рдХреЛ рд░реЗрдбреВрдХреНрд╕ рднрдВрдбрд╛рд░рдг рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ (рд╕реВрдЪреА, рдХрд╛рд░реНрдб, рд╕рдВрд╡рд╛рдж, рдЖрджрд┐) рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдШрдЯрдХ рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдмреИрдХрдПрдВрдб рдХреЗ рд▓рд┐рдП рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рд╕реНрдЯрдм рдЧреБрдг рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдПрдХ рд╕реНрдЯреЛрд░реАрдмреБрдХ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

рдЫрд╡рд┐

рдорд┐рдереБрди + рд╕реНрдЯреЛрд░реАрдмреБрдХ


рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ред рдЕрдЧрд▓рд╛ рдХрд╛рдо рдорд┐рдереБрди рдФрд░ рд╕реНрдЯреЛрд░реАрдмреБрдХ рдХреЗ рд╕рд╛рде рджреЛрд╕реНрдд рдмрдирд╛рдирд╛ рд╣реИред рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ - рдорд┐рдереБрди рд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рд╣рдо рдкрд░реАрдХреНрд╖рдг рдХреЗ рддрд╣рдд рдЖрд╡реЗрджрди рдХрд╛ рдкрддрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╕реНрдЯреЛрд░реАрдмреБрдХ рд╕рд░реНрд╡рд░ рдХрд╛ рдкрддрд╛ рд╣реИред рдЬреЗрдорд┐рдиреА рдЯреЗрд╕реНрдЯ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рд╕реНрдЯреЛрд░реАрдмреБрдХ рд╕рд░реНрд╡рд░ рдХреЛ рдЙрдард╛рдирд╛ рд╣реЛрдЧрд╛ред рдЖрдк рдЗрд╕реЗ рд╕реАрдзреЗ рдорд┐рдереБрди рдШрдЯрдирд╛ рд╕рджрд╕реНрдпрддрд╛ START_RUNNER рдФрд░ END_RUNNER рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдб рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 const port = 6006; const cofiguration = { rootUrl:`localhost:${port}`, gridUrl: seleniumGridHubUrl, browsers: { 'chrome': { screenshotsDir:'gemini/screens', desiredCapabilities: chromeCapabilities } } }; const Gemini = require('gemini'); const HttpServer = require('http-server'); const runner = new Gemini(cofiguration); const server = HttpServer.createServer({ root: './storybook-static'}); runner.on(runner.events.START_RUNNER, () => { console.log(`storybook server is listening on ${port}...`); server.listen(port); }); runner.on(runner.events.END_RUNNER, () => { server.close(); console.log('storybook server is closed'); }); runner .readTests(path) .done(tests => runner.test(tests)); 

рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдордиреЗ http-server рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЬреЛ рдлрд╝реЛрд▓реНрдбрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕реНрдЯреЗрдЯрд┐рдХрд▓реА рдЕрд╕реЗрдВрдмрд▓ рд╕реНрдЯреЛрд░реАрдмреБрдХ (рд╕реНрдЯреИрдЯрд┐рдХ рд╕реНрдЯреЛрд░реАрдмреБрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд┐рд▓реНрдб-рд╕реНрдЯреЛрд░реАрдмреБрдХ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ) рдХреЗ рд╕рд╛рде рджреЗрддрд╛ рд╣реИред

рдЕрдм рддрдХ, рд╕рдм рдХреБрдЫ рдЖрд╕рд╛рдиреА рд╕реЗ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдиреЗ рдЦреБрдж рдХреЛ рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╕реНрдЯреЛрд░реАрдмреБрдХ рдлреНрд░реЗрдо рдХреЗ рдЕрдВрджрд░ рдХреА рдХрд╣рд╛рдиреА рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рд╣рдо setCaptureElements () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЫрд╡рд┐ рдХреЗ рдЪрдпрдирд╛рддреНрдордХ рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рддрднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЖрдк рд╕реБрдЗрдЯ рдХреЗ рд▓рд┐рдП рдкрддреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдлреНрд░реЗрдо рдкрддреЗ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ:

 gemini.suite('VisualRegression', suite => suite.setUrl('http://localhost:6006/iframe.html?selectedKind=regression%2Fcards&selectedStory=IncomingLetter') .setCaptureElements('.some-component') .capture('IncomingLetter') ); 

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

 gemini.suite('VisualRegression', suite => suite.setUrl('/') .setCaptureElements('#storybook-preview-iframe') .capture('IncomingLetter', actions => openStory(actions, 'IncomingLetter')) .capture('ProjectDocument', actions => openStory(actions, 'ProjectDocumentAccess')) .capture('RelatedDocuments', actions => { openStory(actions, 'RelatedDocuments'); hover(actions, '.related-documents-tree-item__title', 4); }) ); 

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдореЗрдВ, рдЫрд╡рд┐ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдордиреЗ DOM рдЯреНрд░реА (рдорд╛рдЙрд╕рдбрд╛рдЙрди (), mouseMove (), рдлрд╝реЛрдХрд╕ (), рдЖрджрд┐) рдХреЗ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд┐рдереБрди рдЗрдВрдЬрди рдХреЗ рдорд╛рдирдХ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рднреА рдЦреЛ рджреАред рдПрдХред рдорд┐рдереБрди рдлреНрд░реЗрдо рдХреЗ рднреАрддрд░ рддрддреНрд╡ "рдирд╣реАрдВ рджреЗрдЦрддреЗ рд╣реИрдВред" рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рдлрд╝рдВрдХреНрд╢рди рдПрдХреНрдЬрд╝реАрдХреНрдпреВрдЯ рдЬреЗрдПрд╕ () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдордиреЗ рдЙрди рдорд╛рдирдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдПрдирд╛рд▓реЙрдЧреНрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдЯреЛрд░реАрдмреБрдХ рдлреНрд░реЗрдо рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рд╕рдВрджрд░реНрдн рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдВрджрд░реНрдн рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рдиреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ "рдХрдВрдЬрд╝реНрдпреВрдорд░" рдХрд░рдирд╛ рдкрдбрд╝рд╛ - рдирд┐рд╖реНрдкрд╛рджрди рдХрд░реЗрдВ (), рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдРрд╕рд╛ рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдХреЛрдб рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ - рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЛрдб рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ ExecuteJs () рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди eval () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 function openStory(actions, storyName) { const storyNameLowered = storyName.toLowerCase(); const clickTo = function(window) { Array.from(window.document.querySelectorAll('a')).filter( function(el) { return el.textContent.toLowerCase() === 'storyNameLowered'; })[0].click(); }; actions.executeJS(eval(`(${clickTo.toString().replace('storyNameLowered', storyNameLowered)})`)); } function dispatchEvents(actions, targets, index, events) { const dispatch = function(window) { const document = window.document.querySelector('#storybook-preview-iframe').contentWindow.document; const target = document.querySelectorAll('targets')[index || 0]; events.forEach(function(event) { const clickEvent = document.createEvent('MouseEvents'); clickEvent.initEvent(event, true, true); target.dispatchEvent(clickEvent); }); }; actions.executeJS(eval(`(${dispatch.toString() .replace('targets', targets) .replace('index', index) .replace('events', `["${events.join('","')}"]`)})` )); } function hover(actions, selectors, index) { dispatchEvents(actions, selectors, index, [ 'mouseenter', 'mouseover' ]); } module.exports = { openStory: openStory, hover: hover }; 

рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐


рджреГрд╢реНрдп рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдФрд░ рдХрд╛рдо рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рдмрд╣реБрдд рд╕реНрдерд┐рд░ рдирд╣реАрдВ рдереЗред рдХрд╣реАрдВ, рдЖрдЗрдХрди рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХрд╣реАрдВ рдЪрдпрди рдирд╣реАрдВ рд╣рдЯрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╣рдореЗрдВ рд╕рдВрджрд░реНрдн рдЫрд╡рд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдмреЗрдореЗрд▓ рдорд┐рд▓ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдкрд░реАрдХреНрд╖рдг рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд░рд┐рдЯреЗрдЯреНрд╕ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдорд┐рдереБрди рд░рд╛рд╢рд┐ рдореЗрдВ, рд░рд┐рдЯрд╛рдпрд░ рдкреВрд░реЗ рд╕реВрдЯ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдордиреЗ рдЙрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рд╢реЙрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдпрд╣ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдмрд╣реБрдд рдзреАрдорд╛ рдХрд░ рджреЗрддрд╛ рд╣реИред рджреВрд╕рд░реА рдУрд░, рдПрдХ рд╕реВрдЯ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ рдЬрд┐рддрдиреЗ рдЕрдзрд┐рдХ рд╢реЙрдЯ рд▓рд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЙрддрдиреА рд╣реА рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдмрд╛рд░-рдмрд╛рд░ рд╕реВрдЯ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рдЧрд┐рд░рд╛рд╡рдЯ рд╣реЛ рд╕рдХрддреА рд╣реИ рдФрд░ рд╕рд╛рде рд╣реА рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВред рдЗрд╕рд▓рд┐рдП, рд╕реЗрд╡рд╛рдирд┐рд╡реГрддреНрдд рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред рд╣рдорд╛рд░реА рдпреЛрдЬрдирд╛ рдореЗрдВ, рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкреВрд░реЗ рд╕реБрдЗрдЯ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХреА рдЧрдИ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЙрди рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдкрд┐рдЫрд▓реЗ рдЕрд╕рдлрд▓ рд░рди рдкрд░ рдирд╣реАрдВ рдЖрдП рдереЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, TEST_RESULT рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ, рд╣рдо рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреЛ рдорд╛рдирдХ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреЗ рд▓рд┐рдП рдЬреЛ рддреБрд▓рдирд╛ рдкрд╛рд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛, рдФрд░ рдХреЗрд╡рд▓ рдЙрдирдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдирдпрд╛ рд╕реВрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ:

 const SuiteCollection = require('gemini/lib/suite-collection'); const Suite = require('gemini/lib/suite'); let retrySuiteCollection; let retryCount = 2; runner.on(runner.events.BEGIN, () => { retrySuiteCollection = new SuiteCollection(); }); runner.on(runner.events.TEST_RESULT, args => { const testId = `${args.state.name}/${args.suite.name}/${args.browserId}`; if (!args.equal) { if (retryCount > 0) console.log(chalk.yellow(`failed ${testId}`)); else console.log(chalk.red(`failed ${testId}`)); let suite = retrySuiteCollection.topLevelSuites().find(s => s.name === args.suite.name); if (!suite) { suite = new Suite(args.suite.name); suite.url = args.suite.url; suite.file = args.suite.file; suite.path = args.suite.path; suite.captureSelectors = [ ...args.suite.captureSelectors ]; suite.browsers = [ ...args.suite.browsers ]; suite.skipped = [ ...args.suite.skipped ]; suite.beforeActions = [ ...args.suite.beforeActions ]; retrySuiteCollection.add(suite); } if (!suite.states.find(s => s.name === args.state.name)) { suite.addState(args.state.clone()); } } else console.log(chalk.green(`passed ${testId}`)); }); 

рд╡реИрд╕реЗ, TEST_RESULT рдЗрд╡реЗрдВрдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдкреНрд░рдЧрддрд┐ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреЛрдЧреА рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдкрд╛рд╕ рд╣реЛ рдЧрдП рдереЗред рдЕрдм рдбреЗрд╡рд▓рдкрд░ рдХреЛ рд╕рднреА рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╡рд╣ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рд╡рд╣ рджреЗрдЦрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдкрд░реАрдХреНрд╖рдг рдирд┐рд╖реНрдкрд╛рджрди рдмрд╛рдзрд┐рдд рд╣реИ, рддреЛ рдорд┐рдереБрди рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕реЗрд▓реЗрдирд┐рдпрдо рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рдЦреЛрд▓реЗ рдЧрдП рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рддреНрд░реЛрдВ рдХреЛ рдмрдВрдж рдХрд░ рджреЗрдЧрд╛ред

рдЯреЗрд╕реНрдЯ рд░рди рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░, рдпрджрд┐ рдирдпрд╛ рд╕реВрдЯ рдЦрд╛рд▓реА рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕реЗ рддрдм рддрдХ рдЪрд▓рд╛рдПрдВ, рдЬрдм рддрдХ рдХрд┐ рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рджреЛрд╣рд░рд╛рд╡ рд╕рдорд╛рдкреНрдд рди рд╣реЛ рдЬрд╛рдП:

 function onComplete(result) { if ((retryCount--) > 0 && result.failed > 0 && retrySuiteCollection.topLevelSuites().length > 0) { runner.test(retrySuiteCollection, {}).done(onComplete); } } runner.readTests(path).done(tests => runner.test(tests).done(onComplete)); 

рд╕рд╛рд░рд╛рдВрд╢


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

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

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


All Articles