1、又遇到一个相当复杂的问题,并且延伸出很多的问题。
- 在虚拟WebBrowser中原本进行的如火如荼,忽然出现click.js的报错问题。怀疑是兼容性问题。
- 使用真实的WebBrowser1来测试是否会有这样的问题,假如没有那就是兼容性问题,假如有那就是通用问题,这样一来还可以在可视化的界面测试。舒服一点。
- 结果一使用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)
");
}