我在 C# 应用程序中使用 CEFSharp,并且需要在至少 10 个 WebView 中一次加载多个 url。但是它不能作为多线程工作。有没有办法以多线程运行它,否则我必须使用特定的编译选项从源代码重建?
谢谢
我已将 CefSharp 嵌入到我的 WinForms 中。现在,我试图找到一种机制,以某种方式让用户使用开发工具的元素选择器(不显示内置开发工具窗口),并且在用户单击元素时,我想在我的 .NET 代码中获取 HTML。
我可以这样做吗?关于如何做的任何帮助?
谢谢,
汗
我无法让 CefSharp 浏览器调用浏览器中的可信点击。在 JS(来自 CefSharp)中按如下方式启动点击事件只是完成了一半:
var e = document.createEvent("MouseEvents");
e.initMouseEvent('click', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 0, null);
element[0].dispatchEvent(e);
Run Code Online (Sandbox Code Playgroud)
理论上,上述方法仍然会导致 .isTrusted 事件属性失败(即使 CefSharp 使用的 Chromium 版本未实现 .isTrusted)
知道 Chromium 很快就会实现 isTrusted,我怎样才能让 CefSharp 对浏览器中的元素执行可信点击呢?
我找到了这个https://bitbucket.org/chromiumembedded/cef/wiki/UsingChromeDriver链接,其中有 cef 客户端和 Selenium 驱动程序的 java 绑定。
所以我准备了一个给我用 c# windows 应用程序使用它。我所做的是创建了一个新的 winapp 项目 x86,它只包含以下运行时没有错误或问题的代码:
using CefSharp;
using CefSharp.WinForms;
namespace ClientBrowser
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public ChromiumWebBrowser browser;
private void Form1_Load(object sender, EventArgs e)
{
var settings = new CefSettings();
settings.CefCommandLineArgs.Add("enable-npapi", "1");
settings.IgnoreCertificateErrors = true;
//settings.CefCommandLineArgs.Add("enable-system-flash", "1");
Cef.Initialize(settings);
browser = new ChromiumWebBrowser("");
this.Controls.Add(browser);
browser.Dock = DockStyle.Fill;
}
}
}
Run Code Online (Sandbox Code Playgroud)
上面的项目是作为下面新的winapp项目x86的cef客户端:
private void Form1_Load(object sender, EventArgs e)
{
try {
var …Run Code Online (Sandbox Code Playgroud) 我对 CefSharps Chromium 浏览器非常陌生,很难弄清楚如何获取 jquery ajax 请求的结果。
我的第一次尝试是将我的 AJAX 请求传递给EvaluateScriptAsync. 事实上这个脚本是有效的。它完全符合我的要求,但我没有得到任何结果/状态代码,因为我的 Cef-Task 不会等到 AJAX 完成其工作。
这是一个示例(只是示例代码):
var tasks = pdBrowser.EvaluateScriptAsync(@"
(function(){
$.ajax({
type: ""POST"",
dataType: ""json"",
cache: false,
url: ""_resources/php/ajaxRequests.php"",
async: false,
data: {
action: ""insertCrossPlatform"",
type: """",
values: JSON.stringify(""foo bar"")
},
success: function(response) {
if (typeof response === 'string' && response.substring(0, 5) == ""ERROR"")
{
return response;
}
else
{
//pageReload();
return ""OK"";
}
},
error: function(xhr, textStatus, errorThrown) {
return errorThrown + ""\n"" + xhr.responseText;
}, …Run Code Online (Sandbox Code Playgroud) 我正在使用 CefSharp 和从 html 文件加载的 HTML 编辑器。我得到了 javascript 代码来获取 html 编辑器的内容:
var markupStr = $('#summernote').summernote('code');
Run Code Online (Sandbox Code Playgroud)
我需要markupStr在我的 C# 应用程序中返回。我目前拥有的:
var script = "$('#summernote').summernote('code');";
var result = ChromiumWebBrowser.GetMainFrame().EvaluateScriptAsync(script).Result.Message;
Run Code Online (Sandbox Code Playgroud)
我可以毫不费力地在 CefSharp 中执行 JavaScript,但是,如何检索markupStr或其设置的值$('#summernote').summernote('code');?
我正在尝试对某些页面元素(如 btn 或链接)进行简单的点击。
我编写了 2 个通过 xpath 和 CSS 选择器单击的函数。
这两个功能在浏览器的开发者控制台中都可以完美运行,但在 CEF 中部分不起作用。
怎么会这样?js代码完全一样!...
public void Click(string xpath)
{
var js = "document.evaluate(\"" + xpath + "\", document, null, XPathResult.ANY_TYPE, null).iterateNext().click();";
EvaluateJavascript(js);
}
public void ClickCss(string css)
{
var js = "document.querySelector('"+ css + "').click()";
EvaluateJavascript(js);
}
public async Task EvaluateJavascript(string script)
{
JavascriptResponse javascriptResponse = await Browser.GetMainFrame().EvaluateScriptAsync(script);
if (!javascriptResponse.Success)
{
throw new JavascriptException(javascriptResponse.Message);
}
}
Run Code Online (Sandbox Code Playgroud)
使用的点击代码:
_browser.ClickCss("#upload-container a");
Run Code Online (Sandbox Code Playgroud)
再一次:相同的 js 代码在浏览器开发控制台中完美运行,但由于某种原因在 CEF …
我知道这是一个非常基本的问题,但我正在使用 CEFSharp 在 wpf 中创建一个浏览器(我几乎完成了),但我在某些帐户上登录 google 时遇到了障碍。我收到“此浏览器或应用程序可能不安全”的消息。信息。现在,我研究了使用 OAuth 来获取用于访问和使用 Google 某些功能的令牌,而不仅仅是如何整体登录。我只是希望用户能够登录 Google,就像他们在 Chrome 浏览器上一样(当然没有同步选项)。
我使用 Google Console 注册了我的应用程序,并收到了 ClientId 和 ClientSecret,并且创建了一个窗口,当在尝试获取令牌的 google 页面上单击登录按钮时调用,但当用户键入其 e -mail,他们收到相同的消息(见下文)。
我不确定是否有一个 API 可以使用,或者可以让我的用户通过我的浏览器登录 google,而不必调用 Google Chrome 浏览器本身,因为这违背了我的浏览器自给自足的目的。我已经为此绞尽脑汁好几天了。有人可以帮忙吗?
以下是我的 Google 登录窗口的 xaml:
<Window x:Class="MyProject.Windows.GoogleLoginWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:wpf="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf"
xmlns:local="clr-namespace:NP_Browser.Windows"
mc:Ignorable="d"
Title="Google Login Window" Height="450" Width="800" Icon="../Images/NPBrowserLogo.ico">
<Window.Resources>
<BooleanToVisibilityConverter x:Key="btv" />
</Window.Resources>
<Grid>
<DockPanel Visibility="{Binding State.IsSigned, Converter={StaticResource btv}}">
<Label Content="{Binding State.Token.Name}" />
</DockPanel>
<Grid Visibility="{Binding State.IsNotSigned, Converter={StaticResource btv}}">
<wpf:ChromiumWebBrowser x:Name="Wb" FontSize="16"/>
</Grid>
</Grid>
Run Code Online (Sandbox Code Playgroud)
以下是我的 …
我正在使用CefSharp for WPF.我想在MVVM架构中使用它.不幸的是有一个问题.在视图中我有:
<ContentPresenter Content="{Binding Browser}"
HorizontalAlignment="Center"
VerticalAlignment="Center"/>
Run Code Online (Sandbox Code Playgroud)
在ViewModel中,我将一个新对象放入Browser:
var settings = new CefSharp.Settings
{
PackLoadingDisabled = true,
}
if (CefSharp.CEF.Initialize(settings))
{
int counter = 0;
this.Browser = new WebView();
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,之后我无法加载任何URL.它说Browser not initialized,实际上IsBrowserInitialized属性(in Browser)是false.
这很奇怪,因为在测试应用程序中,而不是MVVM,我使用相同的代码来实例化它的WebView.唯一的区别是我以编程方式将浏览器添加到网格,因为它不是MVVM.
有没有人在WPF MVVM应用程序中获得CefSharp?有任何想法吗?
谢谢
编辑:我在测试非MVVM应用程序中注意到,该IsBrowserInitialized属性设置为false,直到窗口构造函数结束作业.
我正在尝试在.NET 4.0应用程序中使用CefSharp Web浏览器.我从html和js内容加载页面存储localy.因此,Web浏览器会打开包含file://协议的页面.
页面转换是使用jQuery(ajax)进行的,我得到了一个 XMLHttpRequest cannot load file:///XXXXXXXX/Debug/res/www/shared/js/src/views/homeView.html. Cross origin requests are only supported for HTTP.
我尝试使用Schemehandler并覆盖ProcessRequest函数来处理file://域内的页面加载.
class SchemeHandlerFactory : ISchemeHandlerFactory
{
public ISchemeHandler Create()
{
return new SchemeHandler();
}
}
class SchemeHandler : ISchemeHandler
{
public SchemeHandler()
{
}
public bool ProcessRequest(IRequest request, ref string mimeType, ref Stream stream)
{
var uri = new Uri(request.Url);
var segments = uri.Segments;
var file = segments[segments.Length - 1];
var bytes = File.ReadAllBytes(request.Url.Replace("file:///",""));
stream = …Run Code Online (Sandbox Code Playgroud)