1、通过 JavaScript 解决了验证码的点击问题

// http://www.cnblogs.com/CyLee/p/7513342.html
var ev = document.createEvent('HTMLEvents'); 
ev.clientX = 625
ev.clientY = 356
ev.initEvent('click', false, true); 
$(".geetest_item.geetest_big_item")[0].dispatchEvent(ev)

2、如何通过 WebBrowser 向页面发送 JavaScript

某些页面的alert进行了重构,譬如http://www.cnblogs.com/cylee。那么alert就会测试无效。最好拿百度来测试。

方法一:创建script标签并且插入body中

HtmlElement script = this.webBrowser1.Document.CreateElement("script");
script.SetAttribute("type", "text/javascript");
script.SetAttribute("text", "alert(123)");
HtmlElement head = this.webBrowser1.Document.Body.AppendChild(script);

方法二:添加Microsoft Internet Controls 、Microsoft HTML Object Library的引用代码示例:

IHTMLDocument2 doc = this.webBrowser1.Document.DomDocument as IHTMLDocument2;
IHTMLWindow2 win = doc.parentWindow as IHTMLWindow2;
string jsCode = @"
    window.alert(123);
";
win.execScript(jsCode, "javascript");

3、解决 WebBrowser 默认的 IE 版本太低(IE7)的问题。会导致 JS 无法正常运行,页面加载错误等令人头疼的问题:

using System;
using System.Windows.Forms;
using FastVerCode;
using System.Diagnostics;
using Microsoft.Win32;

namespace WinFormApp
{
    public partial class Form1 : Form
    {
        public enum IE { IE7 = 7000, IE8 = 8000, IE9 = 9999, IE10 = 10001, IE11 = 11001 }

        public Form1()
        {
            /**
            * 解决WebBrowser默认的IE版本太低(IE7)的问题,只需要改变枚举即可
            * https://dotblogs.com.tw/larrynung/archive/2012/10/15/77505.aspx
            * https://msdn.microsoft.com/en-us/library/ee330730(v=vs.85).aspx#browser_emulation
            * InitializeComponent();
            */
            var appName = Process.GetCurrentProcess().MainModule.ModuleName;
            Registry.SetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION", appName, IE.IE11, RegistryValueKind.DWord);
            InitializeComponent();
        }
    }
}

通过修改注册表,将版本提升至IE11来解决这个问题。

通过这段代码,我们也学到如何在C#中修改window注册表

4、WebBrowser 中页面的 js 调用 C# 的函数

private void button16_Click(object sender, EventArgs e)
{
    // 这一步特别重要
    // 这里的this其实可以指定一个专门的类。这样就方便维护管理了
    this.webBrowser1.ObjectForScripting = this;

    // 生成一个调用C#函数的button按钮
    string jsCode = @"
        var button = document.createElement('button');
        button.innerText = 'javascript访问C#代码';
        button.onclick = function () {window.external.MyMessageBox('喵哈哈哈哈哈')};
        document.body.appendChild(button);
    ";

    // 往页面添加这个测试按钮
    Functions.ExecScript(this.webBrowser1, jsCode);
}

public void MyMessageBox(string message)
{
    MessageBox.Show(message, "Fuck You");
}

往界面添加了一个按钮,通过点击调用C#的函数,这里的this其实可以换成一个专门的类。这样就方便维护管理了

5、webBrowser 脚本报错弹窗太烦了...

何况还不知道会不会影响到虚拟webBrowser。以防万一。应该想办法解决

private void Form1_Load(object sender, EventArgs e)
{
    // 设置 webBrowser1 不会弹出脚本错误提示窗口。生产环境建议开启
    // 开发环境提示窗口有助于定位错误
    this.webBrowser1.ScriptErrorsSuppressed = true;
}

results matching ""

    No results matching ""