- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个屏幕外的 ChromiumWebBrowser
,我用它在页面上运行一些 JS 并取回结果。
Load 方法是同步的,但是在引发 FrameLoadEnd 事件之前我无法运行 JS 代码,这意味着或者我的目的 Load 是一个以 FrameLoadEnd 事件结束的异步方法。
为了让代码更清晰,我尝试创建一个扩展方法,允许我使用 await
等待页面加载,而不是注册事件。但是,当我将此方法与 TaskCompletionSource 一起使用时,未加载应该在页面加载后运行的 javascript,但是当使用 AutoResetEvent
并等待它时,代码确实有效。
此代码无效:
public static Task LoadPageAsync(this IWebBrowser browser, string address)
{
TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
browser.FrameLoadEnd += (sender, args) =>
{
if (args.IsMainFrame)
{
tcs.TrySetResult(true);
}
};
browser.Load(address);
return tcs.Task;
}
这样做:
public static AutoResetEvent LoadPageAsync(this IWebBrowser browser, string address)
{
AutoResetEvent are = new AutoResetEvent(false);
browser.FrameLoadEnd += (sender, args) =>
{
if (args.IsMainFrame)
{
are.Set();
}
};
browser.Load(address);
return are;
}
这是调用代码:
await _browser.LoadPageAsync("Some web address");
LoadScripts();
DoJsThing();
GetJsData();
它们做同样的事情,但我觉得返回任务时函数的意图比返回 AutoResetEvent 时更清晰。
为什么我不能使用 TaskCompletionSource 来指示我已完成?我做错了什么吗?
最佳答案
public static Task LoadPageAsync(IWebBrowser browser, string address = null)
{
var tcs = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);
EventHandler<LoadingStateChangedEventArgs> handler = null;
handler = (sender, args) =>
{
//Wait for while page to finish loading not just the first frame
if (!args.IsLoading)
{
browser.LoadingStateChanged -= handler;
//Important that the continuation runs async using TaskCreationOptions.RunContinuationsAsynchronously
tcs.TrySetResult(true);
}
};
browser.LoadingStateChanged += handler;
if (!string.IsNullOrEmpty(address))
{
browser.Load(address);
}
return tcs.Task;
}
请注意,我使用了 LoadingStateChanged
,因为它可以更好地指示整个页面何时完成加载。
关于c# - 无法使 CefSharp 加载同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29728744/
CefSharp 有许多运行所需的依赖项和库。构建文件夹很困惑。如何将所需的 .dll 和 .pak 依赖项移至子文件夹? 最佳答案 首先,为了让一切变得更容易,我建议向 Visual Studios
我正在考虑将项目移动到 WinForm 应用程序中的嵌入式 WebView 类型体系结构中,并且正在考虑 DotNetBrowser 和 CefSharp。 经过多次搜索,我似乎找不到免费 CefSh
我正在尝试使用 CefSharp 访问 URL 并捕获在加载给定页面期间检索到的特定资源。大概作为每个资源的流或字节数组。 CefSharp 提供接口(interface) IRequestHandl
为了使用 WebClient 而不是 Chrome 进行下载,我截获了一个下载 URL。然后我在使用 获取 cookie 时遇到了问题。访客 .我陷入的陷阱是我不明白访问者是异步运行的,因此只有 30
使用 CEFSharp 浏览器构建应用程序,在我的机器上运行良好,但在服务器上崩溃并出现以下错误: System.IO.FileLoadException:无法加载由“CefSharp.Core.dl
我已经在 CefSharp WinForms 应用程序上工作了几个星期,并且没有遇到任何问题。今天早上,在向应用程序添加一些东西时,我试图运行它来测试一些东西并得到以下错误: System.IO.Fi
使用 XMLHttpRequest which is the subject of my previous question使用自定义方案我正在加载本地文件。为了测试,我使用了 disable-web
我关注了这个link实现 CefSharp 应用程序。 但是我在编写 MainWindow.xaml 时卡住了。 Blend for VS 2015 说, The name ChromiumWebBr
我收到消息命名空间“clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf 中不存在名称 ChromiumWebBrowser 当我运行这个
是否可以使用 CefSharp 获取网页的屏幕截图?我找到了关于GetImage()的信息方法,但它似乎不再受支持。有没有其他办法?我需要从屏幕外浏览器获取屏幕截图,因此使用显示浏览器的屏幕截图不是解
我正在使用 CEFsharp 浏览器并通过 LoadingStateChanged 事件确定页面已完成加载,但它会触发多次。 我需要它只在页面完全加载后触发,这怎么办? private async v
我需要在 Wpf 应用程序中使用 Web 浏览器,我尝试使用工具箱中的浏览器,但遇到一些问题并转到 CefSharp。 public MainWindow() { InitializeCompone
如何使用CefSharp获取HTML元素的值? 我知道如何使用此默认WebBrowser控件: Dim Elem As HtmlElement = WebBrowser1.Document.GetEl
我们希望在 wpf 应用程序中的基于 chromium 的浏览器中显示网页。在浏览器中显示的网站也应该显示在另一个屏幕上,但没有交互。我想将cefsharp wpf浏览器控件和cefsharp离屏渲染
有人可以帮助我了解如何在使用 CefSharp winforms 控件时捕获鼠标事件吗? 最佳答案 我没有详细检查以下示例链接,但搜索“global mouse hook”应该会带您到正确的方向。 示
我使用 64 位版本的 CefSharp 3 创建了一个示例应用程序。当所有必需的库与主应用程序可执行文件位于同一文件夹时,它工作正常。我想知道是否有办法从另一个路径读取 CefSharp 所需的 d
我正在开发一个项目,我希望使用 Chromium Web 浏览器并能够读取通常通过 DevTools“网络”选项卡获取的数据。所以基本上我真正需要的是 URL 和状态代码(404、200、50x 等)
在我的项目中加载 CefSharp 程序集时出现错误。 CefSharp 和 CefSharp.WinForms 都没有强命名。有什么办法解决这个问题吗? 错误: Referenced assembl
我已经成功地将 WebView 添加到 WPF 中的窗口。如何向浏览器添加选项卡?我用谷歌搜索但没有找到任何关于在 CefSharp 中制作标签式浏览器的好文档。 var settings = new
我正在使用 CefSharp Winforms x86 构建。我想播放此链接中的视频: http://developers.canal-plus.com/rx-player/ 在 google chr
我是一名优秀的程序员,十分优秀!