使用Selenium和openCV对HTML5 canvas游戏进行自动化功能测试(一)
上一篇讲了HTML5 canvas游戏的基本工作原理,接下来讲如何进行自动化功能测试。
Selenium是一个跨平台的跨浏览器的对网页进行自动化测试的工具。从Selenium 2.0开始Selenium就和WebDriver合体了。如果你还不了解Selenium怎么用,可以看看官网上的例子。Selenium支持各种语言的binding,方便起见,下面的测试脚本都用Python来写。
自动化功能测试用例流程基本上是这样的:启动浏览器 -> 打开游戏(网页)-> 对游戏图像进行模板匹配,确保UI元素显示正确 -> 模拟用户操作 -> 到下一场景 -> 继续模板匹配 -> 继续模拟操作 -> 关闭游戏(网页)以及浏览器。如果发现问题,就意味着测试用例失败,需要报告问题。
假如我想测试一个HTML5 canvas游戏,那么首当其冲就是要找它的canvas标签了。Selenium支持各种查找方法:
- find_element()
- find_element_by_id()
- find_element_by_name()
- find_element_by_tag_name ()
- find_element_by_css_selector()
- find_element_by_link_text()
- find_element_by_partial_link_text()
- find_element_by_xpath()
挑个最容易的吧: canvas = browser.find_element_by_xpath("//canvas")
那么我怎样获得canvas中的图像呢?有两种办法。一种是通过canvas.toDataURL():
var strData = canvas.toDataURL('image/png');
这种方法返回一个代表整个图像的Base64字符串。看上去就像:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO 9TXL0Y4OHwAAAABJRU5ErkJggg==" (如果你知道怎么解码,就能发现这个字符串表示了一个小圆红点点。)
另一种方法是使用context.getImageData():
var dataObj= context.getImageData(x, y, w, h);
返回一个对象包含RGBA字节缓存。
后者比前者要快很多,并且可以指定裁剪区域,推荐用后者。
不过这两者都是Javascript调用,如何和Selenium的Python脚本联系起来呢?
幸运的是Selenium支持直接调用Javascript:

def getClippedImageFromCanvas(browser, canvas, x, y, w, h):
'''Get a clipped image from canvas using context.getImageData.'''
data = browser.execute_script("\
var canvas= arguments[0];\
var x=arguments[1];\
var y=arguments[2];\
var w=arguments[3];\
var h=arguments[4];\
var context = canvas.getContext('2d');\
var dataObj= context.getImageData(x, y, w, h);\
var data = dataObj.data;\
return data;"
,canvas, x, y, w, h)
data_bytes = array.array('B', data).tostring()
im = Image.fromstring("RGBA", (w, h), data_bytes)
return im

这样我们就获得了可以用于Python脚本的图像。接下去需要做的就是对图像进行模板匹配,比如看看预期的UI元素是否出现在正确的位置。这个工作可以由openCV完成。
除了图像识别,我们还需要模拟用户操作,如鼠标点击:
webdriver.ActionChains(browser).move_to_element_with_offset(canvas, x, y).click().perform()
Selenium/Webdriver支持链式操作,很cool。
使用Selenium和openCV对HTML5 canvas游戏进行自动化功能测试(一)的更多相关文章
- HTML5 canvas游戏工作原理
HTML5已经不是一个新名词.它看上去很cool,有很多feature,大多数人普遍看好它的发展.对于我来说,最感兴趣的是它的canvas标签,可以结合Javascript来绘制游戏画面. 我们可以在 ...
- 简单的HTML5 canvas游戏工作原理
HTML5已经不是一个新名词.它看上去很cool,有很多feature,大多数人普遍看好它的发展.对于我来说,最感兴趣的是它的canvas标签,可以结合Javascript来绘制游戏画面. 我们可以在 ...
- HTML5 Canvas游戏开发实战 PDF扫描版
HTML5 Canvas游戏开发实战主要讲解使用HTML5 Canvas来开发和设计各类常见游戏的思路和技巧,在介绍HTML5 Canvas相关特性的同时,还通过游戏开发实例深入剖析了其内在原理,让读 ...
- 开源HTML5 Canvas游戏Runtime发布
Cantk-Runtime是通用的HTML5 Canvas 2D游戏引擎运行库,让HTML5游戏的性能飞起来.Cantk-Runtime以PhoneGap插件的方式提供,从此结束PhoneGap低性能 ...
- HTML5 Canvas游戏开发(三)lufylegend开源库件(上)
lufylegend可以解决HTML5开发游戏中会遇到的一些问题: 1.各种浏览器对于JavaScript和HTML的解析是不一致的. 2.手机浏览器和PC浏览器的区别. 3.JavaScript并非 ...
- HTML5 Canvas游戏开发(四)lufylegend开源库件(下)
一.文本 LTextField对象是lufylegend库件中专门用于显示文本信息的一个对象. 1.文本属性 创建的文本框对象不会自动加入可视化对象列表中.只有手动调用addChild()方法才能使它 ...
- HTML5 Canvas游戏开发(二)高级功能
一.变形 1.放大和缩小 scale(X,Y)函数. 当使用该函数时,其起始坐标值也被放大或缩小.当X.Y为负值时,可以实现翻转. 2.平移变换 translate(X,Y)函数. 表示水平方向向左移 ...
- HTML5 Canvas游戏开发(一)基础知识
一.绘制基本图形 在每次用canvas画布时,都有几步是“套路” 1.在HTML中创建Canvas画布: <canvas id="mycanvas" width=" ...
- HTML5 RPG游戏引擎 地图实现篇
一,话说全国年夜事 前没有暂看到lufy的专客上,有一名伴侣念要一个RPG游戏引擎,出于兴趣筹办入手做一做.因为我研讨lufylegend有冶时间了,对它有必然的依赖性,因而便筹办将那个引擎基于 ...
随机推荐
- HTTP协议(TCP/IP)
HTTP协议(TCP/IP): 服务器套接字(TCP用主机的IP地址加上主机上的端口号作为TCP连接的端点,这种端点就叫做套接字(socket)或插口) 数据包(请求包.报文)http 请求格式: ...
- hash值重写,就是以自己定义的规则来显示hash值
未重写hashCode值 重写hashCode后的值
- Photoshop去图片水印——适用复杂图片上有水印
该方法适合复杂图片上有水印的,不过这个只适合水印只是文字而没有背景的那种.不是所有的水印图片都适合处理.下面是处理前后的对照 工具/原料 photoshop8.0 方法/步骤 1 打开需要 ...
- php curl POST multipart/form-data与application/x-www-form-urlencode的区别
背景 CURL在 a.php 中以 POST方式向 b.php 提交数据,但b.php无法接收到数据,而 CURL 操作显示成功. 原来,"传递一个数组到CURLOPT_POSTFIELDS ...
- MySQL--5子查询与连接小结
子查询:出现在其他sql语句中的 SELECT,必须出现在小括号内,子查询外层可以是常见的SELECT语句,INSERT语句 UPDATE语句 DELETE语句,在子查询中可以包含多个关键字和条件 ( ...
- iOS UI布局-定时器
定时器是比较常用的一个UI控件,在付款.抢购时,经常会使用到.提取成一个通用的方法 /** * 倒计时GCD通用方法 * 通常用的计时器都是用NSTimer,但是NSTimer在线程很吃紧的时候效果不 ...
- iOS 开发笔记-获取某个APP素材
2019.02.01 更新 以下这种方式只适合越狱的手机,目前12.1以后,iTools已经不适合了,请看最下面第二种方式. 有时候,我们看到别人的APP做得挺漂亮的,那么我们想查看该APP的图片素材 ...
- java开发前的配置
JAVA语言是1995年由Sun公司退出的一门高级编程语言,在2009年4月20被ORACLE公司收购 看看java体系图
- Hibernate基础增删改查语法
1.创建好Hibernate项目,创建好实体类和测试类,如果不会创建Hibernate项目的同学,点此处:http://www.cnblogs.com/zhaojinyan/p/9336174.htm ...
- supervison
http://blog.csdn.net/kongxx/article/details/50452357