我有CefSharp和js沟通的问题.这是我的结构.在我的MainWindow.xaml.cs中,我有:
chromium = new CefSharp.Wpf.ChromiumWebBrowser();
chromium.RegisterJsObject("jsInterface", new jsMapInterface());
Run Code Online (Sandbox Code Playgroud)
其中jsMapInterface是一个带有方法的公共类.
在我的html/js文件夹中,我调用了一个C#方法:
window.jsInterface.myTest();
//jsInterface.myTest(); //I have tested twice
Run Code Online (Sandbox Code Playgroud)
其中myTest()是jsMapInterface类中的一个方法,但没有任何反应.我的错误在哪里?
谢谢你的建议.
进一步发布帖子(CefSharp加载带浏览器登录的页面).我实现了IRequestHandler接口和不同的方法,特别是GetAuthCredentials我在哪里显示对话框并恢复用户和密码并将其传递给事件处理程序.现在我想访问dom,我得到几个frameset不同的东西frames,我对frame我知道nameAtribute的一个感兴趣.这里面frame我需要不同类型的列表input,select等等......在我的应用我有一个按钮,我用它来设置不同的值,elements如果它们存在的显示的页面上依赖.问题是我没有看到任何方式获得document,frames收集等....
我想使用CEF来控制Flash Applikation,因此我需要一个模拟MouseDown和KeySend Execute而不需要Javascript.我搜索得非常多,但我没有找到剪辑.只是一些尝试(屏幕外):
managedCefBrowserAdapter.OnMouseButton(
500, 500, 0, true, 2, CefEventFlags.LeftMouseButton);
Run Code Online (Sandbox Code Playgroud)
要么
MouseEvent a = new MouseEvent();
a.Modifiers = CefEventFlags.LeftMouseButton;
a.X = 500;
a.Y = 500;
Run Code Online (Sandbox Code Playgroud)
要么
managedCefBrowserAdapter.SendKeyEvent(0, 0, 0);
Run Code Online (Sandbox Code Playgroud)
没有什么对我有用:(,谢谢你的帮助:)
如果我将网站传递给浏览器构造函数,如:
ChromiumWebBrowser MyBrowser = new ChromiumWebBrowser("www.google.com");
Run Code Online (Sandbox Code Playgroud)
谷歌将加载.但是,在初始化浏览器后,调用
MyBrowser.Load("Example.com");
Run Code Online (Sandbox Code Playgroud)
给出一个空白屏幕.我有与FrameLoadEnd绑定的事件,当谷歌完成加载时会触发,但在调用Load之后根本不会触发,这意味着网页甚至没有在屏幕外加载.
我花了很长时间研究这个问题,但我找不到解决方案.我已经通过NuGet下载了软件包,安装了VC 2012 Redistributable,初始化了CefSettings,切换到x86等等.我不知道我做错了什么,除了可能误解了这个方法的用法.我也可能没有将正确的文件复制到我的输出目录,但我的所有引用都有CopyLocal = True.
值得注意的是,我的浏览器是以编程方式实现的,而不是被拖放到WinForms Designer中.这对我的代码来说非常必要,因为我有大量的浏览器爬行网页并向用户显示页面,因此需要可靠的加载方法.
以下是我的release文件夹中的debug.log示例,经过编辑以删除过多的重复项:
[0826/130205:WARNING:resource_bundle.cc(304)] locale_file_path.empty()
...
[0826/131439:WARNING:resource_bundle.cc(304)] locale_file_path.empty()
[0826/134434:ERROR:renderer_main.cc(212)] Running without renderer sandbox
...
[0826/135650:ERROR:renderer_main.cc(212)] Running without renderer sandbox
[0826/135658:ERROR:ipc_channel_win.cc(136)] pipe error: 109
[0826/135921:ERROR:renderer_main.cc(212)] Running without renderer sandbox
...
[0826/135921:ERROR:renderer_main.cc(212)] Running without renderer sandbox
[0826/135933:ERROR:ipc_channel_win.cc(378)] pipe error: 109
[0826/135933:ERROR:ipc_channel_win.cc(412)] pipe error: 232
[0826/140141:ERROR:renderer_main.cc(212)] Running without renderer sandbox
...
[0826/140141:ERROR:renderer_main.cc(212)] Running without renderer sandbox
[0826/140148:ERROR:ipc_channel_win.cc(412)] pipe error: 232
Run Code Online (Sandbox Code Playgroud) 我正在使用ChromiumWebBrowser加载网站,在加载页面后,我将执行一些脚本
browser.ExecuteScriptAsync(script)
Run Code Online (Sandbox Code Playgroud)
但该网站不使用jquery,因此很难编写我的脚本代码.我想将jquery注入该站点以便更轻松地编写脚本.我该怎么做?非常感谢你
编辑:
我的电脑里有一个jquery文件.我想将它添加到我想要抓取数据的页面.我尝试使用LoadingStateChanged事件,但没有工作.
private void Browser_LoadingStateChanged(object sender, LoadingStateChangedEventArgs e)
{
ChromiumWebBrowser browser = (ChromiumWebBrowser)sender;
lbStatus.SetText(e.IsLoading ? "Loading..." : browser.Address);
if (!e.IsLoading)
{
//Load jquery
}
else
{
}
}
Run Code Online (Sandbox Code Playgroud) 我使用库ChromiumWebBrowser提供的CefSharp,允许用户从我的C#应用程序中查看和与网站交互.
该网站目前正确显示,用户可以完全与其进行交互,就像他们在标准网络浏览器中查看一样.
我现在想要添加功能,以允许用户在我的应用程序中查看网站时放大/缩小,但我不确定如何做到这一点...我在网上发现的大部分内容似乎表明我应该使用标签的LayoutTransform属性<Grid>,然后使用<ScaleTransform>我的标签,我XAML试过这个,但似乎无法让它工作......
我的XAML情况如下:
<Grid x:Name="grdBrowserHost" MinHeight="900" Height="Auto" MinWidth="1200" Width="Auto" Margin="0,0,0,0" DockPanel.Dock="Bottom" Grid.ColumnSpan="1" >
<Grid.RowDefinitions>
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.LayoutTransform>
<ScaleTransform ScaleX="{Binding Path=Value, ElementName=_zoom}" ScaleY="{Binding Path=Value, ElementName=_zoom}" />
</Grid.LayoutTransform>
<cefSharp:ChromiumWebBrowser Name="browser" Height="Auto" Width="Auto" Grid.Row="0" Address="www.google.com" Margin="0,35,-0.2,0" />
</Grid>
Run Code Online (Sandbox Code Playgroud)
我怎么会添加功能,允许用户在放大和缩小的内容cefSharp:ChromiumWebBrowser ...>在此XAML?理想情况下,我希望他们能够使用'Shift +'/'Shift - '/'Shift and Scroll'进行放大/缩小.
任何人有任何建议,或能够指出一个如何实现这个的例子?
编辑
所以我设法通过slider在GUI中添加一个来实现功能:
<Slider x:Name="slider" Maximum="100" ValueChanged="zoom" HorizontalAlignment="Left" Margin="1177,260,0,0" VerticalAlignment="Top"/> …Run Code Online (Sandbox Code Playgroud) 我目前正在我的应用程序中实现一个小的 web 视图。
一切正常,CefSharp但我有一个小问题。
似乎CefSharp使用类似的东西en-US作为默认浏览器语言。我找不到有关如何更改所用语言的任何信息。
对于我的网络视图,我需要将浏览器设置为德语。
有没有办法做到这一点?语言可以改吗?如果是,如何?
为了使用 WebClient 而不是 Chrome 进行下载,我截获了一个下载 URL。然后我在使用访问者获取 cookie 时遇到了问题。我陷入的陷阱是我不明白访问者是异步运行的,因此只有 30% 的情况下过早访问收集的 cookie 得到了正确的结果。
由于我搜索了很长时间的解决方案,我想将我在演示代码中找到的解决方案粘贴到此处。
我试图避免页面上的js警报,因为它打破了流程,浏览器卡在该页面上,直到单击弹出窗口.
我添加了Class,如示例所示:
public class JsDialogHandler : IJsDialogHandler
{
public bool OnJSDialog(IWebBrowser browserControl, IBrowser browser, string originUrl, CefJsDialogType dialogType, string messageText, string defaultPromptText, IJsDialogCallback callback, ref bool suppressMessage)
{
return true;
}
public bool OnJSBeforeUnload(IWebBrowser browserControl, IBrowser browser, string message, bool isReload, IJsDialogCallback callback)
{
return true;
}
public void OnResetDialogState(IWebBrowser browserControl, IBrowser browser)
{
}
public void OnDialogClosed(IWebBrowser browserControl, IBrowser browser)
{
}
}
Run Code Online (Sandbox Code Playgroud)
我分配给Chromium浏览器:
CefSharp.Cef.Initialize(new CefSharp.CefSettings());
browser = new CefSharp.WinForms.ChromiumWebBrowser(CustomLinks[0].ToString());
JsDialogHandler jss = new JsDialogHandler();
browser.JsDialogHandler = jss;
Run Code Online (Sandbox Code Playgroud)
事情是当警报应该显示它确实运行 …
我正在使用铬浏览器来自动执行某项任务.
基本上我想加载图片,我必须在网页上点击"添加图片"锚标记.
所以我不能直接点击它不知道为什么当其他工作相同的代码.但我已设法将重点放在该锚标签上,但发送:
KeyEvent k = new KeyEvent();
k.WindowsKeyCode = 9; // TAB KEY
browser.GetBrowser().GetHost().SendKeyEvent(k);
//browser = ChromiumWebBrowser browser;
Run Code Online (Sandbox Code Playgroud)
上面的工作完全正常,因为我看到它正确的锚标签.
现在我做:
KeyEvent k = new KeyEvent();
k.WindowsKeyCode = 13; //ENTER KEY
browser.GetBrowser().GetHost().SendKeyEvent(k);
Run Code Online (Sandbox Code Playgroud)
要模拟输入密钥,但是没有任何反应,但是如果我在关键字上手动按"Enter"它就可以正常工作,那么为什么上述内容与我点击"输入密钥"的行为不一样
有什么建议.