aardio 官方社区

用户名  找回密码
 注册会员

QQ登录

只需一步,快速开始

帖子
查看: 7994|回复: 6

chrome库执行js取返回值是否有长度限制?

[复制链接]

34

主题

29

回帖

390

积分

新手入门

积分
390
发表于 2017-12-14 11:20:22 | 显示全部楼层 |阅读模式
JS代码为
getBase64Image = function(){
                var img = document.querySelector('#validcodeCon > div > span > img')//document.querySelector("#lg img")
                img.setAttribute("crossOrigin",'Anonymous')//防跨域
                var canvas = document.createElement("canvas");
                canvas.width = img.width;
                canvas.height = img.height;
                var ctx = canvas.getContext("2d");
                ctx.drawImage(img, 0, 0,img.width,img.height);
                var dataURL = canvas.toDataURL("image/png");
                dataURL = dataURL.replace(/^data:image\/(png|jpg);base64,/, "");
                alert(dataURL);//网页上可以正常弹出显示正确值
                return dataURL;//返回dataURL就会出错
                //return 'ok'//可以返回ok
        }               
        getBase64Image()

调用协议执行JS后获取返回的base64文本,会导致错误:

[11:11:59] 出错了Failed to execute "_recvData"
[11:11:59] 出错了Failed to execute "send/sendData"
[11:11:59] 已关闭连接

请问chrome库对JS返回值有没有长度限制?是不是接收的返回值超过长度时会导致ws里的某些接收机制出错?还是说返回的base64字符串里有特殊符号导致出错?

166

主题

2154

回帖

1万

积分

管理员

积分
13056
发表于 2017-12-14 13:02:53 | 显示全部楼层
提供一下能运行测试,可以重现问题的代码,不要猜来猜去的。
每个帖子都要回复这句话,我哪有这么多的时间。

34

主题

29

回帖

390

积分

新手入门

积分
390
 楼主| 发表于 2017-12-14 19:57:51 | 显示全部楼层
自行解决了.

34

主题

29

回帖

390

积分

新手入门

积分
390
 楼主| 发表于 2017-12-14 20:18:36 | 显示全部楼层
发现一个问题,取百度首面的logo图片(图片比较大)时,第一次点击获取是成功的,再点一次,就出错了(Failed to execute "_recvData" 和 Failed to execute "send/sendData" ).
如果是hao123首页,取logo图片(图片比较小),不管点多少次都是成功的.
是否和图片的大小有关?

  1. import win.ui;
  2. /*DSG{{*/
  3. var winform = win.form(text="aardio form";right=1108;bottom=618)
  4. winform.add(
  5. button={cls="button";text="启动chrome";left=28;top=468;right=108;bottom=501;z=2};
  6. button2={cls="button";text="连接chrome";left=111;top=469;right=197;bottom=502;z=3};
  7. button3={cls="button";text="执行JS取返回值";left=35;top=555;right=158;bottom=588;z=4};
  8. button4={cls="button";text="打开指定网址";left=645;top=471;right=749;bottom=503;z=9};
  9. editJsStr={cls="edit";left=12;top=209;right=1088;bottom=452;ah=1;aw=1;edge=1;hscroll=1;multiline=1;vscroll=1;z=5};
  10. editLog={cls="edit";left=11;top=7;right=1090;bottom=205;ah=1;aw=1;edge=1;hscroll=1;multiline=1;vscroll=1;z=1};
  11. editUrl={cls="edit";text="https://www.hao123.com/";left=271;top=474;right=639;bottom=500;edge=1;multiline=1;z=8};
  12. picturebox={cls="picturebox";left=182;top=548;right=308;bottom=594;edge=1;z=6};
  13. plus={cls="plus";left=325;top=552;right=442;bottom=594;border=1;z=7}
  14. )
  15. /*}}*/

  16. winform.show();

  17. import crypt.bin;

  18. import process;
  19. import console;
  20. import web.socket.chrome;
  21. var ws = web.socket.chrome();

  22. var wsLinked = false;

  23. import inet.whttp;

  24. import web.rest.jsonLiteClient;
  25. var http = web.rest.jsonLiteClient();

  26. winform.editLog.limit = 100000;

  27. winform.editJsStr.text = /*
  28. getBase64Image = function(){
  29.     //var img = document.querySelector('#indexLogo > a > img');//在hao123.com上是每次点击获取都没问题
  30.         var img = document.querySelector('#lg img');//在百度上是第一次取成功,后面再取就出错了Failed to execute "_recvData" 和 Failed to execute "send/sendData"
  31.         img.setAttribute("crossOrigin",'Anonymous');//防跨域
  32.         var canvas = document.createElement("canvas");
  33.         canvas.width = img.width;
  34.         canvas.height = img.height;
  35.         var ctx = canvas.getContext("2d");
  36.         ctx.drawImage(img, 0, 0,img.width,img.height);
  37.         var dataURL = canvas.toDataURL("image/png");
  38.         var base64Str = dataURL.replace(/^data:image\/(png|jpg);base64,/, "");
  39.         //alert(base64Str);//此处可正常弹出
  40.         return base64Str;//在百度上,第二次点,返回base64字符串会导致Failed to execute "_recvData" 和 Failed to execute "send/sendData"
  41. }               
  42. getBase64Image()
  43. */

  44. //获取chrome安装路径
  45. import win.reg;
  46. var reg = win.reg("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\chrome.exe")
  47. var chromePath = reg.queryValue("");

  48. var timeHead = function(){
  49.         return "["++tostring(time(time(),"%H:%M:%S"))++"] ");
  50. }

  51. //打开连接触发的事件
  52. ws.on("open",
  53.     function(){
  54.                 winform.editLog.log(timeHead(),"已连接上chrome",'\r\n')          
  55.                 wsLinked = true;
  56.                 win.delay(1000);

  57.                 //监听chrome事件(这个服务端断开事件通知是自动就能接收的)
  58.                 ws.on("Inspector.detached",function(param){
  59.                         winform.editLog.log(timeHead(),"chrome已主动断开连接,原因:"++param.reason,'\r\n');
  60.                 })       
  61.         }
  62. )

  63. ws.on("close",function(){
  64.     wsLinked = false;
  65.         winform.editLog.log(timeHead(),"已关闭连接",'\r\n')               
  66. });

  67. ws.on("error",function(err){
  68.     wsLinked = false;
  69.         winform.editLog.log(timeHead(),"出错了",err,'\r\n');
  70. });  

  71. //启动Chrome
  72. winform.button.oncommand = function(id,event){
  73.         var shellStr = ` https://www.baidu.com/  --disable-web-security  --user-data-dir="D:\baidudata" --disk-cache-dir="D:\baiducache" `
  74.         process.execute(chromePath," --remote-debugging-port=9333" ++ shellStr ); //.execute
  75.         win.delay(2000);
  76.         winform.editLog.log(timeHead(),"请连接Chrome",'\r\n');//
  77. }

  78. //连接chrome
  79. winform.button2.oncommand = function(id,event){
  80.        
  81.         var pages = http.get("http://127.0.0.1:" ++ 9333 ++ "/json");//localhost ,用127.0.0.1好点       
  82.         if(pages && #pages){
  83.                 wsPageUrl = pages[1].webSocketDebuggerUrl;       
  84.                 ws.connect(wsPageUrl);
  85.                 return true;               
  86.         }
  87. }

  88. import console;
  89. import string.base64;

  90. //执行js并取返回值
  91. winform.button3.oncommand = function(id,event){
  92.    
  93.     if(!wsLinked){
  94.                    winform.editLog.log(timeHead(),"请连接Chrome",'\r\n');//
  95.                    return ;        
  96.     }
  97.    
  98.         var jsStr = winform.editJsStr.text;
  99.         ws.Runtime.evaluate(
  100.                 expression = jsStr;//加载完成会返回{"result":{"type":"string","value":"错误页-猪八戒网触屏版"}}
  101.         ).end = function(jsonObj,err){
  102.                
  103.                 var str = web.json.stringify(jsonObj);//json对象转换为字符串
  104.                 winform.editLog.log(timeHead(),"收到应答",string.unescape(str),'\r\n');//还原转义
  105.                
  106.                 if(jsonObj.result.value){
  107.                        
  108.                         var base64Str =jsonObj.result.value;//未解密
  109.                         //base64Str = crypt.bin.decodeBase64(base64Str);//解密方法1
  110.                         base64Str = string.base64.decode(base64Str)//解密方法2
  111.                        
  112.                         //console.log(timeHead(),"")
  113.                        
  114.                         //plus支持png
  115.                         winform.plus.setForeground(base64Str)
  116.                        
  117.                         //picturebox不支持png,用画板中转数据
  118.                         import gdip.bitmap;
  119.                         var bmp = gdip.bitmap(base64Str)//图片文件路径或数据
  120.                         winform.picturebox.setBitmap(bmp.copyHandle())//传址方式取过来
  121.                                
  122.                        
  123.                 }else {
  124.                         //console.log(timeHead(),"")
  125.                        
  126.                 }
  127.                
  128.                
  129.                
  130.         }
  131. }

  132. winform.button4.oncommand = function(id,event){
  133.         if(!wsLinked){ winform.msgboxErr("请先ws连接","提示:");return;}
  134.          
  135.     //打开网页
  136.     //winform.editLog.log(timeHead(),"发送请求",'\r\n');//,Page.navigate
  137.         ws.Page.navigate(
  138.                 url = winform.editUrl.text;
  139.         ).end = function(result,err){
  140.                 //winform.editLog.log(timeHead(),"收到应答",web.json.stringify(result),'\r\n')
  141.         }
  142. }
  143. win.loopMessage();
复制代码

41

主题

81

回帖

950

积分

荣誉会员

积分
950
发表于 2017-12-14 20:45:01 | 显示全部楼层
发这种贴有个鸡儿意义

评分

参与人数 1 +20 收起 理由
松江 + 20 就是

查看全部评分

34

主题

29

回帖

390

积分

新手入门

积分
390
 楼主| 发表于 2017-12-14 22:59:40 | 显示全部楼层
测试到解决办法:每次点击执行JS获取按钮前,重新连接chrome,这样每次都能正常取回了.

166

主题

2154

回帖

1万

积分

管理员

积分
13056
发表于 2017-12-25 04:35:53 | 显示全部楼层
lacker 发表于 2017-12-14 22:59
测试到解决办法:每次点击执行JS获取按钮前,重新连接chrome,这样每次都能正常取回了.

这个问题可能是5e65反馈的那个BUG导致的,
在WebSocket的数据包足够大,用8位字节表示长度时,我写的代码有BUG导致数据包接收不完整,因为接收不完整,所以后面的数据包都乱了,所以你要重新连接。

该问题最新版本已修正。
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|aardio.com|aardio 官方社区 ( 皖ICP备09012014号 )

GMT+8, 2025-6-11 11:00 , Processed in 0.123018 second(s), 26 queries .

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表