:
1.本发明涉及一种面向无障碍检测的移动端应用页面自动遍历方法,属于计算机技术软件领域。
背景技术:2.在信息无障碍领域,若要进行页面的合规检测,必须先遍历得到所有的页面。对于web端网页来说,可用简单的爬虫技术来进行爬取,而对于移动端应用来说,技术则复杂和困难得多。另一方面,当今移动互联网高速发展,移动端应用覆盖面越来越广,覆盖人群越来越多,其中就包括了残疾人群体。因此,面向无障碍检测的移动端应用的页面自动遍历问题亟需解决。
3.目前,常见的移动端应用页面自动遍历方法存在于测试领域,通常利用侵入式的自动化测试工具来进行遍历。主要存在侵入式、遍历漏检、容易阻塞中断等缺点。
技术实现要素:4.针对以上问题和难点,本发明提出了一种面向无障碍检测的移动端应用页面自动遍历方法。与传统方法相比,该方法具有以下特点和优点:(1)结合了硬件和软件,将机械臂和手机无障碍辅助程序结合起来,实现了自动化。(2)遍历的爬取度高,手机的无障碍辅助程序(voiceover或talkback)在理想情况下可以遍历到页面的每一个聚焦框,即理想情况下,可以遍历到每一个页面。(3)非侵入式,不需要获得软件的源代码。(4)普适性高,可应用于ios端和android端,应用于不同尺寸、不同分辨率设备。
5.面向无障碍检测的移动端应用页面自动遍历方法,包括如下步骤:
6.s1:机械臂连接电源,连接上位机;手机打开推流软件进行推流;如果是ios端,打开voiceover,如果是android端,打开talkback;机械臂复位,和手机配准;
7.s2:打开目标app,进入首页,创建一个页面对象,进行单页面遍历;
8.s21:进入一个新页面,首先进行截图,作为此页面的图片;
9.s22:由于聚焦框检测算法需要用到前一个聚焦框的截图,第一个聚焦框用第二个聚焦框的截图,因此操纵机械臂先右滑一下,得到第二个聚焦框的截图,再往左滑回到第一个聚焦框;
10.s23:正式开始单页面的遍历,机械臂每右滑一次,生成一个新的聚焦框对象,用聚焦框检测算法检测聚焦框的坐标,图像等信息,聚焦框id为自增id;将新生成的聚焦框对象加入此页面的聚焦框列表中;如果检测不出,则标志此聚焦框漏检,并将此聚焦框对象各属性置为特殊值;
11.s24:机械臂不断右滑直至焦点陷入或者达到设定的遍历次数,由此可以判断页面是否为瀑布流,如果是瀑布流,则还需进行导航栏的遍历;
12.s241:app的有些页面是无法结束的,一直右滑滑不到尽头,我们称这样的页面为瀑布流,否则为非瀑布流;
13.s242:设定右滑最大次数,每次右滑之后都判断是否结束;
14.s2421:正常情况下,对于非瀑布流,当右滑到最后一个聚焦框时,ios端手机如果继续右滑,会一直停留在最后一个聚焦框,而android端手机右滑一次会停留在最后一个聚焦框,再右滑一次,会回到第一个聚焦框开始循环遍历,以上,双端最后都存在单焦点陷入的情况;
15.s2422:首先,设定允许聚焦框连续相同的次数;
16.s2423:如果两个聚焦框的左上角坐标,宽度,长度差值都在设定的允许误差范围内,则判定两个聚焦框相同,否则判定为不相同;当聚焦框连续相同的次数达到设定的阈值,则判定为结束;
17.s2424:此外,还有一种情况也可判定为结束,在无障碍辅助程序中,有时会出现一种循环焦点陷入的异常,即聚焦框在某几个位置循环往复,这种情况下,当某个聚焦框按固定间隔(间隔需大于1)循环超过设定的循环焦点陷入最大次数时,也判定为结束;
18.s243:若判定为右滑结束,删除此页面聚焦框列表最后冗余的聚焦框;若为单焦点陷入,删除聚焦框列表最后连续相同的聚焦框,删除的个数为设定的允许聚焦框连续相同的次数减去1;若为循环焦点陷入,删除聚焦框列表最后连续相同的循环节,删除的节数为设定的循环焦点陷入最大次数减去1,即只保留一个循环节;
19.s244:如果在设定的右滑最大次数之前就结束,认为页面是非瀑布流,否则认为页面是瀑布流;
20.s245:对于android端,若为非瀑布流,需点击此页面最后一个非漏检的聚焦框,并将此页面的cur_focus_box_id属性设为此聚焦框id;
21.s246:对于瀑布流的情况,需要考虑导航栏;
22.s2461:当右滑超过设定的次数后,停止右滑;之后连续右滑,每次右滑都判断聚焦框区域是否有变化;
23.s2462:经验来说,导航栏的位置总是在某个区域内不变,计算机械臂右滑前后两张截图的导航栏区域的平均像素差值(差值为绝对值),若小于设定的允许误差范围,则认为导航栏区域不变,否则认为有变化;
24.s2463:若导航栏区域有变化,则认为此瀑布流页面无导航栏;若连续右滑超过设定的最大右滑次数后,聚焦框区域一直没有变化,则认为此瀑布流页面有导航栏;
25.s2464:对于android端,无论是否有导航栏,需向左滑直到回退到未开始判断时所在的聚焦框,并点击此页面最后一个非漏检的聚焦框,并将此页面的cur_focus_box_id属性设为此聚焦框id:
26.s2465:若判断此页面有导航栏,则需遍历导航栏的聚焦框;
27.s24651:经验来说,页面的导航栏位置总是处在某个区域中,而导航栏最右边一个聚焦框的位置也基本在某个区域,可预设坐标;
28.s24652:操纵机械臂点击到导航栏最右边的聚焦框,然后不断左滑;
29.s24653:位于导航栏的聚焦框有一定特征,即它们的坐标的y值以及长度(y方向上的长度)一般都相同,比较前后两个聚焦框的这两个指标,若相差超过设定的允许误差范围,则认为此聚焦框不再是一个位于导航栏的聚焦框;
30.s24654:不断左滑直到滑到的聚焦框不再是一个属于导航栏的聚焦框;对于属于
导航栏的聚焦框,标记此聚焦框位于导航栏;
31.s24655:对于android端,还需点击cur_focus_box_id对应的聚焦框;
32.s25:结束遍历后,若此页面非首页,检测页面后退的功能;
33.s251:如果是ios端,检测ios端;
34.s2511:先通过计算机视觉算法检测页面的后退键、关闭键并记录,作为备用方案:;
35.s2512:再用voiceover的后退指令,用直方图法判断下滑后的页面和此页面对象记录的父页面的图片是否相同;
36.s2513:如果相同则标志此页面能通过voiceover指令后退,并将此app对象的cur_page_id置为父页面的id,否则仍为此页面的id;
37.s252:如果是android端,检测android端;
38.s2521:用talkback的后退指令,用直方图法判断下滑后的页面和此页面对象记录的父页面的图片是否相同;
39.s2522:如果相同则标志此页面能通过talkback指令后退,将此页面的cur_focus_box_id置为0,并将此app对象的cur_page_id置为父页面的id,否则仍为此页面的id;
40.s3:将首页遍历得到的所有聚焦框加入bfs队列;
41.s4:开始广度优先遍历,每次取队头聚焦框并出队,计算从当前页面到目标页面的路径,操纵机械臂到达路径指向的页面;
42.s41:计算从当前页面到目标页面的路径;
43.s411:若当前页面层数大于目标页面,则当前页面先上溯,每上一层,就在路径列表中添加
‑
1,表示后退一次,并且当前页面id更新为父页面的id,直到当前页面和目标页面层数相同;
44.s412:然后,当前页面和目标页面共同上溯,当前页面每上一层,在路径列表path中添加
‑
1,并且当前页面id更新为父页面的id;目标页面每上一层,记录此次上溯的父页面id和父聚焦框id,添加在down_path中,表示正向走一层,并且目标页面id更新为父页面的id,直到当前页面id和目标页面id相同;
45.s413:最后将down_path反转后追加到path,最终形成路径path;
46.s414:若当前页面层数小于目标页面,则目标页面先上溯,每上一层,就记录此次上溯的父页面id和父聚焦框id,添加在down_path中,表示正向走一层,并且目标页面id更新为父页面的id,直到当前页面和目标页面层数相同;
47.s415:然后,当前页面和目标页面共同上溯,当前页面每上一层,在路径列表path中添加
‑
1,并且当前页面id更新为父页面的id;目标页面每上一层,记录此次上溯的父页面id和父聚焦框id,添加在down_path中,并且目标页面id更新为父页面的id,直到当前页面id和目标页面id相同;
48.s416:最后将down_path反转后追加到path,最终形成路径path;’49.s42:操纵机械臂到达路径指向的页面;
50.s421:操纵ios端:
51.s4211:首先,在ios系统中,进入设置
‑
辅助功能
‑
旁白
‑
命令
‑
触控手势,将“移到第一项”指令分配给“单指向上轻扫”手势;
52.s4212:对于s41中生成的路径,每一项为一步;
53.s4213:若此项为
‑
1,则表明后退一页;
54.s4214:若当前页面能通过voiceover手势后退,则往下轻扫后退,并单指向上轻扫移到第一项,通过直方图法比较此时的截图和此页面的父页面的图片是否相同;若相同则表明后退正确,后退到父页面,cur_page_id置为父页面id;否则,表示后退错误;
55.s4215:若后退错误,重启app;
56.s42151:在ios系统中,进入设置
‑
辅助功能
‑
旁白
‑
命令
‑
触控手势,将“app切换器”指令分配给“单指轻点三下”手势,点击屏幕三下,打开app切换器;
57.s42152:在ios系统中,进入设置
‑
辅助功能
‑
旁白
‑
命令
‑
触控手势,将“向下滚动”指令分配给“单指轻点四下”手势;打开app切换器后,点击屏幕四下,向下滚动关闭此app进程;
58.s42153:操纵机械臂带动触头在屏幕上从底部向顶部滑动5厘米至屏幕中央,停留2秒后触头向上移动离开屏幕;
59.s42154:单击app,后双击;
60.s4216:若后退错误,更新路径;
61.s42161:首先将最近公共祖先id初始化为起点页面id,遍历旧路径;
62.s42162:若此项是
‑
1,则更新最近公共祖先id为最近公共祖先id对应的页面的父页面的id;
63.s42163:若此项为单步页面id和单步聚焦框id,则最近公共祖先id为此单步页面id并中断遍历,直接返回,由此得出起点页面和目标页面的最近公共祖先,并删除起点页面到最近公共祖先的路径;
64.s42164:根据s41的方法,计算从首页到最近公共祖先的路径,新路径则为从首页到最近公共祖先的路径加上最近公共祖先到目标页面的路径;
65.s4217:重启后,cur_page_id置为0,表示重启后回到首页;
66.s4218:若当前页面不能通过voiceover手势后退,如果通过计算机视觉算法检测出了后退键,则点击检测出的后退键坐标,移到第一项,通过直方图法比较点击后的截图和此页面的父页面的图片是否相同,若相同则表明检测正确,后退到父页面,cur_page_id置为父页面id;否则,表示检测错误,根据s4215的方法重启app,并根据s4216的方法更新路径,cur_page_id置为0,表示重启后回到首页;
67.s4219:如果没有通过计算机视觉算法检测出后退键,这种情况下,如果通过计算机视觉算法检测出关闭键,则点击检测出的关闭键坐标,移到第一项,通过直方图法比较点击后的截图和此页面的父页面的图片是否相同,若相同则表明检测正确,后退到父页面,cur_page_id置为父页面id;否则,表示检测错误,根据s4215的方法重启app,并根据s4216的方法更新路径,cur_page_id置为0,表示重启后回到首页;
68.s42110:如果没有通过计算机视觉算法检测出关闭键,则先点击预设的经验中的后退键,如果点击前后的截图发生变化,则单指向上轻扫移到第一项,比较点击后的截图和此页面的父页面的图片是否相同,若相同则表明检测正确,后退到父页面,cur_page_id置为父页面id;否则,表示检测错误,根据s4215的方法重启app,并根据s4216的方法更新路径,cur_page_id置为0,表示重启后回到首页;
69.s42111:如果点击前后截图没有发生变化,表示经验中的后退键无效,则点击预设的经验中的关闭键,移到第一项,比较点击后的截图和此页面的父页面的图片是否相同,若相同则表明检测正确,后退到父页面,cur_page_id置为父页面id;否则,表示检测错误,根据s4215的方法重启app,并根据s4216的方法更新路径,cur_page_id置为0,表示重启后回到首页;
70.s42112:若此项为此步页面id和此步聚焦框id,移到第一项,计算目前页面截图和此步页面的图片是否相同,如果不同,则认为正向的路径走错了,将此次访问的目标页面的目标聚焦框设为漏检,并根据s4215的方法重启app,cur_page_id置为0;如果相同,若此步聚焦框不属于导航栏,则连续右滑聚焦框id下,若属于导航栏,则无需右滑,然后单击并双击聚焦框;
71.s42113:如此往复,直到走完path中的每一步,最终到达目标页面;
72.s422:操纵android端;
73.s4221:对于s41中生成的路径,每一项为一步;
74.s4222:若此项为
‑
1,则表明后退一页;
75.s4223:若当前页面能通过talkback手势后退,则往下轻扫后退,通过直方图法比较此时的截图和此页面的父页面的图片是否相同,若相同则表明后退正确,此页面的cur_focus_box_id置为0,cur_page_id置为父页面id;否则,表示后退错误。
76.s4224:若后退错误,重启app;
77.s42241:单击页面中app切换器按钮,双击进入app切换器。
78.s42242:打开app切换器后,单击清空app按钮,双击清空app。
79.s42243:清空app后回到主屏幕,单击屏幕上返回第一页的按钮,双击,返回主屏幕第一页。
80.s42244:单击app,后双击。
81.s4225:重启后,根据s4216的方法更新路径,cur_page_id置为0,表示重启后回到首页;
82.s4226:若不能通过talkback手势后退,则根据s4224的方法重启app,并根据s4216的方法更新路径,cur_page_id置为0,表示重启后回到首页;
83.s4227:若此项为此步目标页面id和此步聚焦框id,如果此步目标聚焦框不属于导航栏,计算此步目标聚焦框id和此页面目前所在聚焦框id的差值walk,若walk大于0,则右滑walk下,否则左滑
‑
walk下;
84.s4228:单击,用聚焦框检测算法检测此时页面的聚焦框,若检测不出,则将此次访问的目标页面的目标聚焦框设为漏检,并根据s4224的方法重启app,cur_page_id置为0;
85.s4229:若检测出聚焦框,则检查此聚焦框和此步目标聚焦框是否相同;聚焦框有左上角x坐标,左上角y坐标,长度、宽度四个指标,比较此聚焦框和此步目标聚焦框的这四个指标,任何一个指标的差值大于设定的允许误差范围,则认为两个聚焦框不相同,否则认为相同;
86.s42210:若此聚焦框和此步目标聚焦框相同,则双击此聚焦框,并将此页的cur_focus_box_id置为此步目标聚焦框id;
87.s42211:若此聚焦框和此步目标聚焦框不同,则认为正向路径走错了,将此次访问
的目标页面的目标聚焦框设为漏检,并根据s4224的方法重启app,cur_page_id置为0;
88.s42212:如此往复,直到走完path中的每一步,最终到达目标页面;
89.s5:检查能否通过双击此页面的目标聚焦框生成一个新页面,若能,则根据新页面层数对页面进行相应操作,将此页面加入此app页面列表,否则做相应的异常处理;
90.s51:检查能否通过双击此页面的目标聚焦框生成一个新页面;
91.s511:ios端:操纵机械臂到达路径指向的页面后,移到第一项,通过直方图法比较此页面和目标页面是否相同,若不相同,则将此次访问的目标页面的目标聚焦框设为漏检,并根据s4215的方法重启app,cur_page_id置为0;
92.s512:若此页面和目标页面相同,若目标聚焦框不属于导航栏,则连续右滑聚焦框id下,若属于导航栏,则无需右滑,单击聚焦框;
93.s513:android端:若目标聚焦框不属于导航栏,计算此步目标聚焦框id和此页面目前所在聚焦框id的差值walk,若walk大于0,则右滑walk下,否则左滑
‑
walk下;若目标聚焦框属于导航栏,则无需移动;
94.s514:单击聚焦框,用聚焦框检测算法检测此时页面的聚焦框,若检测不出,则将此次访问的目标页面的目标聚焦框设为漏检,并根据s4224的方法重启app,cur_page_id置为0;
95.s515:若检测出聚焦框,则检查此聚焦框和目标聚焦框是否相同,若相同,将此页的cur_focus_box_id置为目标聚焦框id;若不同,将此次访问的目标页面的目标聚焦框设为漏检,并根据s4224的方法重启app,cur_page_id置为0;
96.s516:双击聚焦框,通过直方图法比较双击前后图像,若相同,则认为此聚焦框是无效聚焦框并标记,否则进入下一步;’97.s517:ios端需移到第一项然后截图,android端直接截图;比较双击聚焦框后的页面是否和已经生成的所有页面的图像相同,如果和某一页面相同,则认为进入了之前遍历过的页面,将cur_page_id置为此页面id;
98.s518:特别的,对于android端,如果此页面id为目标页面的父页面的id,则认为点击这个聚焦框并没有进入一个新页面而是返回了前一页,则需将目标页面的cur_focus_box_id置为0;
99.s519:若和已遍历过的页面没有相同的,则认为进入了一个新页面;
100.s52:根据新页面层数对页面进行相应操作;
101.s521:若新页面层数小于设定的停止层数,则对新页面根据s2的方法进行单页面遍历,并将遍历得到的聚焦框加入bfs队列;
102.s522:若新页面层数达到设定的停止层数,首先进行截图,作为此页面的图片;
103.s523:若此页面非首页:ios端:先通过计算机视觉算法检测页面的后退键、关闭键并记录,作为备用方案;
104.s524:再用voiceover的后退指令,用直方图法判断下滑后的页面和此页面对象记录的父页面的图片是否相同,如果相同则标志此页面能通过voiceover指令后退,并将此app对象的cur_page_id置为父页面的id,否则仍为此页面的id;
105.s525:对于android端,用talkback的后退指令,用直方图法判断下滑后的页面和此页面对象记录的父页面的图片是否相同,如果相同则标志此页面能通过talkback指令后
退,将此页面的cur_focus_box_id置为0,并将此app对象的cur_page_id置为父页面的id,否则仍为此页面的id;
106.s6:如此循环访问bfs队列,直到队列为空。
107.优选地,步骤s242中设定右滑最大次数为100次。
108.优选地,步骤s2422中设定允许聚焦框连续相同的次数为:ios端6次,android端2次。
109.优选地,步骤s2423、s2462、s24653、s4229中设定允许误差范围为2像素。
110.优选地,步骤s2424中设定循环焦点陷入最大次数为3次。
111.优选地,步骤s2463中设定最大右滑次数为20次。
112.具体地,所述步骤s2512中,ios端voiceover后退指令的方法为:在ios系统中,进入设置
‑
辅助功能
‑
旁白
‑
命令
‑
触控手势,将“退出”指令分配给“单指向下轻扫”手势。
113.具体地,所述步骤s2521中,android端talkback后退指令的方法为:在android系统中,进入设置
‑
辅助功能
‑
无障碍
‑
屏幕朗读
‑
更多设置
‑
自定义快捷手势,将“返回”指令分配给“向下滑动”手势。
114.本发明适用于复杂场景,普适性强,可作为无障碍合规检测的上游服务,爬取应用的页面信息,供后续的检测使用。
115.综上,本发明创建了面向无障碍检测的移动端应用页面自动遍历方法,具有如下有益效果:(1)结合了硬件和软件,将机械臂和手机无障碍辅助程序结合起来,实现了自动化。(2)遍历的爬取度高,手机的无障碍辅助程序(voiceover或talkback)在理想情况下可以遍历到页面的每一个聚焦框,即理想情况下,可以遍历到每一个页面。(3)非侵入式,不需要获得软件的源代码。(4)普适性高,可应用于ios端和android端,应用于不同尺寸、不同分辨率设备。
附图说明:
116.为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
117.图1是本发明提供的面向无障碍检测的移动端应用页面自动遍历方法的总体流程图;
118.图2是本发明提供的面向无障碍检测的移动端应用页面自动遍历方法的总体流程图中单页面遍历的流程图;
119.图3是本发明提供的面向无障碍检测的移动端应用页面自动遍历方法的总体流程图中操纵机械臂到达路径指向的页面的流程图;
120.图4是本发明提供的面向无障碍检测的移动端应用页面自动遍历方法的总体流程图中判断双击聚焦框能否进入新页面的流程图;
121.具体实施方法:
122.下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例
所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
123.本实例以某个app为例,方法包括如下具体步骤:
124.s1:机械臂连接电源,连接上位机;手机打开推流软件进行推流;如果是ios端,打开voiceover,如果是android端,打开talkback;机械臂复位,和手机配准;
125.s2:打开目标app,进入首页,创建一个页面对象,进行单页面遍历;
126.s21:进入一个新页面,首先进行截图,作为此页面的图片;
127.s22:由于聚焦框检测算法需要用到前一个聚焦框的截图,第一个聚焦框用第二个聚焦框的截图,因此操纵机械臂先右滑一下,得到第二个聚焦框的截图,再往左滑回到第一个聚焦框;
128.s23:正式开始单页面的遍历,机械臂每右滑一次,生成一个新的聚焦框对象,用聚焦框检测算法检测聚焦框的坐标,图像等信息,聚焦框id为自增id;将新生成的聚焦框对象加入此页面的聚焦框列表中;如果检测不出,则标志此聚焦框漏检,并将此聚焦框对象各属性置为特殊值;
129.s24:机械臂不断右滑直至焦点陷入或者达到设定的遍历次数,由此可以判断页面是否为瀑布流,如果是瀑布流,则还需进行导航栏的遍历;
130.s241:app的有些页面是无法结束的,一直右滑滑不到尽头,我们称这样的页面为瀑布流,否则为非瀑布流;
131.s242:设定右滑最大次数,每次右滑之后都判断是否结束;
132.s2421:正常情况下,对于非瀑布流,当右滑到最后一个聚焦框时,ios端手机如果继续右滑,会一直停留在最后一个聚焦框,而android端手机右滑一次会停留在最后一个聚焦框,再右滑一次,会回到第一个聚焦框开始循环遍历,以上,双端最后都存在单焦点陷入的情况;
133.s2422:首先,设定允许聚焦框连续相同的次数;
134.s2423:如果两个聚焦框的左上角坐标,宽度,长度差值都在设定的允许误差范围内,则判定两个聚焦框相同,否则判定为不相同;当聚焦框连续相同的次数达到设定的阈值,则判定为结束;
135.s2424:此外,还有一种情况也可判定为结束,在无障碍辅助程序中,有时会出现一种循环焦点陷入的异常,即聚焦框在某几个位置循环往复,这种情况下,当某个聚焦框按固定间隔(间隔需大于1)循环超过设定的循环焦点陷入最大次数时,也判定为结束;
136.s243:若判定为右滑结束,删除此页面聚焦框列表最后冗余的聚焦框;若为单焦点陷入,删除聚焦框列表最后连续相同的聚焦框,删除的个数为设定的允许聚焦框连续相同的次数减去1;若为循环焦点陷入,删除聚焦框列表最后连续相同的循环节,删除的节数为设定的循环焦点陷入最大次数减去1,即只保留一个循环节;
137.s244:如果在设定的右滑最大次数之前就结束,认为页面是非瀑布流,否则认为页面是瀑布流;
138.s245:对于android端,若为非瀑布流,需点击此页面最后一个非漏检的聚焦框,并将此页面的cur_focus_box_id属性设为此聚焦框id;
139.s246:对于瀑布流的情况,需要考虑导航栏;
140.s2461:当右滑超过设定的次数后,停止右滑;之后连续右滑,每次右滑都判断聚焦框区域是否有变化;
141.s2462:经验来说,导航栏的位置总是在某个区域内不变,计算机械臂右滑前后两张截图的导航栏区域的平均像素差值(差值为绝对值),若小于设定的允许误差范围,则认为导航栏区域不变,否则认为有变化;
142.s2463:若导航栏区域有变化,则认为此瀑布流页面无导航栏;若连续右滑超过设定的最大右滑次数后,聚焦框区域一直没有变化,则认为此瀑布流页面有导航栏;
143.s2464:对于android端,无论是否有导航栏,需向左滑直到回退到未开始判断时所在的聚焦框,并点击此页面最后一个非漏检的聚焦框,并将此页面的cur_focus_box_id属性设为此聚焦框id:
144.s2465:若判断此页面有导航栏,则需遍历导航栏的聚焦框;
145.s24651:经验来说,页面的导航栏位置总是处在某个区域中,而导航栏最右边一个聚焦框的位置也基本在某个区域,可预设坐标;
146.s24652:操纵机械臂点击到导航栏最右边的聚焦框,然后不断左滑;
147.s24653:位于导航栏的聚焦框有一定特征,即它们的坐标的y值以及长度(y方向上的长度)一般都相同,比较前后两个聚焦框的这两个指标,若相差超过设定的允许误差范围,则认为此聚焦框不再是一个位于导航栏的聚焦框;
148.s24654:不断左滑直到滑到的聚焦框不再是一个属于导航栏的聚焦框;对于属于导航栏的聚焦框,标记此聚焦框位于导航栏;
149.s24655:对于android端,还需点击cur_focus_box_id对应的聚焦框;
150.s25:结束遍历后,若此页面非首页,检测页面后退的功能;
151.s251:如果是ios端,检测ios端;
152.s2511:先通过计算机视觉算法检测页面的后退键、关闭键并记录,作为备用方案:;
153.s2512:再用voiceover的后退指令,用直方图法判断下滑后的页面和此页面对象记录的父页面的图片是否相同;
154.s2513:如果相同则标志此页面能通过voiceover指令后退,并将此app对象的cur_page_id置为父页面的id,否则仍为此页面的id;
155.s252:如果是android端,检测android端;
156.s2521:用talkback的后退指令,用直方图法判断下滑后的页面和此页面对象记录的父页面的图片是否相同;
157.s2522:如果相同则标志此页面能通过talkback指令后退,将此页面的cur_focus_box_id置为0,并将此app对象的cur_page_id置为父页面的id,否则仍为此页面的id;
158.s3:将首页遍历得到的所有聚焦框加入bfs队列;
159.s4:开始广度优先遍历,每次取队头聚焦框并出队,计算从当前页面到目标页面的路径,操纵机械臂到达路径指向的页面;
160.s41:计算从当前页面到目标页面的路径;
161.s411:若当前页面层数大于目标页面,则当前页面先上溯,每上一层,就在路径列表中添加
‑
1,表示后退一次,并且当前页面id更新为父页面的id,直到当前页面和目标页面
层数相同;
162.s412:然后,当前页面和目标页面共同上溯,当前页面每上一层,在路径列表path中添加
‑
1,并且当前页面id更新为父页面的id;目标页面每上一层,记录此次上溯的父页面id和父聚焦框id,添加在down_path中,表示正向走一层,并且目标页面id更新为父页面的id,直到当前页面id和目标页面id相同;
163.s413:最后将down_path反转后追加到path,最终形成路径path;
164.s414:若当前页面层数小于目标页面,则目标页面先上溯,每上一层,就记录此次上溯的父页面id和父聚焦框id,添加在down_path中,表示正向走一层,并且目标页面id更新为父页面的id,直到当前页面和目标页面层数相同;
165.s415:然后,当前页面和目标页面共同上溯,当前页面每上一层,在路径列表path中添加
‑
1,并且当前页面id更新为父页面的id;目标页面每上一层,记录此次上溯的父页面id和父聚焦框id,添加在down_path中,并且目标页面id更新为父页面的id,直到当前页面id和目标页面id相同;
166.s416:最后将down_path反转后追加到path,最终形成路径path;’167.s42:操纵机械臂到达路径指向的页面;
168.s421:操纵ios端:
169.s4211:首先,在ios系统中,进入设置
‑
辅助功能
‑
旁白
‑
命令
‑
触控手势,将“移到第一项”指令分配给“单指向上轻扫”手势;
170.s4212:对于s41中生成的路径,每一项为一步;
171.s4213:若此项为
‑
1,则表明后退一页;
172.s4214:若当前页面能通过voiceover手势后退,则往下轻扫后退,并单指向上轻扫移到第一项,通过直方图法比较此时的截图和此页面的父页面的图片是否相同;若相同则表明后退正确,后退到父页面,cur_page_id置为父页面id;否则,表示后退错误;
173.s4215:若后退错误,重启app;
174.s42151:在ios系统中,进入设置
‑
辅助功能
‑
旁白
‑
命令
‑
触控手势,将“app切换器”指令分配给“单指轻点三下”手势,点击屏幕三下,打开app切换器;
175.s42152:在ios系统中,进入设置
‑
辅助功能
‑
旁白
‑
命令
‑
触控手势,将“向下滚动”指令分配给“单指轻点四下”手势;打开app切换器后,点击屏幕四下,向下滚动关闭此app进程;
176.s42153:操纵机械臂带动触头在屏幕上从底部向顶部滑动5厘米至屏幕中央,停留2秒后触头向上移动离开屏幕;
177.s42154:单击app,后双击;
178.s4216:若后退错误,更新路径;
179.s42161:首先将最近公共祖先id初始化为起点页面id,遍历旧路径;
180.s42162:若此项是
‑
1,则更新最近公共祖先id为最近公共祖先id对应的页面的父页面的id;
181.s42163:若此项为单步页面id和单步聚焦框id,则最近公共祖先id为此单步页面id并中断遍历,直接返回,由此得出起点页面和目标页面的最近公共祖先,并删除起点页面到最近公共祖先的路径;
182.s42164:根据s41的方法,计算从首页到最近公共祖先的路径,新路径则为从首页到最近公共祖先的路径加上最近公共祖先到目标页面的路径;
183.s4217:重启后,cur_page_id置为0,表示重启后回到首页;
184.s4218:若当前页面不能通过voiceover手势后退,如果通过计算机视觉算法检测出了后退键,则点击检测出的后退键坐标,移到第一项,通过直方图法比较点击后的截图和此页面的父页面的图片是否相同,若相同则表明检测正确,后退到父页面,cur_page_id置为父页面id;否则,表示检测错误,根据s4215的方法重启app,并根据s4216的方法更新路径,cur_page_id置为0,表示重启后回到首页;
185.s4219:如果没有通过计算机视觉算法检测出后退键,这种情况下,如果通过计算机视觉算法检测出关闭键,则点击检测出的关闭键坐标,移到第一项,通过直方图法比较点击后的截图和此页面的父页面的图片是否相同,若相同则表明检测正确,后退到父页面,cur_page_id置为父页面id;否则,表示检测错误,根据s4215的方法重启app,并根据s4216的方法更新路径,cur_page_id置为0,表示重启后回到首页;
186.s42110:如果没有通过计算机视觉算法检测出关闭键,则先点击预设的经验中的后退键,如果点击前后的截图发生变化,则单指向上轻扫移到第一项,比较点击后的截图和此页面的父页面的图片是否相同,若相同则表明检测正确,后退到父页面,cur_page_id置为父页面id;否则,表示检测错误,根据s4215的方法重启app,并根据s4216的方法更新路径,cur_page_id置为0,表示重启后回到首页;
187.s42111:如果点击前后截图没有发生变化,表示经验中的后退键无效,则点击预设的经验中的关闭键,移到第一项,比较点击后的截图和此页面的父页面的图片是否相同,若相同则表明检测正确,后退到父页面,cur_page_id置为父页面id;否则,表示检测错误,根据s4215的方法重启app,并根据s4216的方法更新路径,cur_page_id置为0,表示重启后回到首页;
188.s42112:若此项为此步页面id和此步聚焦框id,移到第一项,计算目前页面截图和此步页面的图片是否相同,如果不同,则认为正向的路径走错了,将此次访问的目标页面的目标聚焦框设为漏检,并根据s4215的方法重启app,cur_page_id置为0;如果相同,若此步聚焦框不属于导航栏,则连续右滑聚焦框id下,若属于导航栏,则无需右滑,然后单击并双击聚焦框;
189.s42113:如此往复,直到走完path中的每一步,最终到达目标页面;
190.s422:操纵android端;
191.s4221:对于s41中生成的路径,每一项为一步;
192.s4222:若此项为
‑
1,则表明后退一页;
193.s4223:若当前页面能通过talkback手势后退,则往下轻扫后退,通过直方图法比较此时的截图和此页面的父页面的图片是否相同,若相同则表明后退正确,此页面的cur_focus_box_id置为0,cur_page_id置为父页面id;否则,表示后退错误。
194.s4224:若后退错误,重启app;
195.s42241:单击页面中app切换器按钮,双击进入app切换器。
196.s42242:打开app切换器后,单击清空app按钮,双击清空app。
197.s42243:清空app后回到主屏幕,单击屏幕上返回第一页的按钮,双击,返回主屏幕
215.s517:ios端需移到第一项然后截图,android端直接截图;比较双击聚焦框后的页面是否和已经生成的所有页面的图像相同,如果和某一页面相同,则认为进入了之前遍历过的页面,将cur_page_id置为此页面id;
216.s518:特别的,对于android端,如果此页面id为目标页面的父页面的id,则认为点击这个聚焦框并没有进入一个新页面而是返回了前一页,则需将目标页面的cur_focus_box_id置为0;
217.s519:若和已遍历过的页面没有相同的,则认为进入了一个新页面;
218.s52:根据新页面层数对页面进行相应操作;
219.s521:若新页面层数小于设定的停止层数,则对新页面根据s2的方法进行单页面遍历,并将遍历得到的聚焦框加入bfs队列;
220.s522:若新页面层数达到设定的停止层数,首先进行截图,作为此页面的图片;
221.s523:若此页面非首页:ios端:先通过计算机视觉算法检测页面的后退键、关闭键并记录,作为备用方案;
222.s524:再用voiceover的后退指令,用直方图法判断下滑后的页面和此页面对象记录的父页面的图片是否相同,如果相同则标志此页面能通过voiceover指令后退,并将此app对象的cur_page_id置为父页面的id,否则仍为此页面的id;
223.s525:对于android端,用talkback的后退指令,用直方图法判断下滑后的页面和此页面对象记录的父页面的图片是否相同,如果相同则标志此页面能通过talkback指令后退,将此页面的cur_focus_box_id置为0,并将此app对象的cur_page_id置为父页面的id,否则仍为此页面的id;
224.s6:如此循环访问bfs队列,直到队列为空。
225.图1是本发明提供的面向无障碍检测的移动端应用页面自动遍历方法的总体流程图。
226.图2是本发明提供的面向无障碍检测的移动端应用页面自动遍历方法的总体流程图中单页面遍历的流程图:
227.s2:打开目标app,进入首页,创建一个页面对象,进行单页面遍历;
228.s21:进入一个新页面,首先进行截图,作为此页面的图片;
229.s22:由于聚焦框检测算法需要用到前一个聚焦框的截图,第一个聚焦框用第二个聚焦框的截图,因此操纵机械臂先右滑一下,得到第二个聚焦框的截图,再往左滑回到第一个聚焦框;
230.s23:正式开始单页面的遍历,机械臂每右滑一次,生成一个新的聚焦框对象,用聚焦框检测算法检测聚焦框的坐标,图像等信息,聚焦框id为自增id;将新生成的聚焦框对象加入此页面的聚焦框列表中;如果检测不出,则标志此聚焦框漏检,并将此聚焦框对象各属性置为特殊值;
231.s24:机械臂不断右滑直至焦点陷入或者达到设定的遍历次数,由此可以判断页面是否为瀑布流,如果是瀑布流,则还需进行导航栏的遍历;
232.s241:app的有些页面是无法结束的,一直右滑滑不到尽头,我们称这样的页面为瀑布流,否则为非瀑布流;
233.s242:设定右滑最大次数,每次右滑之后都判断是否结束;
234.s2421:正常情况下,对于非瀑布流,当右滑到最后一个聚焦框时,ios端手机如果继续右滑,会一直停留在最后一个聚焦框,而android端手机右滑一次会停留在最后一个聚焦框,再右滑一次,会回到第一个聚焦框开始循环遍历,以上,双端最后都存在单焦点陷入的情况;
235.s2422:首先,设定允许聚焦框连续相同的次数;
236.s2423:如果两个聚焦框的左上角坐标,宽度,长度差值都在设定的允许误差范围内,则判定两个聚焦框相同,否则判定为不相同;当聚焦框连续相同的次数达到设定的阈值,则判定为结束;
237.s2424:此外,还有一种情况也可判定为结束,在无障碍辅助程序中,有时会出现一种循环焦点陷入的异常,即聚焦框在某几个位置循环往复,这种情况下,当某个聚焦框按固定间隔(间隔需大于1)循环超过设定的循环焦点陷入最大次数时,也判定为结束;
238.s243:若判定为右滑结束,删除此页面聚焦框列表最后冗余的聚焦框;若为单焦点陷入,删除聚焦框列表最后连续相同的聚焦框,删除的个数为设定的允许聚焦框连续相同的次数减去1;若为循环焦点陷入,删除聚焦框列表最后连续相同的循环节,删除的节数为设定的循环焦点陷入最大次数减去1,即只保留一个循环节;
239.s244:如果在设定的右滑最大次数之前就结束,认为页面是非瀑布流,否则认为页面是瀑布流;
240.s245:对于android端,若为非瀑布流,需点击此页面最后一个非漏检的聚焦框,并将此页面的cur_focus_box_id属性设为此聚焦框id;
241.s246:对于瀑布流的情况,需要考虑导航栏;
242.s2461:当右滑超过设定的次数后,停止右滑;之后连续右滑,每次右滑都判断聚焦框区域是否有变化;
243.s2462:经验来说,导航栏的位置总是在某个区域内不变,计算机械臂右滑前后两张截图的导航栏区域的平均像素差值(差值为绝对值),若小于设定的允许误差范围,则认为导航栏区域不变,否则认为有变化;
244.s2463:若导航栏区域有变化,则认为此瀑布流页面无导航栏;若连续右滑超过设定的最大右滑次数后,聚焦框区域一直没有变化,则认为此瀑布流页面有导航栏;
245.s2464:对于android端,无论是否有导航栏,需向左滑直到回退到未开始判断时所在的聚焦框,并点击此页面最后一个非漏检的聚焦框,并将此页面的cur_focus_box_id属性设为此聚焦框id:
246.s2465:若判断此页面有导航栏,则需遍历导航栏的聚焦框;
247.s24651:经验来说,页面的导航栏位置总是处在某个区域中,而导航栏最右边一个聚焦框的位置也基本在某个区域,可预设坐标;
248.s24652:操纵机械臂点击到导航栏最右边的聚焦框,然后不断左滑;
249.s24653:位于导航栏的聚焦框有一定特征,即它们的坐标的y值以及长度(y方向上的长度)一般都相同,比较前后两个聚焦框的这两个指标,若相差超过设定的允许误差范围,则认为此聚焦框不再是一个位于导航栏的聚焦框;
250.s24654:不断左滑直到滑到的聚焦框不再是一个属于导航栏的聚焦框;对于属于导航栏的聚焦框,标记此聚焦框位于导航栏;
251.s24655:对于android端,还需点击cur_focus_box_id对应的聚焦框;
252.s25:结束遍历后,若此页面非首页,检测页面后退的功能;
253.s251:如果是ios端,检测ios端;
254.s2511:先通过计算机视觉算法检测页面的后退键、关闭键并记录,作为备用方案:;
255.s2512:再用voiceover的后退指令,用直方图法判断下滑后的页面和此页面对象记录的父页面的图片是否相同;
256.s2513:如果相同则标志此页面能通过voiceover指令后退,并将此app对象的cur_page_id置为父页面的id,否则仍为此页面的id;
257.s252:如果是android端,检测android端;
258.s2521:用talkback的后退指令,用直方图法判断下滑后的页面和此页面对象记录的父页面的图片是否相同;
259.s2522:如果相同则标志此页面能通过talkback指令后退,将此页面的cur_focus_box_id置为0,并将此app对象的cur_page_id置为父页面的id,否则仍为此页面的id;
260.图3是本发明提供的面向无障碍检测的移动端应用页面自动遍历方法的总体流程图中操纵机械臂到达路径指向的页面的流程图:
261.s42:操纵机械臂到达路径指向的页面;
262.s421:操纵ios端:
263.s4211:首先,在ios系统中,进入设置
‑
辅助功能
‑
旁白
‑
命令
‑
触控手势,将“移到第一项”指令分配给“单指向上轻扫”手势;
264.s4212:对于s41中生成的路径,每一项为一步;
265.s4213:若此项为
‑
1,则表明后退一页;
266.s4214:若当前页面能通过voiceover手势后退,则往下轻扫后退,并单指向上轻扫移到第一项,通过直方图法比较此时的截图和此页面的父页面的图片是否相同;若相同则表明后退正确,后退到父页面,cur_page_id置为父页面id;否则,表示后退错误;
267.s4215:若后退错误,重启app;
268.s42151:在ios系统中,进入设置
‑
辅助功能
‑
旁白
‑
命令
‑
触控手势,将“app切换器”指令分配给“单指轻点三下”手势,点击屏幕三下,打开app切换器;
269.s42152:在ios系统中,进入设置
‑
辅助功能
‑
旁白
‑
命令
‑
触控手势,将“向下滚动”指令分配给“单指轻点四下”手势;打开app切换器后,点击屏幕四下,向下滚动关闭此app进程;
270.s42153:操纵机械臂带动触头在屏幕上从底部向顶部滑动5厘米至屏幕中央,停留2秒后触头向上移动离开屏幕;
271.s42154:单击app,后双击;
272.s4216:若后退错误,更新路径;
273.s42161:首先将最近公共祖先id初始化为起点页面id,遍历旧路径;
274.s42162:若此项是
‑
1,则更新最近公共祖先id为最近公共祖先id对应的页面的父页面的id;
275.s42163:若此项为单步页面id和单步聚焦框id,则最近公共祖先id为此单步页面
id并中断遍历,直接返回,由此得出起点页面和目标页面的最近公共祖先,并删除起点页面到最近公共祖先的路径;
276.s42164:根据s41的方法,计算从首页到最近公共祖先的路径,新路径则为从首页到最近公共祖先的路径加上最近公共祖先到目标页面的路径;
277.s4217:重启后,cur_page_id置为0,表示重启后回到首页;
278.s4218:若当前页面不能通过voiceover手势后退,如果通过计算机视觉算法检测出了后退键,则点击检测出的后退键坐标,移到第一项,通过直方图法比较点击后的截图和此页面的父页面的图片是否相同,若相同则表明检测正确,后退到父页面,cur_page_id置为父页面id;否则,表示检测错误,根据s4215的方法重启app,并根据s4216的方法更新路径,cur_page_id置为0,表示重启后回到首页;
279.s4219:如果没有通过计算机视觉算法检测出后退键,这种情况下,如果通过计算机视觉算法检测出关闭键,则点击检测出的关闭键坐标,移到第一项,通过直方图法比较点击后的截图和此页面的父页面的图片是否相同,若相同则表明检测正确,后退到父页面,cur_page_id置为父页面id;否则,表示检测错误,根据s4215的方法重启app,并根据s4216的方法更新路径,cur_page_id置为0,表示重启后回到首页;
280.s42110:如果没有通过计算机视觉算法检测出关闭键,则先点击预设的经验中的后退键,如果点击前后的截图发生变化,则单指向上轻扫移到第一项,比较点击后的截图和此页面的父页面的图片是否相同,若相同则表明检测正确,后退到父页面,cur_page_id置为父页面id;否则,表示检测错误,根据s4215的方法重启app,并根据s4216的方法更新路径,cur_page_id置为0,表示重启后回到首页;
281.s42111:如果点击前后截图没有发生变化,表示经验中的后退键无效,则点击预设的经验中的关闭键,移到第一项,比较点击后的截图和此页面的父页面的图片是否相同,若相同则表明检测正确,后退到父页面,cur_page_id置为父页面id;否则,表示检测错误,根据s4215的方法重启app,并根据s4216的方法更新路径,cur_page_id置为0,表示重启后回到首页;
282.s42112:若此项为此步页面id和此步聚焦框id,移到第一项,计算目前页面截图和此步页面的图片是否相同,如果不同,则认为正向的路径走错了,将此次访问的目标页面的目标聚焦框设为漏检,并根据s4215的方法重启app,cur_page_id置为0;如果相同,若此步聚焦框不属于导航栏,则连续右滑聚焦框id下,若属于导航栏,则无需右滑,然后单击并双击聚焦框;
283.s42113:如此往复,直到走完path中的每一步,最终到达目标页面;
284.s422:操纵android端;
285.s4221:对于s41中生成的路径,每一项为一步;
286.s4222:若此项为
‑
1,则表明后退一页;
287.s4223:若当前页面能通过talkback手势后退,则往下轻扫后退,通过直方图法比较此时的截图和此页面的父页面的图片是否相同,若相同则表明后退正确,此页面的cur_focus_box_id置为0,cur_page_id置为父页面id;否则,表示后退错误。
288.s4224:若后退错误,重启app;
289.s42241:单击页面中app切换器按钮,双击进入app切换器。
290.s42242:打开app切换器后,单击清空app按钮,双击清空app。
291.s42243:清空app后回到主屏幕,单击屏幕上返回第一页的按钮,双击,返回主屏幕第一页。
292.s42244:单击app,后双击。
293.s4225:重启后,根据s4216的方法更新路径,cur_page_id置为0,表示重启后回到首页;
294.s4226:若不能通过talkback手势后退,则根据s4224的方法重启app,并根据s4216的方法更新路径,cur_page_id置为0,表示重启后回到首页;
295.s4227:若此项为此步目标页面id和此步聚焦框id,如果此步目标聚焦框不属于导航栏,计算此步目标聚焦框id和此页面目前所在聚焦框id的差值walk,若walk大于0,则右滑walk下,否则左滑
‑
walk下;
296.s4228:单击,用聚焦框检测算法检测此时页面的聚焦框,若检测不出,则将此次访问的目标页面的目标聚焦框设为漏检,并根据s4224的方法重启app,cur_page_id置为0;
297.s4229:若检测出聚焦框,则检查此聚焦框和此步目标聚焦框是否相同;聚焦框有左上角x坐标,左上角y坐标,长度、宽度四个指标,比较此聚焦框和此步目标聚焦框的这四个指标,任何一个指标的差值大于设定的允许误差范围,则认为两个聚焦框不相同,否则认为相同;
298.s42210:若此聚焦框和此步目标聚焦框相同,则双击此聚焦框,并将此页的cur_focus_box_id置为此步目标聚焦框id;
299.s42211:若此聚焦框和此步目标聚焦框不同,则认为正向路径走错了,将此次访问的目标页面的目标聚焦框设为漏检,并根据s4224的方法重启app,cur_page_id置为0;
300.s42212:如此往复,直到走完path中的每一步,最终到达目标页面;
301.图4是本发明提供的面向无障碍检测的移动端应用页面自动遍历方法的总体流程图中判断双击聚焦框能否进入新页面的流程图:
302.s51:检查能否通过双击此页面的目标聚焦框生成一个新页面;
303.s511:ios端:操纵机械臂到达路径指向的页面后,移到第一项,通过直方图法比较此页面和目标页面是否相同,若不相同,则将此次访问的目标页面的目标聚焦框设为漏检,并根据s4215的方法重启app,cur_page_id置为0;
304.s512:若此页面和目标页面相同,若目标聚焦框不属于导航栏,则连续右滑聚焦框id下,若属于导航栏,则无需右滑,单击聚焦框;
305.s513:android端:若目标聚焦框不属于导航栏,计算此步目标聚焦框id和此页面目前所在聚焦框id的差值walk,若walk大于0,则右滑walk下,否则左滑
‑
walk下;若目标聚焦框属于导航栏,则无需移动;
306.s514:单击聚焦框,用聚焦框检测算法检测此时页面的聚焦框,若检测不出,则将此次访问的目标页面的目标聚焦框设为漏检,并根据s4224的方法重启app,cur_page_id置为0;
307.s515:若检测出聚焦框,则检查此聚焦框和目标聚焦框是否相同,若相同,将此页的cur_focus_box_id置为目标聚焦框id;若不同,将此次访问的目标页面的目标聚焦框设为漏检,并根据s4224的方法重启app,cur_page_id置为0;
308.s516:双击聚焦框,通过直方图法比较双击前后图像,若相同,则认为此聚焦框是无效聚焦框并标记,否则进入下一步;’309.s517:ios端需移到第一项然后截图,android端直接截图;比较双击聚焦框后的页面是否和已经生成的所有页面的图像相同,如果和某一页面相同,则认为进入了之前遍历过的页面,将cur_page_id置为此页面id;
310.s518:特别的,对于android端,如果此页面id为目标页面的父页面的id,则认为点击这个聚焦框并没有进入一个新页面而是返回了前一页,则需将目标页面的cur_focus_box_id置为0;
311.s519:若和已遍历过的页面没有相同的,则认为进入了一个新页面。
312.本说明书实施例所述的内容仅仅是对发明构思的实现形式的列举,本发明的保护范围不应当被视为仅限于实施例所陈述的具体形式,本发明的保护范围也及于本领域技术人员根据本发明构思所能够想到的等同技术手段。