Bootstrap
之前一直使用Webbrower浏览器控件,但最近在开发一些东西时,想要在Iframe中执行js代码,但在WebBrowser中获取不到Iframe。找到了一些资料,发现CefSharp Chrome 浏览器控件挺好用,调用Iframe中Js代码也没有问题。本文主要分享一下用CefSharp后台执行Iframe中的Js的方法。

1、Winform项目中安装CefSharp

1)使用Nuget安装

搜索cefsharp =》找到CefSharp.WinForms =》点击安装

VS(Visual Studio)中Nuget的使用

2)手动下载编译好的文件添加引用

添加以下文件引用:
CefSharp.dll
CefSharp.Core.dll
CefSharp.WinForms.dll

3)下载源代码自己编译需要的dll

代码地址:https://github.com/cefsharp/CefSharp/releases

添加以下文件引用:
CefSharp.dll
CefSharp.Core.dll
CefSharp.WinForms.dll

注意:3种方法选一种即可。

2、获取指定的Iframe的代码

this.browser.GetBrowser().GetFrame("tabs_portal_5_iframe").EvaluateScriptAsync("document.getElementById(\"block_3\").click()").Result;

3、测试代码

using CefSharp;
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 MyBrowser
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        public delegate void Mydelegate();
        public ChromiumWebBrowser browser;
        public void InitBrowser()
        {
            Cef.Initialize(new CefSettings());
            browser = new ChromiumWebBrowser("https://oa.tongda2000.com/general/index.php?isIE=0&modify_pwd=0");
            this.Controls.Add(browser);
            browser.Dock = DockStyle.Fill;
            browser.FrameLoadEnd += new EventHandler<FrameLoadEndEventArgs>(FrameLoadEndHandle);
        }
        public void FrameLoadEndHandle(object sender, FrameLoadEndEventArgs e)
        {
            //MessageBox.Show("count = " + e.Browser.GetFrameCount());
            //MessageBox.Show("e.Url = " + e.Url);
            //MessageBox.Show("e.Frame.Url = " + e.Frame.Url);
            if (e.Frame.Url.IndexOf("/portal/personal/") > -1)
            {
                var frame = e.Frame;
                Task.Factory.StartNew(() =>
                {
                    System.Threading.Thread.Sleep(9000);
                    this.browser.Invoke(new Action(() =>
                    {
                        var res = this.browser.GetBrowser().GetFrame("tabs_portal_5_iframe").EvaluateScriptAsync("document.getElementById(\"block_3\").click()").Result;
                    }));
                });
                //object o = res.Result;document.getElementById("block_3").click()
                // MessageBox.Show(e.Frame.IsValid.ToString());
                //MessageBox.Show(e.Frame.Browser.IsLoading.ToString());
            }
        }
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            Cef.Shutdown();
        }
    }
}