4242 identify_page_type ,
4343 make_tab_checker ,
4444)
45- from autowsgr .ui .utils import click_and_wait_for_page
45+ from autowsgr .ui .utils import NavigationError , click_and_wait_for_page
4646from autowsgr .vision import OCREngine , PixelChecker
4747
4848
@@ -185,6 +185,9 @@ def go_back(self) -> None:
185185 target = PageName .MAIN ,
186186 )
187187
188+ _PANEL_SWITCH_MAX_RETRIES = 3
189+ _PANEL_SWITCH_RETRY_DELAY = 1.0
190+
188191 def switch_panel (self , panel : MapPanel ) -> None :
189192 """切换到指定面板标签并验证到达。"""
190193 current = self .get_active_panel (self ._ctrl .screenshot ())
@@ -194,13 +197,44 @@ def switch_panel(self, panel: MapPanel) -> None:
194197 panel .value ,
195198 )
196199 target_idx = PANEL_TO_INDEX [panel ]
197- click_and_wait_for_page (
198- self ._ctrl ,
199- click_coord = CLICK_PANEL [panel ],
200- checker = make_tab_checker (TabbedPageType .MAP , target_idx ),
201- source = f'地图-{ current .value if current else "?" } ' ,
202- target = f'地图-{ panel .value } ' ,
203- )
200+ source = f'地图-{ current .value if current else "?" } '
201+ target = f'地图-{ panel .value } '
202+ last_err : NavigationError | None = None
203+
204+ for attempt in range (1 , self ._PANEL_SWITCH_MAX_RETRIES + 1 ):
205+ if attempt > 1 :
206+ _log .warning (
207+ '[UI] 面板切换重试 {}/{}: {} -> {} (等 {:.1f}s)' ,
208+ attempt ,
209+ self ._PANEL_SWITCH_MAX_RETRIES ,
210+ source ,
211+ target ,
212+ self ._PANEL_SWITCH_RETRY_DELAY ,
213+ )
214+ time .sleep (self ._PANEL_SWITCH_RETRY_DELAY )
215+
216+ try :
217+ click_and_wait_for_page (
218+ self ._ctrl ,
219+ click_coord = CLICK_PANEL [panel ],
220+ checker = make_tab_checker (TabbedPageType .MAP , target_idx ),
221+ source = source ,
222+ target = target ,
223+ )
224+ return
225+ except NavigationError as e :
226+ last_err = e
227+ _log .warning (
228+ '[UI] 面板切换失败 ({}/{}): {} -> {}' ,
229+ attempt ,
230+ self ._PANEL_SWITCH_MAX_RETRIES ,
231+ source ,
232+ target ,
233+ )
234+
235+ raise NavigationError (
236+ f'面板切换失败 (已重试 { self ._PANEL_SWITCH_MAX_RETRIES } 次): { source } -> { target } '
237+ ) from last_err
204238
205239 def ensure_panel (self , panel : MapPanel ) -> None :
206240 """确保当前处于指定面板,若不是则切换。"""
0 commit comments