在懒人精灵的全分辨率脚本开发中,遇到一个浏览器跳转的问题。
由于自带的飞桨OCR识别速度在3-5秒,所以不能及时点击到toast中的确定按钮。
这里使用了限时操作和重试机制来完成。
-- 从浏览器跳转到小红书笔记页
-- 实现思路:
-- 先点击底部的玫红色按钮,由于ocr识别速度较慢,在下一次识别的时候,跳转按钮toast已经消失。
-- 所以第一次的时候需要获取到toast中确定按钮的位置。
-- 然后第二次点击玫红色按钮,之后立即盲点上次获取到的位置。
-- 中间会有一个下载弹窗的干扰,采用多线程来处理掉
-- 最后判断是否在小红书的笔记页面,如果在小红书笔记页面,则返回true,否则返回false。
function jumpToRedBook()
local result = false
-- 浏览器下载弹窗处理
function thread_func()
-- 这个线程负责处理下载弹窗,确保不会影响跳转操作
while true do
-- OCR识别“取消”按钮,如果弹窗出现则点击“取消”按钮。支持全分辨率识别
if next(OCR:find(nil, {'^取消$'}, true, 1*1000, {584,989,1009,1605, '中间'})) ~= nil then
print('取消下载') -- 找到并处理弹窗
-- break -- 如果找到弹窗则退出子线程
else
print('未找到弹窗') -- 如果没有找到弹窗,继续执行
end
sleep(1*1000) -- 每1秒检查一次弹窗
end
end
-- 创建并启动子线程来处理弹窗
local popupThread = Thread.newThread(thread_func)
local sureBtnX,sureBtnY -- 确定按钮中心点坐标
-- 限制N秒钟的死循环,避免程序长时间卡死
local startTime = os.clock()
while true do
-- 如果超过60秒,则停止当前操作
if os.clock() - startTime >= 60*1000 then
print('超时退出') -- 超时退出处理
popupThread:stopThread() -- 停止弹窗处理线程
break
end
-- 如果获取到确定按钮坐标且已经跳转到笔记页面,则返回true
if sureBtnX ~= nil and sureBtnY ~= nil and next(openCv.findImg(nil, {'笔记页_转发图标'},{848,46,1072,266,'右上角'},taskList.taskConfig['old_width'], taskList.taskConfig['old_height'],0.85,1)) ~= nil then
print('已跳转到小红书') -- 找到笔记页面
popupThread:stopThread() -- 停止弹窗处理线程
result = true -- 设置跳转成功
break
-- 如果已经识别到“App内打开”提示且确定按钮坐标已获取,点击确定按钮
elseif sureBtnX ~= nil and sureBtnY ~= nil and next(OCR:find(nil, {'App内打开$'}, true, 0, {154,1699,918,2230, '下部中间'})) ~= nil then
print('盲点确定按钮') -- 处理“App内打开”的提示,点击确定按钮
if G_CONF:get('bluetoothType') == 'BKM' then
bkHID.autoClick(sureBtnX, sureBtnY, 5*1000) -- 使用BKM设备模拟点击
elseif G_CONF:get('bluetoothType') == 'KMH' then
kmHID.autoClick(sureBtnX, sureBtnY, 5*1000) -- 使用KMH设备模拟点击
end
-- 如果没有找到确定按钮且识别到“App内打开”,尝试获取确定按钮的位置
elseif next(OCR:find(nil, {'App内打开$'}, true, 0, {154,1699,918,2230, '下部中间'})) ~= nil then
for i=1,3 do
-- 尝试3次定位确定按钮的坐标
local sureBtn = OCR:find(nil, {'确定'}, false, 0, {154,1699,918,2230, '下部中间'})
if next(sureBtn) ~= nil then
-- 如果找到了确定按钮,则记录按钮中心点坐标
sureBtnX,sureBtnY = sureBtn['centerX'],sureBtn['centerY']
break -- 找到按钮后退出循环
else
print('未找到确定按钮') -- 如果3次都未找到按钮,继续循环
end
end
end
end
return result -- 返回是否成功跳转到小红书笔记页面
end
思路:
- 浏览器弹窗处理:线程
thread_func
会不断检查是否有下载弹窗,并在弹窗出现时自动点击“取消”。 - 超时处理:整个循环会在60秒内执行,如果时间过长,线程会被停止。
- 跳转到笔记页面的判断:通过OCR识别“笔记页_转发图标”来确认是否已经跳转到小红书的笔记页面。
- 确定按钮的点击:在遇到“App内打开”提示时,通过OCR识别并获取确定按钮的坐标,然后模拟点击。
- 重试机制:如果第一次未能找到确定按钮,会通过多次尝试来获取坐标。
技术难点
1、全分辨率OpenCV找图,判断已进入指定应用的笔记页面
2、ocr范围识别自适应全分辨率
3、ocr识别结果中,一行文本中包含的子字符串的位置计算
4、重试机制和超时处理
注意
其实上述思路在实际运行中,还是有些许瑕疵的。
可以通过进一步的优化,来处理跳转问题。从而实现在任何情况下,都能准确无误的从浏览器跳转到应用内。
提供这段代码的目的,主要是帮你在遇到类似问题的时候,能够打开一些思路,通过变通去实现。
1. 官方交流QQ群,添加多个不批。建议使用安卓手机或电脑申请。
飞云脚本圈: 586333520
Auto.js学习交流③群:286635606
Auto.js学习交流②群:712194666(满员)
IOS免越狱自动化测试群:691997586
2. 盗版,破解有损他人权益和违法作为,请各位会员支持正版。
3. 本站部分资源来源于用户上传和网络搜集,如有侵权请提供版权证明并联系站长删除。
4.如未特别申明,本站的技术性文章均为原创,未经授权,禁止转载/搬运等侵权行为。
5.全站所有付费服务均为虚拟商品,购买后自动发货。售出后概不接受任何理由的退、换。注册即为接受此条款。
6.如果站内内容侵犯了您的权益,请联系站长删除。
飞云脚本 » 【懒人精灵】使用多线程来处理弹窗,全分辨率写法
飞云脚本圈: 586333520

Auto.js学习交流③群:286635606
Auto.js学习交流②群:712194666(满员)
IOS免越狱自动化测试群:691997586
2. 盗版,破解有损他人权益和违法作为,请各位会员支持正版。
3. 本站部分资源来源于用户上传和网络搜集,如有侵权请提供版权证明并联系站长删除。
4.如未特别申明,本站的技术性文章均为原创,未经授权,禁止转载/搬运等侵权行为。
5.全站所有付费服务均为虚拟商品,购买后自动发货。售出后概不接受任何理由的退、换。注册即为接受此条款。
6.如果站内内容侵犯了您的权益,请联系站长删除。
飞云脚本 » 【懒人精灵】使用多线程来处理弹窗,全分辨率写法