安卓自动检测工具--AppsPlayground 的第六节

来源:互联网 发布:centos 7 ip地址设置 编辑:程序博客网 时间:2024/06/05 04:57

Playground通过动态定义和探索由window和widget的特性创建的模型,来驱动智能机应用的用户界面。我们从展示的用户界面提取特性来迭代定义一个近似应用逻辑的模型。举个例子,当一个应用启动时,它会展示一个有一个或多个button的window。当选中一个button,一个新的window会出现。该模型会捕获窗口之间的转换。要注意的是,这种方法是基于智能机应用具有高度交互性的直觉和所得的模型提供了一个对应用逻辑状态很好的近似。



图4展示了智能执行的概述。对于每一次迭代,Playground检查focus是否变到了一个不同的window。为了避免重复的探索,一个window的等效模块采用试探性地来检测新展示的window是否和前一个观察到的window类似。如果是,将这个window并入一个存在的状态。然后Playground提取相关的特性来驱动GUI。这些特性包括widget所容纳的文本,可编辑的文本字段,按钮,和滑动容器等。然后建立当前特性和先前跟踪widget而取得的特性之间的联系(下面会介绍为什么这么做的原因)。之后运用一些搜索优化来削减搜索的空间。接下来,Playground采用序列策略来决定下一个GUI动作(例如选择一个button,向下滚动,填充文本字段)。用上下文决定模块的定义的试探地来填充问文本。随着一个动作结束当前迭代。本节的其余模块详细的描述了图4中的其余模块。


Widget Tracking

当浏览windows时,widget可能消失然后再出现。当一个widget再次出现时识别错误了,会导致将相同的状态判定为不同的状态,从而导致多余的探索。举个例子,假设windowA有两个buttonA和B。当点击buttonA,window会关闭。为了完成这个探索,window会再次打开,如果每个widget都有一个唯一标识符,那么这个问题是微不足道的。遗憾的是安卓并不是这样的。

Playground跟踪widge的方法和人类用户类似。我们为widget跟踪定义了如下的widget属性。(1)有text的widget。widget通常都有与之相关联的用户可见的文本,例如,button的文本标签。在许多情况下,这个文本就足够区分widget的身份了。然而并不是所有的widget都有文本。另外,可能多个widget有相同的文本。(2)有image的widget。GUI的布局经常会让widget包含图片。这种情况下,图片可以唯一标识widget。(3)在window中的位置。结合之前的,widget在window中的位置是有用的标识。(4)在GUI层次中的位置。widget往往有固定的长辈链。一个button,举个例子,在同一个window中往往有相同的长辈链。用户感知方面就是widget的相对定位。


Sequencing Policies

每个window都能有很多允许输入事件的widget。除了button,window还可以包含editable text box, check box, spinner等。选择一个button的结果可能会直接影响其他widget 的互动。check box 可以启用/禁用其他widget。最后,可滑动的widget向用户隐藏了其他widget。执行所有widget可能的顺序是不可行的。所以我们只能执行最有意义的活动执行方式。

在一个window中有相互作用的widget的顺序需要考虑。基于观察,我们将GUI分为两类:(a)那些输入参数或变量进入应用程序的,如将文本输入可编辑的文本框或下拉菜单,和(b)那些提供动作的,如button。首先,接受输入的widget应该在动作widget之前接受操作。第二,滚动容器中包含的widget应该在滚动容器钱进行操作。第三,可滚动容器的内容和容器本身,要先于容器外的widget执行,除非和第一条矛盾。这一设计遵循这样的直觉:滚动器外的widget(如果存在的话),通常是控制button,例如:“OK”,“提交”,“取消”。这一设计遵循这样的直觉,滚动部件外的部件(如果存在的话)通常是控制按钮,例如“OK”,“提交”,和“取消”。

需要注意的是这些策略的选择有重要的影响。
如果widget的行为依赖于另一widget,Playground可能无法触发整组行为。虽然我们在单个窗口中讨论这个问题,很容易看到这样的问题也出现在交叉窗口中。


Search Optimization

出于实用性,我们试探地削减可能多余的浏览路径。将所有的项目组织成一个列表,设置探索的阈值。除了减少探索次数,阈值有时候也能用于终止程序。例如安卓列表可以动态扩展,从而无线深入。我们设置的阈值也和同一个widget被作用的次数有关(完整探索一个widget所引导的状态,肯能要多次与这个widget互动)。


Window Equivalence

当探索一个App时,一个window可能会由不同的参数多次调用。举个例子,考虑一个一个地址簿应用程序。一个显示的联系人的列表的窗口。当选择一个联系人时,“编辑联系人”的窗口被打开。选择不同的联系人时,所得到的window虽然不完全相同,但是是类似的。相似的window通常意味着相似的功能和底层代码。Palyground通过注解此类相同的window来降低搜索空间。

游乐场使用窗口等价试探法来确定当前窗口状态是充分类似于以前访问过的窗口状态。对于安卓的实现,我们利用了活动组件和window设计之间的关系。也就是我们试探性地将属于相同组件的window分为相同的一类。GUI Ripper用window的标题来判断window是否等价。


Contexr Detemination

如前所述,应用程序经常有需要正确填充文本的文本框以示他们到达正确的状态。Playground会搜索提示的关键字和与文本框相关联的旁边的可见的文本例如,字符串“电子邮件”,可能立即出现到文本框的左侧,表明它应该被填入一个电子邮件地址。

确定关键字的规则需要实证调查。我们分析了超过500个Android应用程序的字符串资源,以确定程序开发人员在特定领域使用哪些字符串。为了做到这一点,我们首先将所有的字符串提取成应用程序字符串资源文件。然后,我们转换字符串成一个规范形式(小写,去复数)。接下来,我们按照频为所有的应用程序字符串排序。其结果用来人工将字符串分类成各种语义的存储桶,如电子邮件,名称和电话。最后基于关键字的原则为每个语义桶编码。我们的最终的范式包括了电子邮件,地址,日期,电话号码,密码,用户名,取消和OK,和其他一些规则。 自动填充的方法也可以用来完成网页表单。这些技术都比较复杂,包括自我学习。我们将会将其集成到Palyground中。

我们解决账户注册和登录的策略是根据关键词的做法来判定上下文环境。有时候一个应用需要注册,也会包含一个注册窗来服务。在注册窗中需要输入的文本框有:电子邮件,用户名和密码。通过识别这些字段,Playground可以自动注册一个帐户,如果应用程序内可以注册账户的话。目前,Playground总是使用相同的邮箱地址,用户名和密码,之后的应用的测试将通过填充相同的凭据自动登录。将来,Playground将能检测是否成功登录了。Playground可以用人类测试员创建的账户自动检测应用程序的未来版本。

0 0
原创粉丝点击