enbu 0.1.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +257 -175
- package/dist/main.mjs +18776 -314
- package/dist/main.mjs.map +1 -1
- package/package.json +11 -12
package/README.md
CHANGED
|
@@ -6,9 +6,11 @@ Webブラウザ向けのシンプルなE2Eテストフレームワーク。YAML
|
|
|
6
6
|
|
|
7
7
|
## 特徴
|
|
8
8
|
|
|
9
|
-
- **YAML
|
|
9
|
+
- **YAMLで読みやすいステップ定義** - 人間が読みやすいシンプルな形式でテストを記述
|
|
10
10
|
- **セマンティックな要素指定** - テキスト、ARIAロール、ラベル等で要素を特定
|
|
11
11
|
- **自動待機** - 要素が現れるまで自動的に待機(明示的なsleep不要)
|
|
12
|
+
- **Headless/Headed両対応** - CI/CDでの自動実行も、目視でのデバッグも可能
|
|
13
|
+
- **失敗時のデバッグ継続** - テスト失敗時にブラウザ状態を保持したままデバッグ開始可能(AIに調査を依頼することも可能)
|
|
12
14
|
- **agent-browser統合** - Rust製の高速ブラウザ自動化エンジンを利用
|
|
13
15
|
|
|
14
16
|
## 前提条件
|
|
@@ -36,25 +38,25 @@ npx enbu
|
|
|
36
38
|
npx enbu init
|
|
37
39
|
```
|
|
38
40
|
|
|
39
|
-
これにより `.
|
|
41
|
+
これにより `.enbuflow/` ディレクトリとサンプルフローが作成されます。
|
|
40
42
|
|
|
41
43
|
### 2. フローの作成
|
|
42
44
|
|
|
43
|
-
`.
|
|
45
|
+
`.enbuflow/login.enbu.yaml`:
|
|
44
46
|
|
|
45
47
|
```yaml
|
|
46
48
|
# ログインフローのテスト
|
|
47
49
|
steps:
|
|
48
50
|
- open: https://example.com/login
|
|
49
|
-
- click:
|
|
50
|
-
-
|
|
51
|
-
selector:
|
|
52
|
-
|
|
53
|
-
-
|
|
54
|
-
selector:
|
|
55
|
-
|
|
56
|
-
- click:
|
|
57
|
-
- assertVisible:
|
|
51
|
+
- click: ログイン
|
|
52
|
+
- fill:
|
|
53
|
+
selector: メールアドレス
|
|
54
|
+
value: user@example.com
|
|
55
|
+
- fill:
|
|
56
|
+
selector: パスワード
|
|
57
|
+
value: password123
|
|
58
|
+
- click: 送信
|
|
59
|
+
- assertVisible: ダッシュボード
|
|
58
60
|
```
|
|
59
61
|
|
|
60
62
|
### 3. テストの実行
|
|
@@ -64,7 +66,238 @@ steps:
|
|
|
64
66
|
npx enbu
|
|
65
67
|
|
|
66
68
|
# 特定のフローを実行
|
|
67
|
-
npx enbu .
|
|
69
|
+
npx enbu .enbuflow/login.enbu.yaml
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## コマンドリファレンス
|
|
73
|
+
|
|
74
|
+
### ページを開く
|
|
75
|
+
|
|
76
|
+
```yaml
|
|
77
|
+
steps:
|
|
78
|
+
- open: https://example.com
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### クリック
|
|
82
|
+
|
|
83
|
+
```yaml
|
|
84
|
+
steps:
|
|
85
|
+
# セマンティックセレクタ(テキスト、ラベル、ARIAロール等)
|
|
86
|
+
- click: ログイン
|
|
87
|
+
|
|
88
|
+
# CSSセレクタ
|
|
89
|
+
- click: "#submit-button"
|
|
90
|
+
- click: "[data-testid='add-to-cart']"
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### テキスト入力
|
|
94
|
+
|
|
95
|
+
```yaml
|
|
96
|
+
steps:
|
|
97
|
+
# fill: 入力欄をクリアしてから入力
|
|
98
|
+
- fill:
|
|
99
|
+
selector: ユーザー名
|
|
100
|
+
value: 山田太郎
|
|
101
|
+
|
|
102
|
+
# type: 既存テキストに追記
|
|
103
|
+
- type:
|
|
104
|
+
selector: 検索欄
|
|
105
|
+
value: 追加テキスト
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### キー入力
|
|
109
|
+
|
|
110
|
+
```yaml
|
|
111
|
+
steps:
|
|
112
|
+
# Enterキーを押す
|
|
113
|
+
- press: Enter
|
|
114
|
+
|
|
115
|
+
# Tabキーを押す
|
|
116
|
+
- press: Tab
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### アサーション
|
|
120
|
+
|
|
121
|
+
```yaml
|
|
122
|
+
steps:
|
|
123
|
+
# 要素が表示されていることを確認
|
|
124
|
+
- assertVisible: ログイン成功
|
|
125
|
+
|
|
126
|
+
# 要素が表示されていないことを確認
|
|
127
|
+
- assertNotVisible: エラー
|
|
128
|
+
|
|
129
|
+
# 要素が有効であることを確認
|
|
130
|
+
- assertEnabled: 送信ボタン
|
|
131
|
+
|
|
132
|
+
# チェックボックスがチェックされていることを確認
|
|
133
|
+
- assertChecked: 利用規約に同意
|
|
134
|
+
|
|
135
|
+
# チェックボックスがチェックされていないことを確認
|
|
136
|
+
- assertChecked:
|
|
137
|
+
selector: オプション
|
|
138
|
+
checked: false
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### スクリーンショット
|
|
142
|
+
|
|
143
|
+
```yaml
|
|
144
|
+
steps:
|
|
145
|
+
# 通常のスクリーンショット
|
|
146
|
+
- screenshot: ./screenshots/result.png
|
|
147
|
+
|
|
148
|
+
# フルページスクリーンショット
|
|
149
|
+
- screenshot:
|
|
150
|
+
path: ./screenshots/fullpage.png
|
|
151
|
+
full: true
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### スナップショット(デバッグ用)
|
|
155
|
+
|
|
156
|
+
```yaml
|
|
157
|
+
steps:
|
|
158
|
+
- snapshot: {}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
現在のページのアクセシビリティツリーを取得します。デバッグ時に要素の確認に使用します。
|
|
162
|
+
|
|
163
|
+
### スクロール
|
|
164
|
+
|
|
165
|
+
```yaml
|
|
166
|
+
steps:
|
|
167
|
+
# 方向を指定してスクロール
|
|
168
|
+
- scroll:
|
|
169
|
+
direction: down
|
|
170
|
+
amount: 500
|
|
171
|
+
|
|
172
|
+
# 要素が見えるまでスクロール
|
|
173
|
+
- scrollIntoView: フッター
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### 待機
|
|
177
|
+
|
|
178
|
+
```yaml
|
|
179
|
+
steps:
|
|
180
|
+
# ミリ秒で待機
|
|
181
|
+
- wait: 2000
|
|
182
|
+
|
|
183
|
+
# 要素が表示されるまで待機
|
|
184
|
+
- wait:
|
|
185
|
+
selector: "#loading-complete"
|
|
186
|
+
|
|
187
|
+
# テキストが表示されるまで待機
|
|
188
|
+
- wait:
|
|
189
|
+
text: 読み込み完了
|
|
190
|
+
|
|
191
|
+
# URLが変わるまで待機
|
|
192
|
+
- wait:
|
|
193
|
+
url: /dashboard
|
|
194
|
+
|
|
195
|
+
# ページ読み込み状態を待機
|
|
196
|
+
- wait:
|
|
197
|
+
load: networkidle
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### JavaScript実行
|
|
201
|
+
|
|
202
|
+
```yaml
|
|
203
|
+
steps:
|
|
204
|
+
- eval: document.title
|
|
205
|
+
|
|
206
|
+
# 複数行
|
|
207
|
+
- eval: |
|
|
208
|
+
const element = document.querySelector('#result');
|
|
209
|
+
return element.textContent;
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
## 環境変数
|
|
213
|
+
|
|
214
|
+
フロー内で環境変数を使用できます:
|
|
215
|
+
|
|
216
|
+
```yaml
|
|
217
|
+
steps:
|
|
218
|
+
- fill:
|
|
219
|
+
selector: パスワード
|
|
220
|
+
value: ${PASSWORD}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### 環境変数の指定方法
|
|
224
|
+
|
|
225
|
+
#### CLI引数で指定
|
|
226
|
+
|
|
227
|
+
```bash
|
|
228
|
+
npx enbu --env PASSWORD=secret123
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
#### YAML内で定義
|
|
232
|
+
|
|
233
|
+
`.enbuflow/login.enbu.yaml`:
|
|
234
|
+
```yaml
|
|
235
|
+
env:
|
|
236
|
+
BASE_URL: https://staging.example.com
|
|
237
|
+
steps:
|
|
238
|
+
- open: ${BASE_URL}/login
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
## CLI オプション
|
|
242
|
+
|
|
243
|
+
```bash
|
|
244
|
+
npx enbu [options] [flow-files...]
|
|
245
|
+
|
|
246
|
+
オプション:
|
|
247
|
+
--headed ブラウザを表示して実行(デフォルト: ヘッドレス)
|
|
248
|
+
--env KEY=VALUE 環境変数を設定(複数回指定可)
|
|
249
|
+
--timeout <ms> デフォルトタイムアウト(デフォルト: 30000)
|
|
250
|
+
--screenshot 失敗時にスクリーンショットを保存
|
|
251
|
+
--bail 最初の失敗時にテストを停止
|
|
252
|
+
--session <name> agent-browserのセッション名を指定
|
|
253
|
+
--parallel <N> N個のフローを並列実行
|
|
254
|
+
-v, --verbose 詳細なログを出力
|
|
255
|
+
-h, --help ヘルプを表示
|
|
256
|
+
-V, --version バージョンを表示
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
## ディレクトリ構成
|
|
260
|
+
|
|
261
|
+
```
|
|
262
|
+
your-project/
|
|
263
|
+
├── .enbuflow/
|
|
264
|
+
│ ├── login.enbu.yaml
|
|
265
|
+
│ ├── checkout.enbu.yaml
|
|
266
|
+
│ └── shared/
|
|
267
|
+
│ └── auth.enbu.yaml
|
|
268
|
+
└── package.json
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
## CI/CD統合
|
|
272
|
+
|
|
273
|
+
### GitHub Actions
|
|
274
|
+
|
|
275
|
+
```yaml
|
|
276
|
+
name: E2E Tests
|
|
277
|
+
|
|
278
|
+
on: [push, pull_request]
|
|
279
|
+
|
|
280
|
+
jobs:
|
|
281
|
+
test:
|
|
282
|
+
runs-on: ubuntu-latest
|
|
283
|
+
steps:
|
|
284
|
+
- uses: actions/checkout@v4
|
|
285
|
+
|
|
286
|
+
- name: Setup Node.js
|
|
287
|
+
uses: actions/setup-node@v4
|
|
288
|
+
with:
|
|
289
|
+
node-version: '20'
|
|
290
|
+
|
|
291
|
+
- name: Install agent-browser
|
|
292
|
+
run: npm install -g agent-browser
|
|
293
|
+
|
|
294
|
+
- name: Install browsers
|
|
295
|
+
run: agent-browser install --with-deps
|
|
296
|
+
|
|
297
|
+
- name: Run E2E tests
|
|
298
|
+
run: npx enbu
|
|
299
|
+
env:
|
|
300
|
+
PASSWORD: ${{ secrets.TEST_PASSWORD }}
|
|
68
301
|
```
|
|
69
302
|
|
|
70
303
|
## agent-browser コマンド対応表
|
|
@@ -79,8 +312,8 @@ npx enbu .abflow/login.enbu.yaml
|
|
|
79
312
|
| `click <selector>` | ✅ | `- click: <selector>` |
|
|
80
313
|
| `dblclick <selector>` | ❌ | - |
|
|
81
314
|
| `focus <selector>` | ❌ | - |
|
|
82
|
-
| `type <selector> <text>` | ✅ | `- type: { selector: <selector>, value: <
|
|
83
|
-
| `fill <selector> <text>` | ✅ | `- fill: { selector: <selector>, value: <
|
|
315
|
+
| `type <selector> <text>` | ✅ | `- type: { selector: <selector>, value: <value> }` |
|
|
316
|
+
| `fill <selector> <text>` | ✅ | `- fill: { selector: <selector>, value: <value> }` |
|
|
84
317
|
| `press <key>` | ✅ | `- press: <key>` |
|
|
85
318
|
| `keydown <key>` | ❌ | - |
|
|
86
319
|
| `keyup <key>` | ❌ | - |
|
|
@@ -92,9 +325,9 @@ npx enbu .abflow/login.enbu.yaml
|
|
|
92
325
|
| `scrollintoview <selector>` | ✅ | `- scrollIntoView: <selector>` |
|
|
93
326
|
| `drag <source> <target>` | ❌ | - |
|
|
94
327
|
| `upload <selector> <files>` | ❌ | - |
|
|
95
|
-
| `screenshot [path]` | ✅ | `- screenshot: <path>` |
|
|
328
|
+
| `screenshot [path]` | ✅ | `- screenshot: <path>` または `{ path: <path>, full: true }` |
|
|
96
329
|
| `pdf <path>` | ❌ | - |
|
|
97
|
-
| `snapshot` | ✅ | `- snapshot` |
|
|
330
|
+
| `snapshot` | ✅ | `- snapshot: {}` |
|
|
98
331
|
| `eval <js>` | ✅ | `- eval: <script>` |
|
|
99
332
|
| `close` | ❌ | - |
|
|
100
333
|
|
|
@@ -123,13 +356,13 @@ npx enbu .abflow/login.enbu.yaml
|
|
|
123
356
|
|
|
124
357
|
| agent-browser | 対応 | YAML記法 |
|
|
125
358
|
|---------------|:----:|----------|
|
|
126
|
-
| `find role <role> <action> [value]` |
|
|
127
|
-
| `find text <text> <action>` |
|
|
128
|
-
| `find label <label> <action> [value]` |
|
|
129
|
-
| `find placeholder <placeholder> <action> [value]` |
|
|
130
|
-
| `find alt <text> <action>` |
|
|
131
|
-
| `find title <text> <action>` |
|
|
132
|
-
| `find testid <id> <action> [value]` |
|
|
359
|
+
| `find role <role> <action> [value]` | ❌ | - |
|
|
360
|
+
| `find text <text> <action>` | ❌ | - |
|
|
361
|
+
| `find label <label> <action> [value]` | ❌ | - |
|
|
362
|
+
| `find placeholder <placeholder> <action> [value]` | ❌ | - |
|
|
363
|
+
| `find alt <text> <action>` | ❌ | - |
|
|
364
|
+
| `find title <text> <action>` | ❌ | - |
|
|
365
|
+
| `find testid <id> <action> [value]` | ❌ | - |
|
|
133
366
|
| `find first <selector> <action> [value]` | ❌ | - |
|
|
134
367
|
| `find last <selector> <action> [value]` | ❌ | - |
|
|
135
368
|
| `find nth <n> <selector> <action> [value]` | ❌ | - |
|
|
@@ -245,157 +478,6 @@ npx enbu .abflow/login.enbu.yaml
|
|
|
245
478
|
|----------|----------|
|
|
246
479
|
| assertNotVisible | `- assertNotVisible: <selector>` |
|
|
247
480
|
|
|
248
|
-
## コマンドリファレンス
|
|
249
|
-
|
|
250
|
-
### ページを開く
|
|
251
|
-
|
|
252
|
-
```yaml
|
|
253
|
-
steps:
|
|
254
|
-
- open: https://example.com
|
|
255
|
-
```
|
|
256
|
-
|
|
257
|
-
### クリック
|
|
258
|
-
|
|
259
|
-
```yaml
|
|
260
|
-
steps:
|
|
261
|
-
# セマンティックセレクタ(テキスト、ラベル、ARIAロール等)
|
|
262
|
-
- click: "ログイン"
|
|
263
|
-
|
|
264
|
-
# CSSセレクタ
|
|
265
|
-
- click:
|
|
266
|
-
selector: "#submit-button"
|
|
267
|
-
```
|
|
268
|
-
|
|
269
|
-
### テキスト入力
|
|
270
|
-
|
|
271
|
-
```yaml
|
|
272
|
-
steps:
|
|
273
|
-
- type:
|
|
274
|
-
selector: "ユーザー名"
|
|
275
|
-
text: "山田太郎"
|
|
276
|
-
```
|
|
277
|
-
|
|
278
|
-
### アサーション
|
|
279
|
-
|
|
280
|
-
```yaml
|
|
281
|
-
steps:
|
|
282
|
-
# 要素が表示されていることを確認
|
|
283
|
-
- assertVisible: "ログイン成功"
|
|
284
|
-
|
|
285
|
-
# 要素が表示されていないことを確認
|
|
286
|
-
- assertNotVisible: "エラー"
|
|
287
|
-
```
|
|
288
|
-
|
|
289
|
-
### スクリーンショット
|
|
290
|
-
|
|
291
|
-
```yaml
|
|
292
|
-
steps:
|
|
293
|
-
- screenshot: ./screenshots/result.png
|
|
294
|
-
```
|
|
295
|
-
|
|
296
|
-
### スナップショット(デバッグ用)
|
|
297
|
-
|
|
298
|
-
```yaml
|
|
299
|
-
steps:
|
|
300
|
-
- snapshot
|
|
301
|
-
```
|
|
302
|
-
|
|
303
|
-
現在のページのアクセシビリティツリーを取得します。デバッグ時に要素の確認に使用します。
|
|
304
|
-
|
|
305
|
-
### JavaScript実行
|
|
306
|
-
|
|
307
|
-
```yaml
|
|
308
|
-
steps:
|
|
309
|
-
- eval: "document.title"
|
|
310
|
-
|
|
311
|
-
# 複数行
|
|
312
|
-
- eval: |
|
|
313
|
-
const element = document.querySelector('#result');
|
|
314
|
-
return element.textContent;
|
|
315
|
-
```
|
|
316
|
-
|
|
317
|
-
## 環境変数
|
|
318
|
-
|
|
319
|
-
フロー内で環境変数を使用できます:
|
|
320
|
-
|
|
321
|
-
```yaml
|
|
322
|
-
steps:
|
|
323
|
-
- type:
|
|
324
|
-
selector: "パスワード"
|
|
325
|
-
text: ${PASSWORD}
|
|
326
|
-
```
|
|
327
|
-
|
|
328
|
-
### 環境変数の指定方法
|
|
329
|
-
|
|
330
|
-
#### CLI引数で指定
|
|
331
|
-
|
|
332
|
-
```bash
|
|
333
|
-
npx enbu --env PASSWORD=secret123
|
|
334
|
-
```
|
|
335
|
-
|
|
336
|
-
#### YAML内で定義
|
|
337
|
-
|
|
338
|
-
`.abflow/login.enbu.yaml`:
|
|
339
|
-
```yaml
|
|
340
|
-
env:
|
|
341
|
-
BASE_URL: https://staging.example.com
|
|
342
|
-
steps:
|
|
343
|
-
- open: ${BASE_URL}/login
|
|
344
|
-
```
|
|
345
|
-
|
|
346
|
-
## CLI オプション
|
|
347
|
-
|
|
348
|
-
```bash
|
|
349
|
-
npx enbu [options] [flow-files...]
|
|
350
|
-
|
|
351
|
-
オプション:
|
|
352
|
-
--headed ブラウザを表示して実行(デフォルト: ヘッドレス)
|
|
353
|
-
--env KEY=VALUE 環境変数を設定
|
|
354
|
-
--timeout <ms> デフォルトタイムアウト(デフォルト: 30000)
|
|
355
|
-
--screenshot 失敗時にスクリーンショットを保存
|
|
356
|
-
-v, --verbose 詳細なログを出力
|
|
357
|
-
-h, --help ヘルプを表示
|
|
358
|
-
--version バージョンを表示
|
|
359
|
-
```
|
|
360
|
-
|
|
361
|
-
## ディレクトリ構成
|
|
362
|
-
|
|
363
|
-
```
|
|
364
|
-
your-project/
|
|
365
|
-
├── .abflow/
|
|
366
|
-
│ ├── login.enbu.yaml
|
|
367
|
-
│ ├── checkout.enbu.yaml
|
|
368
|
-
│ └── shared/
|
|
369
|
-
│ └── auth.enbu.yaml
|
|
370
|
-
└── package.json
|
|
371
|
-
```
|
|
372
|
-
|
|
373
|
-
## CI/CD統合
|
|
374
|
-
|
|
375
|
-
### GitHub Actions
|
|
376
|
-
|
|
377
|
-
```yaml
|
|
378
|
-
name: E2E Tests
|
|
379
|
-
|
|
380
|
-
on: [push, pull_request]
|
|
381
|
-
|
|
382
|
-
jobs:
|
|
383
|
-
test:
|
|
384
|
-
runs-on: ubuntu-latest
|
|
385
|
-
steps:
|
|
386
|
-
- uses: actions/checkout@v4
|
|
387
|
-
|
|
388
|
-
- name: Setup Node.js
|
|
389
|
-
uses: actions/setup-node@v4
|
|
390
|
-
with:
|
|
391
|
-
node-version: '20'
|
|
392
|
-
|
|
393
|
-
- name: Run E2E tests
|
|
394
|
-
run: npx enbu
|
|
395
|
-
env:
|
|
396
|
-
PASSWORD: ${{ secrets.TEST_PASSWORD }}
|
|
397
|
-
```
|
|
398
|
-
|
|
399
481
|
## ライセンス
|
|
400
482
|
|
|
401
483
|
MIT
|