You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 17:36:04