рд╕реНрдкрдВрджрди рдПрдХреАрдХрд░рдг рдЯреЗрд╕реНрдЯ - рдпрд╣ рдЖрд╕рд╛рди рд╣реИ

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


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


final SerializableFinder button = find.byValueKey("button"); 

рдлрд┐рд░ рдЙрдирдХреЗ рд╕рд╛рде рдХреБрдЫ рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░реЗрдВ:


 driver = await FlutterDriver.connect(); ... await driver.tap(button); 

рдФрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрд╡рд╢реНрдпрдХ UI рддрддреНрд╡ рд╡рд╛рдВрдЫрд┐рдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИрдВ:


 final SerializableFinder text = find.byValueKey("text"); expect(await driver.getText(text), "some text"); 

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


рд╕реНрдХреНрд░реАрди рд╡рд╕реНрддреБрдУрдВ


рдПрдВрдбреНрд░реЙрдЗрдб ( рдХрд╛рдХрд╛рдУ ) рдореЗрдВ, рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдХреНрд░реАрди рд╕реЗ рд╕реНрдХреНрд░реАрди (рдкреЗрдЬ-рдСрдмреНрдЬреЗрдХреНрдЯ) рдореЗрдВ рдпреВрдЖрдИ рддрддреНрд╡реЛрдВ рдХреЛ рд╕рдореВрд╣реАрдХреГрдд рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕реА рддрд░рд╣ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЗрд╕ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдлрд╝реНрд▓рдЯрд░ рдореЗрдВ, UI рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рди рдХреЗрд╡рд▓ Finder (UI рддрддреНрд╡ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдмрд▓реНрдХрд┐ FlutterDriver (рдПрдХ рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП), рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ FlutterDriver рдореЗрдВ рдПрдХ рд▓рд┐рдВрдХ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ FlutterDriver ред Screen ред


рдкреНрд░рддреНрдпреЗрдХ UI рддрддреНрд╡ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо DWidget рд╡рд░реНрдЧ (D - рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ Dart рд╢рдмреНрдж рд╕реЗ) рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдПрдХ DWidget рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП DWidget рдПрдХ FlutterDriver рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЗрд╕ UI рддрддреНрд╡ рдкрд░ рдХреНрд░рд┐рдпрд╛рдПрдВ рдХреА рдЬрд╛рдПрдВрдЧреА, рд╕рд╛рде рд╣реА рдПрдХ ValueKey , рдЬреЛ рдЙрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рд╡рд┐рдЬреЗрдЯ рдХреЗ ValueKey рд╕реНрдкрдВрджрди рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рдмрд╛рддрдЪреАрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:


 class DWidget { final FlutterDriver _driver; final SerializableFinder _finder; DWidget(this._driver, dynamic valueKey) : _finder = find.byValueKey(valueKey); ... 

find.byValueKey(тАж) рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ DWidget рдмрдирд╛рддреЗ рд╕рдордп рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП ValueKey рд▓рд┐рдП DWidget рдореВрд▓реНрдп рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ DWidget рдХреЛ рд╡рд╛рдВрдЫрд┐рдд SerializableFinder рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ред рдкреНрд░рддреНрдпреЗрдХ DWidget рдмрдирд╛рддреЗ рд╕рдордп FlutterDriver рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкрд╛рд╕ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк FlutterDriver рдХреЛ BaseScreen рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ FlutterDriver рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ BaseScreen рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП BaseScreen рд▓рд┐рдП рдПрдХ рдирдИ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝ BaseScreen :


 abstract class BaseScreen { final FlutterDriver _driver; BaseScreen(this._driver); DWidget dWidget(dynamic key) => DWidget(_driver, key); ... 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕реНрдХреНрд░реАрди рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдирд╛ рдФрд░ рдЙрдирдореЗрдВ UI рддрддреНрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛:


 class MainScreen extends BaseScreen { MainScreen(FlutterDriver driver) : super(driver); DWidget get button => dWidget('button'); DWidget get textField => dWidget('text_field'); ... } 

await рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛


рдПрдХ рдФрд░ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрд╛рдд рдирд╣реАрдВ рд╣реИ рдЬрдм FlutterDriver рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╕реЗ рдкрд╣рд▓реЗ await рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


 await driver.tap(button); await driver.scrollUntilVisible(list, checkBox); await driver.tap(checkBox); await driver.tap(text); await driver.enterText("some text"); 

await рдХреЛ рднреВрд▓рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдмрд┐рдирд╛, рдкрд░реАрдХреНрд╖рдг рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ driver рддрд░реАрдХреЗ Future<void> рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬрдм рдЙрдиреНрд╣реЗрдВ рдмрд┐рдирд╛ await рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ await рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░ рдкрд╣рд▓реЗ await рддрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдмрд╛рдХреА рд╡рд┐рдзрд┐ "рдмрд╛рдж рдореЗрдВ рд╕реНрдердЧрд┐рдд рдХрд░ рджреА рдЬрд╛рддреА рд╣реИ"ред


рдЖрдк рдЗрд╕реЗ Future "рд▓рдкреЗрдЯреЛ" рд╣реЛрдЧрд╛ рдХрд┐ рдПрдХ TestAction рдмрдирд╛рдХрд░ TestAction рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдо рдЕрдЧрд▓реЗ рдкрд░ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдкреВрд░реА рд╣реЛрдиреЗ рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд╕рдХреЗрдВ:


 typedef TestAction = Future<void> Function(); 

(рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, TestAction рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди (рдпрд╛ рд▓реИрдореНрдмреНрдбрд╛) рд╣реИ рдЬреЛ рдПрдХ Future<void> рд▓реМрдЯрд╛рддрд╛ рд╣реИ)


рдЕрдм рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдмрд┐рдирд╛ TestAction рдЕрдиреБрдХреНрд░рдо рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ:


 Future<void> runTestActions(Iterable<TestAction> actions) async { for (final action in actions) { await action(); } } 

рдПрдХ DWidget рдореЗрдВ TestAction рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


DWidget рдЙрдкрдпреЛрдЧ UI рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ рдпрджрд┐ рдпреЗ рдХреНрд░рд┐рдпрд╛рдПрдВ TestAction рддрд╛рдХрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ runTestAction рдкрджреНрдзрддрд┐ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, DWidget рд╡рд░реНрдЧ рдореЗрдВ рдХрд╛рд░реНрдп рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реЛрдВрдЧреА:


 class DWidget { final FlutterDriver _driver; final SerializableFinder _finder; ... TestAction tap({Duration timeout}) => () => _driver.tap(_finder, timeout: timeout); TestAction setText(String text, {Duration timeout}) => () async { await _driver.tap(_finder, timeout: timeout); await _driver.enterText(text ?? "", timeout: timeout); }; ... } 

рдЕрдм рдЖрдк рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:


 class MainScreen extends BaseScreen { MainScreen(FlutterDriver driver) : super(driver); DWidget get field_1 => dWidget('field_1'); DWidget get field_2 => dWidget('field_2'); DWidget field2Variant(int i) => dWidget('variant_$i'); DWidget get result => dWidget('result'); } тАж final mainScreen = MainScreen(driver); await runTestActions([ mainScreen.result.hasText("summa = 0"), mainScreen.field_1.setText("3"), mainScreen.field_2.tap(), mainScreen.field2Variant(2).tap(), mainScreen.result.hasText("summa = 5"), ]); 

рдпрджрд┐ рдЖрдкрдХреЛ runTestActions рдореЗрдВ рдХреБрдЫ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ runTestActions рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдПрдХ DWidget рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ Future<void> рд▓реМрдЯрд╛рдПрдЧрд╛:


 await runTestActions([ mainScreen.result.hasText("summa = 0"), () => driver.requestData("some_message"), () async => print("some_text"), mainScreen.field_1.setText("3"), ]); 

FlutterDriverHelper


FlutterDriver рдореЗрдВ рдпреВрдЖрдИ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ (рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рдирд╛, рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдФрд░ рджрд░реНрдЬ рдХрд░рдирд╛, рд╕реНрдХреНрд░реЙрд▓ рдХрд░рдирд╛ рдЖрджрд┐) рдФрд░ рдЗрди рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП DWidget рдореЗрдВ рдЗрд╕реА рддрд░реАрдХреЗ рд╣реИрдВ рдЬреЛ TestAction ред


рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдЖрд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХреЛрдб рдХреЛ FlutterDriverHelper рдкрд░ рдлрд╝реНрд▓рдЯрд░рдбреНрд░рд╛рдЗрд╡рд░ FlutterDriverHelper рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдЬрд┐рд╕рдореЗрдВ рддрддреНрд╡ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдмрдирд╛рдП рдЧрдП рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, ListView.builder ), FlutterDriver рдореЗрдВ рдПрдХ scrollUntilVisible рд╡рд┐рдзрд┐ рд╣реИ:


 Future<void> scrollUntilVisible( SerializableFinder scrollable, SerializableFinder item, { double alignment = 0.0, double dxScroll = 0.0, double dyScroll = 0.0, Duration timeout, }) async { ... } 

рдпрд╣ рд╡рд┐рдзрд┐ рд╕реНрдХреНрд░реЙрд▓ рд╡рд┐рдЬреЗрдЯ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рджрд┐рд╢рд╛ рдореЗрдВ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рддреА рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╕реНрдХреНрд░реАрди рдкрд░ item рд╡рд┐рдЬреЗрдЯ рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ (рдпрд╛ рдЬрдм рддрдХ рдХреЛрдИ timeout )ред рдкреНрд░рддреНрдпреЗрдХ scrollable рдкрд░ scrollable рдХрд░рдиреЗ scrollable рдкрд╛рд╕ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, DScrollItem рд╡рд░реНрдЧ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдПрдХ DWidget рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ DWidget рдФрд░ рдПрдХ рд╕реВрдЪреА рдЖрдЗрдЯрдо рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ scrollable рдХрд░рдиреЗ scrollable рд▓рд┐рдВрдХ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реНрдХреНрд░реЙрд▓ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдХреЗрд╡рд▓ dyScroll рдпрд╛ dxScroll рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИ:


 class SecondScreen extends BaseScreen { SecondScreen(FlutterDriver driver) : super(driver); DWidget get list => dWidget("list"); DScrollItem item(int index) => dScrollItem('item_$index', list); } ... final secondScreen = SecondScreen(driver); await runTestActions([ secondScreen.item(42).scrollUntilVisible(dyScroll: -300), ... ]); 

рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рджреМрд░рд╛рди, рдЖрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ FlutterDriverHelper рдореЗрдВ рдПрдХ Screenshoter рдЬреЛ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХреЛ рд╡рд░реНрддрдорд╛рди рд╕рдордп рдХреЗ рд╕рд╛рде рд╕рд╣реА рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕рд╣реЗрдЬрддрд╛ рд╣реИ рдФрд░ TestAction рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред


рдЕрдиреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдФрд░ рдЙрдирдХреЗ рд╕рдорд╛рдзрд╛рди


  • рдореБрдЭреЗ рд╕рдордп / рджрд┐рдирд╛рдВрдХ рд╕рдВрд╡рд╛рджреЛрдВ рдореЗрдВ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдорд╛рдирдХ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдорд┐рд▓рд╛ - рдореБрдЭреЗ TestHooks рдХрд╛ рдЙрдкрдпреЛрдЧ TestHooks ред TestHooks рдЯреЗрд╕реНрдЯ рдХреЗ рджреМрд░рд╛рди рд╡рд░реНрддрдорд╛рди рд╕рдордп / рддрд┐рдерд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
  • DropdownButtonFormField рдХреЗ рд▓рд┐рдП рдбреНрд░реЙрдкрдбрд╛рдЙрди рд╕реВрдЪреА рдореЗрдВ DropdownButtonFormField рдЖрдкрдХреЛ DropdownMenuItem рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЗрд╕ DropdownMenuItem рдХреЗ child рд▓рд┐рдП key рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ Flutter Driver рдЗрд╕реЗ рдЦреЛрдЬрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдбреНрд░реЙрдк-рдбрд╛рдЙрди рд╕реВрдЪреА рдореЗрдВ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рдирд╛ рдЕрднреА рддрдХ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ( github.com рдкрд░ рдЬрд╛рд░реА )ред
  • FlutterDriver.getCenter рдкрджреНрдзрддрд┐ рд╕реЗ Future<DriverOffset> , рд▓реЗрдХрд┐рди DriverOffset рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ API ( github.com рдкрд░ рдЬрд╛рд░реА ) рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИ
  • рдХреБрдЫ рдФрд░ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рдФрд░ рд╕реНрдкрд╖реНрдЯ рдЪреАрдЬреЗрдВ рдирд╣реАрдВ рд╣реИрдВ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИрдВред рдЖрдк рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЕрджреНрднреБрдд рд▓реЗрдЦ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рдбреЗрд╕реНрдХрдЯреЙрдк рдкрд░ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдкрд╣рд▓реЗ рдЖрд╡реЗрджрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдереАред
  • рдЖрдк Github Actions рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдпрд╣рд╛рдБ ред

рдпрд╣ рдХрд░реЗрдВ


FlutterDriverHelper рднрд╡рд┐рд╖реНрдп рдХреЗ FlutterDriverHelper рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:


  • рд╡рд╛рдВрдЫрд┐рдд рд╕реВрдЪреА рдЖрдЗрдЯрдо рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдпрджрд┐ рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд╕рдордп рдпрд╣ рд╕реНрдХреНрд░реАрди рдкрд░ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдХрд╛рд╕реНрдкреЗрд░реЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ, рддреЛ рджреЛрдиреЛрдВ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рднреАред
  • рдПрдХ Dwidget рдпрд╛ DscrollItem рд╕рд╛рде рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ред

рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдФрд░ рд░рдЪрдирд╛рддреНрдордХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдХрд░рддреЗ рд╣реИрдВред


рдЕрджреНрдпрддрди ( TestAction ) : рд╕рдВрд╕реНрдХрд░рдг рез.рез.реж рдореЗрдВ TestAction рдПрдХ рд╡рд░реНрдЧ рдмрди рдЧрдпрд╛, рдЬрд┐рд╕рдореЗрдВ String name рдлрд╝реАрд▓реНрдб рд╣реИред рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП, runTestActions рдореЗрдердб рдореЗрдВ рдХреА рдЧрдИ рд╕рднреА рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рд▓реЙрдЧрд┐рдВрдЧ рдХреЛ runTestActions ред

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


All Articles