我想这是一个经典的 C# 到 F# 的转换,我还没有完全理解。
我正在尝试使用快速入门自动化浏览器
https://playwright.dev/dotnet/docs/intro
C# 代码是
using var playwright = await Playwright.CreateAsync();
await using var browser = await playwright.Chromium.LaunchAsync();
var page = await browser.NewPageAsync();
await page.GotoAsync("http://www.bing.com");
await page.ScreenshotAsync(path: outputFile);
我已经开始了,但已经有点迷失了。let playwright: Playwright = PlaywrightSharp.Playwright.CreateAsync() |> Async.AwaitTask
类型不正确。我在这里做错了什么?Error FS0001 This expression was expected to have type
'Playwright'
but here has type
'Async<IPlaywright>'
最佳答案
一种方法是使用 F# 对 async computation expressions 的内置支持。 .翻译看起来像这样:
let (~~) = Async.AwaitTask
async {
use! playwright = ~~Playwright.CreateAsync()
let! browser = ~~playwright.Chromium.LaunchAsync()
let! page = ~~browser.NewPageAsync()
do! ~~page.GoToAsync("http://www.slashdot.com") |> Async.Ignore
do! ~~page.ScreenshotAsync(outputFile) |> Async.Ignore
} |> Async.RunSynchronously
这里有一些你需要知道的微妙之处:Async<'T>
.我用过 Async.AwaitTask
从 C# 风格的任务转换而来,并定义了一个前缀运算符,~~
,使这看起来更干净一些。 DisposeAsync
在 async
计算表达式 yet ,因此浏览器不会被正确处理。如果需要,您可以添加 do! browser.DisposeAsync().AsTask() |> Async.AwaitTask
在块的末尾手动执行此操作。 Async.Ignore
做到了这一点。 . 关于f# - 如何在 F# 中使用 Playwright Sharp 进行浏览器自动化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67610586/