Use when working on accessibility, a11y, WCAG, ARIA, screen readers, keyboard nav, focus order, contrast, alt text, captions, reduced motion, or target sizes; not language/culture/device (see inclusive-design).
日本語の概要は準備中です。原文の説明を表示しています。
Use when writing E2E/integration tests, testing native interactions like permissions or system dialogs, capturing UI regressions, or validating cross-platform behavior (Patrol 4.x).
インストール方法を見るインストールする前に、エージェントに与えられる指示の中身を確認できます。
Design, implement, and run end-to-end (E2E) tests using Patrol 4.x in Flutter projects.
Use this skill when:
Follow the official Patrol documentation for installation and project initialization: https://patrol.leancode.co/documentation#setup
Key Patrol conventions:
patrol as a dev dependency.patrol_test/._test.dart suffix.patrol test.Follow these steps when implementing or updating Patrol tests.
Break the feature into:
Rules:
Basic Patrol structure:
import 'package:flutter_test/flutter_test.dart';
import 'package:patrol/patrol.dart';
void main() {
patrolTest(
'user can log in successfully',
($) async {
await $.pumpWidgetAndSettle(const MyApp());
const email = String.fromEnvironment('E2E_EMAIL');
const password = String.fromEnvironment('E2E_PASSWORD');
await $(#emailField).enterText(email);
await $(#passwordField).enterText(password);
await $(#loginButton).tap();
await $.waitUntilVisible($(#homeScreenTitle));
expect($(#homeScreenTitle).text, equals('Welcome'));
},
);
}
Key concepts:
patrolTest() instead of testWidgets().$ is the Patrol tester.$(#keyName) to find widgets by Key.waitUntilVisible).For OS-level permission dialogs:
patrolTest('grants camera permission', ($) async {
await $.pumpWidgetAndSettle(const MyApp());
await $(#openCameraButton).tap();
if (await $.native.isPermissionDialogVisible()) {
await $.native.grantPermission();
}
await $.waitUntilVisible($(#cameraPreview));
});
Use native automation only when required by the feature.
Finding widgets:
$('some text') // by text
$(TextField) // by type
$(Icons.arrow_back) // by icon
Tapping:
// Tap a widget containing a specific text label
await $(Container).$('click').tap();
// Tap a container that contains an ElevatedButton
await $(Container).containing(ElevatedButton).tap();
// Tap only the enabled ElevatedButton
await $(ElevatedButton)
.which<ElevatedButton>(
(b) => b.enabled,
)
.tap();
Entering text:
// Enter text into the second TextField on screen
await $(TextField).at(1).enterText('your input');
Scrolling:
await $(widget_you_want_to_scroll_to).scrollTo();
Native interactions:
// Grant permission while app is in use
await $.native.grantPermissionWhenInUse();
// Open notification shade and tap a notification by text
await $.native.openNotifications();
await $.native.tapOnNotificationBySelector(
Selector(textContains: 'text'),
);
Run all tests:
patrol test
Run a specific file with live reload (development mode):
patrol develop -t integration_test/my_test.dart
Run a specific file:
patrol test --target patrol_test/login_test.dart
Run on web:
patrol test --device chrome
Headless web (CI):
patrol test --device chrome --web-headless true
Filter by tags:
patrol test --tags android
Flaky tests undermine confidence. Apply these patterns:
// AVOID — arbitrary delay
await Future.delayed(Duration(seconds: 3));
// PREFER — explicit wait condition
await $.waitUntilVisible($(#targetWidget));
// For animations, pump until settled
await $.pumpAndSettle();
Future.delayed as a synchronization mechanism.waitUntilVisible or waitUntilExists to wait for UI state.settleTimeout in PatrolTesterConfig for slow CI environments.When applied, this skill produces:
Key additions to production code.patrol test command(s) to execute locally.Checkpoint: Run patrol test --target <file> locally to confirm the test passes before committing.
A valid Patrol test must be:
String.fromEnvironment, never hardcoded.--web-headless true or on emulator.まだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
Use when working on accessibility, a11y, WCAG, ARIA, screen readers, keyboard nav, focus order, contrast, alt text, captions, reduced motion, or target sizes; not language/culture/device (see inclusive-design).
日本語の概要は準備中です。原文の説明を表示しています。
Use when creating a feature, designing folder structure, adding repositories/services/view models, wiring dependency injection, or deciding which layer owns logic.
日本語の概要は準備中です。原文の説明を表示しています。
Use when creating a Cubit or Bloc, modeling state with sealed classes or status enums, wiring BlocBuilder/BlocListener/BlocProvider, writing bloc tests, or choosing between Cubit and Bloc.
日本語の概要は準備中です。原文の説明を表示しています。
Use when asked to review a PR, MR, branch, or diff, audit changed files, or check code quality.
日本語の概要は準備中です。原文の説明を表示しています。
Use when writing switch statements, refactoring if-else chains, creating data classes, choosing records vs classes, destructuring values, or modernizing pre-Dart-3 code.
日本語の概要は準備中です。原文の説明を表示しています。
Use when building AI agents in Dart, implementing Genkit flows or tools, integrating LLMs into Dart or Flutter applications, or using Genkit Dart plugins.
日本語の概要は準備中です。原文の説明を表示しています。