使用sikuli进行UI自动化测试固然是方便很多,不用一切都使用AppleScript那烦人的语法,只要界面的UI没有变化,结构的变化不会影响到基于sikuli的自动化,但是基于AppleScript的就会受到影响。

而且使用图像识别进行自动化,会比使用脚本实现的自动化更接近于真实的手动测试,毕竟人就是通过人眼来识别控件的,所以控件在UI上的变化都会影响到sikuli自动化,而对于BVT级别的自动化,重点还是关注与基本功能是否正常,对控件在UI上的变化还是不那么敏感为好。

在我实现一个产品的BVT自动化的时候,需要操作某些视频的缩略图进行上传到云端,和从云端下载下来的测试,其中大量依赖于其测试素材缩略图的识别,而产品在测试过程中发现了一个缩略图不能正常产生的bug,而这个bug势必会影响到我们其他BVT功能的测试。为了不使得这个bug block我们其他基本功能的验证,我采用的是使用AppleScript获取其测试素材在library中的坐标,然后使用一个工具cliclick来对获取到的坐标进行鼠标左右键的单击和双击等操作。

下面是官网上对这个模拟鼠标和键盘操作的小工具的介绍:

“Cliclick” is short for “Command-Line Interface Click”. It is a a tiny shell/Terminal application that will emulate mouse clicks or series of mouse clicks (including doubleclicks and control-clicks) at arbitrary screen coordinates. Moreover, it lets you move the mouse, get the current mouse coordinates, press modifier keys etc.

首先,使用AppleScript获取这个素材的坐标,(由于一个缩略图的操作焦点应该是其正中央的位置,所以在下面的脚本中要进行一次计算,将中间点的坐标输出):

 on run argv
set clip_name to item 1 of argv
tell application "RealTimes"
activate
end tell tell application "System Events"
tell process "RealTimes"
tell UI element 0 of scroll area 0 of group 0 of splitter group 0 of splitter group 0 of window 0
tell (1st image whose title is clip_name)
set p to position
set s to size set x to ((item 1 of p) + (item 1 of s) / 2)
set y to ((item 2 of p) + (item 2 of s) / 2) set output to ("" & x & "," & y)
do shell script "echo " & quoted form of output
end tell
end tell
end tell
end tell
end run

在python中,先调用上面的脚本获取坐标,再根据需要的操作使用cliclick的不同参数实现:

 def click_item_by_cliclick(name):
command = cliclick_path + " c:{0}"
_run_for_cliclick(name, command) def double_click_item_by_cliclick(name):
command = cliclick_path + " dc:{0}"
_run_for_cliclick(name, command) def right_click_item_by_cliclick(name):
command = cliclick_path + " kd:ctrl c:{0} ku:ctrl"
_run_for_cliclick(name, command) def check_exist_by_cliclick(name):
try:
run_apple_script("get_clip_position_in_library.applescript", name)
except Exception:
return False
return True def _run_for_cliclick(name, command):
co = run_apple_script("get_clip_position_in_library.applescript", name).strip().rstrip('\n')
time.sleep(1)
command = command.format(co)
ret = exec_command(command)
if ret[0] != 0:
raise Exception(ret[1]) def multiple_select_by_cliclick(names):
command = " kd:cmd"
for name in names:
command += " c:" + run_apple_script("get_clip_position_in_library.applescript", name).strip().rstrip('\n')
command += " ku:cmd"
command = cliclick_path + command
ret = exec_command(command)
if ret[0] != 0:
return False
return True

在这里,python充当的就是一个胶水的作用,将AppleScript的输出用在工具cliclick上,并返回结果。

Mac下的UI自动化测试 (三)的更多相关文章

  1. Mac下的UI自动化测试 (一)

    在我看来,实现UI自动化测试的过程一向都是令人快乐的事情,而维护它们就是跟噩梦一样了,尤其是对每次CI产生的build进行BVT测试,由于开发不会告诉你任何UI的变化,那么你拿到的测试结果就势必会一片 ...

  2. Mac下的UI自动化测试 (二)

    下面讲一下Sikuli的重要概念,就是region,所谓region就是Sikuli在进行图像识别的时候的一个区域,默认是整个屏幕. 当然,如果region选得太大的话,并且UI上存在相似的控件,那么 ...

  3. Mac下的UI自动化测试 (四)

    在实际写testcase的时候会使用unittest框架,但是在sikuli中需要使用它提供的command来运行,位于/Applications/SikuliX.app/run,使用-r参数指定要运 ...

  4. Mac 下纯lua(三)

    文件处理 直接使用io调用 io.close();文件流关闭 io.flush():如果文件流以bufferd缓存模式处理,输入不会立即存入文件,需要调用本函数 io.input(file):输入 i ...

  5. 使用phantomjs进行无界面UI自动化测试

    PhantomJS(http://phantomjs.org/) 是一个基于WebKit的服务器端JavaScript API.它全面支持web而不需浏览器支持,其快速.原生支持各种Web标准:DOM ...

  6. Jenkins下构建UI自动化之初体验

    一.缘 起 笔者之前一直在Windows环境下编写UI自动化测试脚本,近日在看<京东系统质量保障技术实战>一书中,萌生出在jenkins下构建UI自动化测试的想法 二.思 路 首先,在Li ...

  7. [原创]浅谈Web UI自动化测试

    [原创]浅谈Web UI自动化测试 Web UI自动化测试相信大家都不陌生,今天来谈谈这个,我最早接触自动化测试时大约是在2004年,2006年当时在腾讯财付通算是开始正式接触自动化测试,之所以是正式 ...

  8. UI自动化测试(三)对页面中定位到的元素对象做相应操作

    前两天分别讲述了UI自动化测试基础以及对页面元素该如何进行定位,这一篇自然就是对定位到的页面元素对象进行相应操作啦. 阅读目录 1.常用操作元素对象的方法 2.鼠标事件操作 3.键盘事件操作 4.We ...

  9. 【Mac + Appium + Python3.6学习(三)】之IOS自动化测试环境配置

    在做这一节之前先配置我的另一篇文章所需要安装的前提准备条件:<[Mac + Appium学习(一)]之安装Appium环境前提准备> 一.安装IOS自动化测试环境 配置环境: Appium ...

随机推荐

  1. visualvm-profile以及远程访问

    使用visualvm的Profiler功能,可以提供两方面的性能跟踪功能: Profile 一个是CPU,可以跟踪每个方法占用CPU的时长:比如你在发现CPU持续走高的时候可以通过Profile的CP ...

  2. 洛谷【P1048】采药

    浅谈\(DP\):https://www.cnblogs.com/AKMer/p/10437525.html 题目传送门:https://www.luogu.org/problemnew/show/P ...

  3. url出现特殊字符,需要进行编码

    1) 网络访问请求:中文空格字符编码/解码 stringByAddingPercentEscapesUsingEncoding(只对 `#%^{}[]|\"<> 加空格共14个字 ...

  4. 获取wifi热点

    https://stackoverflow.com/questions/31555640/how-to-get-wifi-ssid-in-ios9-after-captivenetwork-is-de ...

  5. 我的MyGeneration

    话不多说,直接上代码 Interface Code: public class GeneratedGui : DotNetScriptGui { public GeneratedGui(ZeusCon ...

  6. MySQL 学习五 SQL实用函数

    0 select now() 显示当前时间. 1 select char_length('andyqan')   显示字符长度. 2 日期格式化         select date_format( ...

  7. json例子--bai

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  8. Java 的编译和运行机制

    创建一个 名为 test.java 的 Java 源文件 源代码: class Hello{ public static void main(String[] args) { System.out.p ...

  9. C Primer Plus学习笔记(三)- 字符串和格式化输入/输出

    从一个简单的例子开始 #include <stdio.h> int main() { char name[10]; printf("Input Your Name:\n" ...

  10. Python多进程-进程间数据的传递

    两个进程间的数据是独立的,要进行数据传递的话可通过几个方法 Queue 通过队列来进行进程间数据的传递 # -*- coding:utf-8 -*- __author__ = "MuT6 S ...