1、又遇到一个相当复杂的问题,并且延伸出很多的问题。

  1. 在虚拟WebBrowser中原本进行的如火如荼,忽然出现click.js的报错问题。怀疑是兼容性问题。
  2. 使用真实的WebBrowser1来测试是否会有这样的问题,假如没有那就是兼容性问题,假如有那就是通用问题,这样一来还可以在可视化的界面测试。舒服一点。
  3. 结果一使用WebBrowser1更惨。各种问题接连而至。首先,执行js代码居然出现不存在window和document对象?在其次。通过删减代码后,执行简单的文本框赋值,也出现问题,第一次完全没有反应,第二次才有?并且也出现和百度一样的问题。先执行,再登录那么第一次会成功。这两者有什么区别呢?

先解决第三个小问题:其实就是重新设置 WebBrowser.ScrollBarsEnabled = false; 导致了刷新页面。所以才会有一系列的问题。直接不要这一句就好了。反正也是之前手痒添加的。

再解决第二个问题:答案是正常的。同样的代码确实click.js没有报错,正常按照我的想法执行了。说明了可能是兼容性问题,或者click.js中有特殊的处理,可以监视使用者是什么平台。如果这是真的将非常恐怖,反正我身为前端开发者是没有这种经验的。但我先别往这种坏事上想,没准只是兼容性问题,但目前,我在IE7/8/9/10/11 中都没有模拟出来。现在就没什么头绪了。只能先办法再多试试模拟了。毕竟那个报错也没什么卵用。

现在来解决第一个问题:确实依然会报错,但当我写死代码的时候(clientX 和 clientY 都设置为100),居然就正常了。

/// <summary>
/// 登录
/// </summary>
/// <param name="username"></param>
/// <param name="password"></param>
public void Login(string username, string password)
{
    ExecScript(@"     
        $('#username').val('" + username + @"'); 
        $('#password').val('" + password + @"'); 
        document.getElementById('loginsubmit').click(); 
        var s = setInterval(function() {
            document.getElementById('loginsubmit').click(); 
            if ($('.geetest_widget').is(':visible') && $('.geetest_item_img').length && $('.geetest_item_img')[0].complete) {  
                clearInterval(s);
                $('.geetest_panel_box').css({left:0,top:0,transform:'translate(0, 0)'});
                setTimeout(function () {
                    var ev = document.createEvent('HTMLEvents'); 
                    ev.clientX = 100;
                    ev.clientY = 100;
                    ev.initEvent('click', false, true); 
                    $('.geetest_item.geetest_big_item')[0].dispatchEvent(ev);
                    setTimeout(function () {window.external.CutPic(0, 0, 1024, 768);}, 3000)   

                    //var path = window.external.CutPic();
                    //var returnMess = window.external.SendImage(path);
                    //var arr = returnMess.split('|');
                    //for (var i = 0; i < arr.length - 2; i++) {
                    //    var _arr = arr[i].split(',');
                    //    window.alert(_arr[0]+'|'+_arr[1]);
                    //    var ev = document.createEvent('HTMLEvents'); 
                    //    ev.clientX = _arr[0];
                    //    ev.clientY = _arr[1];
                    //    ev.initEvent('click', false, true); 
                    //    $('.geetest_item.geetest_big_item')[0].dispatchEvent(ev);
                    //}
                }, 500);
            }
        }, 100)
    ");
}

这里有一个小插曲。一开始我用以上的代码来测试真实WebBrowser1,结果是可行的,当时的截图并没有使用setTimeout来延迟3秒截图。而是直接截图,图片上居然没有小点。这让我怀疑,一是截图不能截到有点,二是有异步。果然我使用了异步才可以。接着,我使用虚拟WebBrowser,果然也可以了。

所以接下来最重要的问题,就是解决为什么真实代码会报错的问题。怀疑是语法错误。

完成啦!

终于解决了。确实是语法错误,问题在于clientX 和 clientY 的参数必须是纯数字(Number / Int)类型。所以使用parseInt转换它的值即可。最终代码如下:

/// <summary>
/// 登录
/// </summary>
/// <param name="username"></param>
/// <param name="password"></param>
public void Login(string username, string password)
{
    ExecScript(@"     
        $('#username').val('" + username + @"'); 
        $('#password').val('" + password + @"'); 
        document.getElementById('loginsubmit').click(); 
        var s = setInterval(function() {
            document.getElementById('loginsubmit').click(); 
            if ($('.geetest_widget').is(':visible') && $('.geetest_item_img').length && $('.geetest_item_img')[0].complete) {  
                clearInterval(s);
                $('.geetest_panel_box').css({left:0,top:0,transform:'translate(0, 0)'});
                setTimeout(function () {
                   var path = window.external.CutPic();
                   var returnMess = window.external.SendImage(path);
                   var arr = returnMess.split('|');
                   for (var i = 0; i < arr.length - 2; i++) {
                       var _arr = arr[i].split(',');
                       window.alert(_arr[0]+'|'+_arr[1]);
                       var ev = document.createEvent('HTMLEvents'); 
                       ev.clientX = parseInt(_arr[0]);
                       ev.clientY = parseInt(_arr[1]);
                       ev.initEvent('click', false, true); 
                       $('.geetest_item.geetest_big_item')[0].dispatchEvent(ev);
                   }
                  setTimeout(function () {window.external.CutPic(0, 0, 1024, 768);}, 3000)
                }, 500);
            }
        }, 100)
    ");
}

results matching ""

    No results matching ""