translate 시험 2개: 좁은 도구 막대에서는 [더 보기] 메뉴로 누른다 (예전부터의 실패, rc2 에서도)

- 시험 창의 브라우저 화면이 804 너비라 도구 막대가 좁은 꼴 (640 미만) - 번역 · 작업 현황 단추가 [더 보기] 메뉴 안에 있어
  툴팁으로 찾던 시험이 실패했다. 앱 쪽 문제 아님 (관리자 10/24: 시험 쪽이면 기대값 그대로, 메뉴를 열어 누름)
- tapToolbar: 넓으면 그 단추, 좁으면 도구 막대 안의 [더 보기] → 같은 항목. 고른 결과는 메뉴가 닫힌 뒤 들어오므로
  (번역이 도는 동안 그리기가 느림) 메뉴가 닫힐 때까지 기다림

확인: analyze 0 · translate_split 1 ×2 · web_translate 1 ×2

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
modular
RyuJongJin 2026-10-24 06:08:55 +09:00
parent b9b23e9122
commit 093cf3252e
2 changed files with 46 additions and 4 deletions

View File

@ -10,6 +10,7 @@ import 'package:jj_mkvmaker/core/languages.dart';
import 'package:jj_mkvmaker/core/models.dart';
import 'package:jj_mkvmaker/core/output_paths.dart';
import 'package:jj_mkvmaker/services/platform_services.dart';
import 'package:jj_mkvmaker/ui/browser/browser_toolbar.dart';
import 'package:jj_mkvmaker/ui/browser_page.dart';
import 'support/temp_dir.dart';
import 'package:path/path.dart' as p;
@ -65,7 +66,7 @@ void main() {
expect(c.pendingJobs, ['MKV 만들기']);
// 화면 분할 열기 → 진행 표시
await tester.tap(find.byTooltip('작업 현황 보기 · 화면 분할 (Ctrl+Shift+J)'));
await tapToolbar(tester, '작업 현황 보기 · 화면 분할 (Ctrl+Shift+J)', '작업 현황');
await tester.pump(const Duration(milliseconds: 300));
expect(find.text('작업 현황'), findsOneWidget);
expect(find.textContaining('▶ 자막 번역'), findsOneWidget);
@ -103,3 +104,23 @@ void main() {
await server.close(force: true);
}, timeout: const Timeout(Duration(minutes: 15)));
}
/// 도구 막대 단추 누르기: 넓으면 [tip] 단추, 좁으면 (640 미만 - 시험 창 804 너비에 패널) [더 보기] 메뉴의 [item]
Future<void> tapToolbar(WidgetTester tester, String tip, String item) async {
if (find.byTooltip(tip).evaluate().isNotEmpty) {
await tester.tap(find.byTooltip(tip));
return;
}
// 도구 막대 안의 [더 보기] (앱 맨 위 줄에도 [더 보기] 가 있다)
await tester.tap(find.descendant(of: find.byType(BrowserToolbar), matching: find.byTooltip('더 보기')));
for (var i = 0; i < 5; i++) {
await tester.pump(const Duration(milliseconds: 100));
}
await tester.tap(find.text(item).last);
// 고른 결과는 메뉴가 닫힌 뒤에 들어온다 - 번역이 도는 동안은 그리기가 느려 정한 시간이 아니라 닫힐 때까지
for (var i = 0; i < 50 && find.byType(PopupMenuItem<String>).evaluate().isNotEmpty; i++) {
await tester.runAsync(() => Future<void>.delayed(const Duration(milliseconds: 50)));
await tester.pump(const Duration(milliseconds: 100));
}
await tester.pump(const Duration(milliseconds: 100));
}

View File

@ -9,6 +9,7 @@ import 'package:jj_mkvmaker/app/bookmarks_controller.dart';
import 'package:jj_mkvmaker/platform/windows/desktop_storage_service.dart';
import 'package:jj_mkvmaker/platform/windows/process_media_tool.dart';
import 'package:jj_mkvmaker/services/platform_services.dart';
import 'package:jj_mkvmaker/ui/browser/browser_toolbar.dart';
import 'package:jj_mkvmaker/ui/browser_page.dart';
import 'support/temp_dir.dart';
import 'package:path/path.dart' as p;
@ -100,7 +101,7 @@ void main() {
expect(d['js'], isNot('no script')); // 페이지 스크립트가 돌았다 (그 글도 번역됨)
// 2. 번역 버튼 → 원문
await tester.tap(find.byTooltip('원문 보기 (번역 끄기)'));
await tapToolbar(tester, '원문 보기 (번역 끄기)', '원문 보기 (번역 끄기)');
d = await waitFor((d) => d['h'] == 'Hello world', '원문 보기');
expect(d['h'], 'Hello world');
expect(d['p'], ' Download the video ');
@ -129,7 +130,7 @@ void main() {
if (Platform.isAndroid) {
// 4. Android 웹뷰는 JavaScript 를 끄면 앱이 넣는 스크립트도 막는다 → 번역 · 페이지 읽기가 안 됨 (설정 설명대로)
expect(await dom(), isEmpty);
await tester.tap(find.byTooltip('이 페이지를 한국어(으)로 번역'));
await tapToolbar(tester, '이 페이지를 한국어(으)로 번역', '이 페이지 번역');
await tester.runAsync(() => Future<void>.delayed(const Duration(seconds: 3)));
await tester.pump();
// ignore: avoid_print
@ -140,7 +141,7 @@ void main() {
expect(d['late'], ''); // setTimeout 도 돌지 않음
// 4. Edge 는 JavaScript 를 꺼도 번역 버튼으로 번역된다 (앱이 넣는 스크립트는 실행)
await tester.tap(find.byTooltip('이 페이지를 한국어(으)로 번역'));
await tapToolbar(tester, '이 페이지를 한국어(으)로 번역', '이 페이지 번역');
d = await waitFor((d) => hangul.hasMatch(d['h']!), 'JavaScript 끈 채 번역');
expect(d['h'], matches(hangul));
expect(d['js'], matches(hangul)); // "no script" 도 번역
@ -159,3 +160,23 @@ void main() {
await server.close(force: true);
}, timeout: const Timeout(Duration(minutes: 3)));
}
/// 도구 막대 단추 누르기: 넓으면 [tip] 단추, 좁으면 (640 미만 - 시험 창 804 너비에 패널) [더 보기] 메뉴의 [item]
Future<void> tapToolbar(WidgetTester tester, String tip, String item) async {
if (find.byTooltip(tip).evaluate().isNotEmpty) {
await tester.tap(find.byTooltip(tip));
return;
}
// 도구 막대 안의 [더 보기] (앱 맨 위 줄에도 [더 보기] 가 있다)
await tester.tap(find.descendant(of: find.byType(BrowserToolbar), matching: find.byTooltip('더 보기')));
for (var i = 0; i < 5; i++) {
await tester.pump(const Duration(milliseconds: 100));
}
await tester.tap(find.text(item).last);
// 고른 결과는 메뉴가 닫힌 뒤에 들어온다 - 번역이 도는 동안은 그리기가 느려 정한 시간이 아니라 닫힐 때까지
for (var i = 0; i < 50 && find.byType(PopupMenuItem<String>).evaluate().isNotEmpty; i++) {
await tester.runAsync(() => Future<void>.delayed(const Duration(milliseconds: 50)));
await tester.pump(const Duration(milliseconds: 100));
}
await tester.pump(const Duration(milliseconds: 100));
}