• C#客户端嵌入Chrome浏览器的实现 客户端软件,也就是传统的Winform软件,在很多时候是很好用的。因为在做一些打印、本地设备操作的时候,纯Web系统还是存在很多局限性的。例如很多驱动你需要单独写...

    C#客户端嵌入Chrome浏览器的实现

    客户端软件,也就是传统的Winform软件,在很多时候是很好用的。因为在做一些打印、本地设备操作的时候,纯Web系统还是存在很多局限性的。例如很多驱动你需要单独写cab包啦,交互式实现调试很困难啦,浏览器适配问题啦等等。这个时候,Winform结合Web的方式,就是一种比较好的选择。

    传统上来说,.net本身支持WebBrowser,但是WebBrowser这个东西是基于本地操作系统IE浏览器的,一些CSS的样式解析啦,还有一些权限什么的,还是没有办法很好的控制。这时候我们就会想要把Chrome浏览器嵌入过来用了。

    最早网上有Webkit的一些控件,但是现在已经不提供更新维护了。所以截止目前为止,CefSharp是一个比较好的解决方案。CefSharp是嵌入的Chromium浏览器,基本等同chrome。

    笔者这里用的是VS2017社区版,简单写写操作,给大家扫盲吧。

    首先是先搭建基本的开发环境。

    1. 新建Winform应用程序。

    2. 在解决方案管理器上,右键单击引用,选择“管理NuGet程序包”。

    3. 点击浏览选项卡,搜索CefSharp,在列表中选择CefSharp.WinForms,安装CefSharp包,会自动安装相关引用包。

    4. 打开引用列表,看到有CefSharp,CefSharp.Core,CefSharp.Winforms这三个包就OK了。

    然后说一下基本的用法。先实现把ChromeWebBrowser嵌入到窗体中去并打开百度好了。

    public ChromiumWebBrowser browser;
    public void InitBrowser(){
    Cef.Initialize(new CefSettings());
    browser = new ChromiumWebBrowser ("www.baidu.com");
    this.Controls.Add(browser);
    browser.Dock = DockStyle.Fill;
    }
    然后再窗体构造函数中,InitializeComponent()之后调用InitBrowser()方法,将browser添加到窗体中去。

    这里要说一下,CefSharp这个开源项目,目前应该没有办法导入VS的工具箱(至少笔者没成功),所以只能通过代码方式创建对象,browser的事件,也都需要代码注册,不过只要不是太新的新手,应该很快就习惯了。

    这样运行就能打开百度的页面了。

    第一篇就这样吧,接下来会说一下如何在browser中的html页面里,用js调用Winform中的方法。

     

     

    PS:

    1. 在C#的WinForm项目,引入了CefSharp,直接运行程序,会报错

       error : CefSharp.Common contains unmanaged resoures, set your project and solution platform to x86 or x64. Alternatively for AnyCPU Support see https://github.com/cefsharp/CefSharp/issues/1714

      C#开发WinForm使用CefSharp使用
    2.  

      需要指定运行的平台,在解决方案右键,选择配置管理器

      C#开发WinForm使用CefSharp使用
    3.  

      在活动解决方案平台选择新建,新建一个x86的平台

      C#开发WinForm使用CefSharp使用
    4. 4

      再次点击启动就没有报错了

      C#开发WinForm使用CefSharp使用
    5.  

    posted @ 2019-03-21 00:25 kevin860 阅读(...) 评论(...) 编辑 收藏
    展开全文
  • 首先要搭建环境新建winform项目 GoogleChromeTest管理NuGet程序包,搜索cef,安装CefSharp.WinForms这里选的是X86运行环境,所以要添加X86的引用,(如果需要X64开发,可以选择X64,后面的引用也要改成X64)添加引用在项目...

    首先要搭建环境

    新建winform项目 GoogleChromeTest

    管理NuGet程序包,搜索cef,安装CefSharp.WinForms


    这里选的是X86运行环境,所以要添加X86的引用,(如果需要X64开发,可以选择X64,后面的引用也要改成X64)




    添加引用

    在项目文件夹下有个packages文件

    添加里面的 

    packages\CefSharp.WinForms.57.0.0\CefSharp\x86\CefSharp.WinForms.dll

    packages\CefSharp.Common.57.0.0\CefSharp\x86\CefSharp.BrowserSubprocess.Core.dll

    packages\CefSharp.Common.57.0.0\CefSharp\x86\CefSharp.Core.dll

    packages\CefSharp.Common.57.0.0\CefSharp\x86\CefSharp.dll


    这时生成一下项目,然后重新启动VS

    这时我们开始写代码了

    增加两个button,一个textBox


    主界面的代码如下

    using CefSharp.WinForms;
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace GoogleChromeTest
    {
        public partial class Form1 : Form
        {
            /// <summary>
            /// Chromium浏览器实例
            /// </summary>
            ChromiumWebBrowser WebBrowser;
    
            public Form1()
            {
                InitializeComponent();
                ///设置
                var setting = new CefSharp.CefSettings();
                setting.Locale = "zh-CN";
                setting.CachePath = "CHBrowser/BrowserCache";//缓存路径
                setting.AcceptLanguageList = "zh-CN,zh;q=0.8";//浏览器引擎的语言
                setting.LocalesDirPath = "CHBrowser/localeDir";//日志
                setting.LogFile = "CHBrowser/LogData";//日志文件
                setting.PersistSessionCookies = true;//
                setting.UserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36";//浏览器内核
                setting.UserDataPath = "CHBrowser/userData";//个人数据
                ///初始化
                CefSharp.Cef.Initialize(setting);
                WebBrowser = new ChromiumWebBrowser("http://www.baidu.com"); //初始页面
                WebBrowser.RegisterJsObject("jsObj", new JsEvent(), new CefSharp.BindingOptions() { CamelCaseJavascriptNames = false }); //交互数据                                           
                WebBrowser.Dock = DockStyle.Fill;//铺满                                                                  
                WebBrowser.Dock = DockStyle.Fill;//设置停靠方式
                this.Controls.Add(WebBrowser);//加入窗体
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
    
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                WebBrowser.Load(textBox1.Text);//浏览网址
            }
    
            private async void button2_Click(object sender, EventArgs e)
            {
                await WebBrowser.GetBrowser().MainFrame.EvaluateScriptAsync("test_val=" + new Random().Next().ToString("F")); //设置页面上js的test_val变量为随机数
                await WebBrowser.GetBrowser().MainFrame.EvaluateScriptAsync("test()");//运行页面上js的test方法
    
            }
    
            private async void button3_Click(object sender, EventArgs e)
            {
                await WebBrowser.GetBrowser().MainFrame.EvaluateScriptAsync("testArg('123','我是NET' )");//运行页面上js的testArg带参数的方法
            }
        }
        public class JsEvent
        {
            public string MessageText { get; set;}
    
            public void ShowTest()
            {
                MessageBox.Show("this in C#.\n\r" + MessageText);
            }
            public void ShowTestArg(string ss)
            {
                MessageBox.Show("收到JS带参数调用\n\r" + ss);
            }
        }
    }
    

    form的构造函数里设置浏览器的基本设置,然后铺满窗口

    刷新按钮访问输入框里的网址

    js交互按钮运行页面上的js程序

    jsEvent为页面上JS交互的接口

    接下来我们写个测试的asp页面

    新建一个空白ASP项目GoogleTestWeb

    新建一个html页面HtmlPage1,代码如下

    <!DOCTYPE html>
    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title></title>
        <meta charset="utf-8" />
    
    </head>
    
    <body>
        <script src="http://code.jquery.com/jquery-2.1.4.min.js"></script>
        <script>
            var test_val;
            function test() {
                alert("收到Net程序事件 " + test_val);
            }
            function testArg(d1,d2) {
                alert("收到Net程序事件1 " + d1);
                alert("收到Net程序事件2 " + d2);
            }
    
            $(function () {
                $('button:eq(0)').on("click", BtnClick);
                $('button:eq(1)').on("click", BtnClickArgs);
            })
            function BtnClick() {
                if (typeof jsObj == "undefined") {
                    alert("jsObj参数未初始化")
                    return;
                }
                jsObj.MessageText = "我是js";
                jsObj.ShowTest();
            }
            function BtnClickArgs() {
                if (typeof jsObj == "undefined") {
                    alert("jsObj参数未初始化")
                    return;
                }
                jsObj.ShowTestArg($('textarea:eq(0)').val());
            }
        </script>
    
        <button style="margin-top:100px">发送给Net程序</button>
        <button >发送给Net程序带参数</button>
        <textarea></textarea>
    </body>
    </html>
    

    生成项目,此时代码已经写完

    接下来就是测试

    在HTML页面里右键,点击 在浏览器中查看,VS会打开浏览器,进行html页面


    复制网址 我这里是 http://localhost:54562/HtmlPage1.html 你们的应该会不同

    运行之前的winform程序,把网址复制到textBox上,然后点击刷新,稍等一下就会显示页面


    点击  JS交互    (从winform调用js函数)


    点击  js交互带参数  (从winform调用js带有参数的函数)


    点击 发送给net程序  


    点击   发送给Net程序带参数 (旁边输入参数)



    代码下载: 下载地址

    (NuGet包需要下载)









    展开全文
  • CSharp调用默认浏览器打开网页的几种方法示例界面:方法一:从注册表中读取默认浏览器可执行文件路径 private void button1_Click(object sender, EventArgs e) { //从注册表中读取默认浏览器可执行文件路径 ...

    CSharp调用默认浏览器打开网页的几种方法

    示例界面:


    方法一:从注册表中读取默认浏览器可执行文件路径

            private void button1_Click(object sender, EventArgs e)
            {
                //从注册表中读取默认浏览器可执行文件路径
                RegistryKey key = Registry.ClassesRoot.OpenSubKey(@"http\shell\open\command\");
                string s = key.GetValue("").ToString();
    
                //s就是你的默认浏览器,不过后面带了参数,把它截去,不过需要注意的是:不同的浏览器后面的参数不一样!
                //"D:\Program Files (x86)\Google\Chrome\Application\chrome.exe" -- "%1"
                System.Diagnostics.Process.Start(s.Substring(0, s.Length - 8), "http://blog.csdn.net/testcs_dn");
            }

    方法二:

            private void button2_Click(object sender, EventArgs e)
            {
                //调用系统默认的浏览器 
                System.Diagnostics.Process.Start("explorer.exe", "http://blog.csdn.net/testcs_dn");
            }

    方法三:

            private void button3_Click(object sender, EventArgs e)
            {
                //调用系统默认的浏览器 
                System.Diagnostics.Process.Start("http://blog.csdn.net/testcs_dn");
            }

    方法四:调用IE浏览器

            private void button4_Click(object sender, EventArgs e)
            {
                //调用IE浏览器  
                System.Diagnostics.Process.Start("iexplore.exe", "http://blog.csdn.net/testcs_dn");
            }
    从原理上来讲,方法二和方法三应该是一样的,不过方法三的代码更短一点。

    示例代码下载:

    C#调用默认浏览器打开网页的几种方法


    展开全文
  • C# webBrowser 使用Chrome内容案例
  • 在上一篇爬虫博客中,我们讲述了应对IP访问限制的策略,即爬取代理IP并不断改变代理的方式。...本篇我们介绍通过C#调用谷歌浏览器来实现动态信息爬取。 普通爬虫遭遇的困境 假如我们要爬取某博客页面的详细...

    在上一篇爬虫博客中,我们讲述了应对IP访问限制的策略,即爬取代理IP并不断改变代理的方式。但是某些网站不仅在访问时做了限制,而且在返回网页时也做了巧妙的处理,比如在页面加载时调用js动态请求内容等。这种情况就不是简单的发出一个get请求可以爬取的了,这个时候可能就需要调用谷歌浏览器来实现爬取。本篇我们介绍通过C#调用谷歌浏览器来实现动态信息爬取。

    普通爬虫遭遇的困境

    假如我们要爬取某博客页面的详细信息,如标题,正文,作者,发布时间,阅读数等等。我们的第一思路是对这个页面的url发送一个get请求,对返回的网页报文通过xpath解析我们需要的信息。下面以一个博客详情页面为例:C#攻克反爬虫之代理IP爬取

        class Program
        {
            static void Main(string[] args)
            {
                BasicalMothed("https://blog.csdn.net/Leaderxin/article/details/102764234"); //调用原始方法
                Console.Read();
            }
            /// <summary>
            /// 这个我们普通的爬虫思路,通过请求url返回报文爬取
            /// </summary>
            static void BasicalMothed(string url)
            {
                HttpWebRequest req = WebRequest.Create(url) as HttpWebRequest;
                if (req == null)
                    return;
                HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
                Encoding bin = Encoding.GetEncoding("UTF-8");
                using (StreamReader sr = new StreamReader(resp.GetResponseStream(), bin))
                {
                    string str = sr.ReadToEnd();
                    Console.WriteLine(str.ToString());
                    //在这里通过xpath对str的内容进行解析并存储
                    return ;
                }
            }
        }
    

    我们看一下打印出来的报文内容:
    C#爬虫
    返回内容是乱码,明显某平台做了巧妙的处理,直接请求这个url是无法得到我们想要的报文的。还有一些场景,比如说某些网页里会有类似【更多】这样的按钮,点击后页面才会请求并渲染更多内容,这种也是无法通过直接请求该网页爬取的。

    通过chromedriver调用浏览器

    下面我们通过C#调用chromedriver来控制浏览器访问我们要爬取的页面并实现爬取。首先通过nuget安装Selenium库:

    注意如果安装Selenium时选择的是最新版的,需要将谷歌浏览器更新到最新,不然调用的时候会有异常

    Selenium
    然后我们通过F12看下要爬取页面的结构,看看我们要爬取的信息在哪些标签里,结果如下:
    标题在class ='title-article’的h1中,发布时间在class='time’的span中,博主在class='follow-nickName’的a标签中,阅读数在class='read-count’的span中,正文在id='article_content’的div中。
    C#爬虫
    然后编码调用谷歌浏览器访问这个页面并取到我们指定元素:

            /// <summary>
            /// 通过Selenium调用谷歌浏览器来爬取
            /// </summary>
            /// <param name="url"></param>
            static void SeleniumMothed(string url)
            {
                //启动谷歌浏览器
                IWebDriver selenium = new ChromeDriver();
                //浏览器跳转到我们要爬取的url
                selenium.Navigate().GoToUrl(url);
                //确保页面内容已加载完成
                while (string.IsNullOrEmpty(selenium.Title))
                {
                    Task.Delay(100).GetAwaiter().GetResult();
                }
                
                
                //取到标题信息,通过css选择器
                var title = selenium.FindElement(By.CssSelector("h1.title-article")).Text; 
                //发布时间
                var time = selenium.FindElement(By.CssSelector("span.time")).Text;
                //博主名
                var name = selenium.FindElement(By.CssSelector("a.follow-nickName")).Text;
                //阅读数
                var nums = selenium.FindElement(By.CssSelector("span.read-count")).Text;
                //正文,由于id固定,我们直接用id选择器获取
                var content = selenium.FindElement(By.Id("article_content")).Text;
                Console.WriteLine("标题:"+title);
                Console.WriteLine("发布时间:"+time);
                Console.WriteLine("博主名:"+name);
                Console.WriteLine("阅读数:"+nums);
                Console.WriteLine("正文:"+content);
            }
    

    看下控制台打印结果:
    C# Selenium
    可以看到,已经成功通过调用Chrome爬取到了我们想要的信息。Selenium能做到的事情还远不止如此,有兴趣的可以自己研究下。后面也会继续讲Selenium的一些其它用法。
    上一篇:C#攻克反爬虫之代理IP爬取

    展开全文
  • c# winform 火狐浏览器 查看cookie 1、使用SQLite读取cookies.sqlite 2、通过读取文件流方式获取cookie值
  • 搭建一个 c# + selenium + winform + 谷歌浏览器 – 自动化测试环境 1、需要环境 Visual Studio 2017 winformapp 测试应用 .net 4.5 windows 10 谷歌浏览器 2、winformapp 测试应用 新建一个winform应用 安装...

    搭建一个 c# + selenium + winform + 谷歌浏览器 – 自动化测试环境

    1、需要环境

    • Visual Studio 2017
    • winformapp 测试应用
    • .net 4.5
    • windows 10
    • 谷歌浏览器

    2、winformapp 测试应用

    1. 新建一个winform应用

    项目图片

    1. 安装程序 nuget 包
    Selenium.Chrome.WebDriver
    Selenium.WebDriver
    
    1. 新建按钮 ,双击按钮添加点击事件
      在这里插入图片描述

    2. 上代码

    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                IWebDriver browser = new ChromeDriver();
                browser.Navigate().GoToUrl("https://www.baidu.com");
    
                browser.FindElement(By.XPath("//*[@id=\"kw\"]")).SendKeys("jiegemena");
                browser.FindElement(By.XPath("//*[@id=\"su\"]")).Click();
                //browser.Close();
            }
        }
    
    展开全文
  • 2019独角兽企业重金招聘Python工程师标准>>> ...
  • 1.C#调用浏览器打开网页,网上很多现成的解释 从注册表中读取默认浏览器可执行文件路径 //从注册表中读取默认浏览器可执行文件路径 private void button1_Click(object sender, EventArgs e) { //从注册表中...
  • &#13; 样例代码: class Program { /// &lt;summary&gt; /// 写 /// &lt;/summary&gt; /// &lt;param name="lpszUrlName"&gt;&lt;/param&...lb.
  • C#调用Chrome同时改变大小和相对位置,只能在chrome未被打开的时候生效。
  • 具体代码如下 ``` System.Web.UI.WebControls.GridView DGOutPut = new System.Web.UI.WebControls.GridView(); DGOutPut.Visible = true; DGOutPut.RowDataBound += new ...在谷歌中提示失败网络错误
  • 通过注册表实现谷歌浏览器调用本地exe,在通过本exe和相应的参数去调用别的exe,这样的好处在于调用不同的exe只要写一次注册表就可以实现。压缩包里有说明文档
  • 最近遇到一个问题我们想要谷歌浏览器和IE 浏览器兼容 因为有一些产品只支持IE 而我们使用的是谷歌浏览器,所以出现了这么一个问题 在网上找了几天的内容发现都是谷歌4.5版本以下去下载一个IE Tab插件去解决的 但我们...
  • WPF嵌入谷歌浏览器例子,支持WPF窗体与网页的js双向调用例子,并解决网页中下拉列表错位的案例,已经在项目应用起来,有需要的伙伴有福了
  • activex是由微软开发,所以在支持上,目前原生态支持的只有IE,其他浏览器想要支持activex, 需要额外做一些设置或安装补丁包,比如谷歌浏览器就需要安装IE-Tab-Multi-(Enhance)_v1.0.2.1.crx 转载于:http...
  • 在很多客户端程序中我们都需要调用浏览器打开网页,这里分享一个可以在我winform程序调用浏览器的方法,测试...1.调用谷歌浏览器打开网页(打开百度) 2.调用IE打开页面(打开百度) 3.调用用户默认设置的浏...
  • 之前一直在研究浏览器调用本地程序,但发现似乎只有IE的OCX才能做到,谷歌浏览器虽然说有插件,但实现IE下OCX的功能却不太可能,忽然有一天,有个同事让我看一下菜鸟的打印组件,豁然开朗。  菜鸟的打印组件竟然是...
  • Google自动打印

    2018-10-14 15:08:33
    2.我们这一节用的浏览器是Google Chrome (配置也是针对google的) 3.注意事项(这一点得看,否则运行失败还不知道问题喔)   开始: 1.打印机 去很多餐饮店,能看见收银台会有一个机器,打...
  • Process p = new Process(); p.StartInfo.FileName = "IExplore.exe"; p.StartInfo.Arguments = url; 求大神帮忙解答一下: 这个url我想调用我的java接口,但是我想传一些中文的参数过去,请问该怎么写?
1 2 3 4 5 ... 20
收藏数 1,918
精华内容 767