Playwright异步C#代码转F#:RunAndWaitForNavigationAsync调用异常
问题原因
你当前写法的核心错误是参数类型不匹配:RunAndWaitForNavigationAsync的第一个入参要求是返回Task的异步委托(对应C#代码里的async () => { ... }匿名函数),作用是等导航监听逻辑启动后再执行触发导航的操作,避免竞态。而你直接传入了page.Value.ClickAsync("#xl-form-submit")的执行结果(也就是Task对象),会导致点击操作在导航监听启动前就执行,逻辑失效。
修正代码(F# 6+ 支持原生task表达式版本,推荐)
open System.Text.RegularExpressions open Microsoft.Playwright // 你的其他业务逻辑 let waitNavOptions = PageWaitForNavigationOptions( UrlRegex = Regex("dashboard|login", RegexOptions.IgnoreCase) ) do! page.Value.RunAndWaitForNavigationAsync( (fun () -> task { do! page.Value.ClickAsync("#xl-form-submit") }), waitNavOptions ) |> Async.AwaitTask
兼容低版本F#的写法(无原生task表达式)
open System.Text.RegularExpressions open Microsoft.Playwright // 你的其他业务逻辑 let waitNavOptions = PageWaitForNavigationOptions( UrlRegex = Regex("dashboard|login", RegexOptions.IgnoreCase) ) do! Async.AwaitTask( page.Value.RunAndWaitForNavigationAsync( (fun () -> Async.StartAsTask <| async { do! Async.AwaitTask <| page.Value.ClickAsync("#xl-form-submit") }), waitNavOptions ) )
说明
- 修正后的代码通过
fun () -> ...传入匿名委托,和原C#的异步lambda功能完全对齐,保证先启动导航监听、再执行点击操作,符合Playwright的设计要求,避免导航丢失、等待超时等问题。 - 两种写法的运行效果和原C#代码完全一致,可根据你的项目F#版本选择。
内容的提问来源于stack exchange,提问作者Martin Thompson
相关产品推荐
相关产品推荐

