上一篇讲了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游戏进行自动化功能测试(一)的更多相关文章

  1. HTML5 canvas游戏工作原理

    HTML5已经不是一个新名词.它看上去很cool,有很多feature,大多数人普遍看好它的发展.对于我来说,最感兴趣的是它的canvas标签,可以结合Javascript来绘制游戏画面. 我们可以在 ...

  2. 简单的HTML5 canvas游戏工作原理

    HTML5已经不是一个新名词.它看上去很cool,有很多feature,大多数人普遍看好它的发展.对于我来说,最感兴趣的是它的canvas标签,可以结合Javascript来绘制游戏画面. 我们可以在 ...

  3. HTML5 Canvas游戏开发实战 PDF扫描版

    HTML5 Canvas游戏开发实战主要讲解使用HTML5 Canvas来开发和设计各类常见游戏的思路和技巧,在介绍HTML5 Canvas相关特性的同时,还通过游戏开发实例深入剖析了其内在原理,让读 ...

  4. 开源HTML5 Canvas游戏Runtime发布

    Cantk-Runtime是通用的HTML5 Canvas 2D游戏引擎运行库,让HTML5游戏的性能飞起来.Cantk-Runtime以PhoneGap插件的方式提供,从此结束PhoneGap低性能 ...

  5. HTML5 Canvas游戏开发(三)lufylegend开源库件(上)

    lufylegend可以解决HTML5开发游戏中会遇到的一些问题: 1.各种浏览器对于JavaScript和HTML的解析是不一致的. 2.手机浏览器和PC浏览器的区别. 3.JavaScript并非 ...

  6. HTML5 Canvas游戏开发(四)lufylegend开源库件(下)

    一.文本 LTextField对象是lufylegend库件中专门用于显示文本信息的一个对象. 1.文本属性 创建的文本框对象不会自动加入可视化对象列表中.只有手动调用addChild()方法才能使它 ...

  7. HTML5 Canvas游戏开发(二)高级功能

    一.变形 1.放大和缩小 scale(X,Y)函数. 当使用该函数时,其起始坐标值也被放大或缩小.当X.Y为负值时,可以实现翻转. 2.平移变换 translate(X,Y)函数. 表示水平方向向左移 ...

  8. HTML5 Canvas游戏开发(一)基础知识

    一.绘制基本图形 在每次用canvas画布时,都有几步是“套路” 1.在HTML中创建Canvas画布: <canvas id="mycanvas" width=" ...

  9. HTML5 RPG游戏引擎 地图实现篇

    一,话说全国年夜事   前没有暂看到lufy的专客上,有一名伴侣念要一个RPG游戏引擎,出于兴趣筹办入手做一做.因为我研讨lufylegend有冶时间了,对它有必然的依赖性,因而便筹办将那个引擎基于 ...

随机推荐

  1. finally最常用的情况

    通常用于关闭(释放)资源例如:数据库连接   执行查询时查到需要的需要后   需要关闭连接,   此处连接就需要在获取到结果后 就断开连接   不然访问人数过多,数据库有最大连接数,超过了就只能等待前 ...

  2. js函数定义的三种方式

    1.函数声明语法 function sum(num1, num2){ return num1 + num2; } 2.函数表达式定义 var sum = function (num1, num2){ ...

  3. 解决办法: RSA host key for [ip address] has changed and you have requested strict checking.

    在服务器重装后想要远程连接服务器,报错如下: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE ...

  4. Tesseract 模块

    https://www.cnblogs.com/new-june/p/9249903.html

  5. 安装python sklearn经验总结

    1. 需要安装 numpy, scipy, 和sklearn和ipython,Cython sklearn,ipython, Cython都可以通过pip来安装.但scipy,可能还有numpy必须通 ...

  6. cocos2d JS 利用定时器实现-倒计时功能

    //创建一个定时器 cc.director.getScheduler().schedule(this, this.updates, 1, cc.REPEAT_FOREVER, 0, false, &q ...

  7. java基础练习

    String str = "Nothing is impossible to a willing heart"; String str2 = "No cross, no ...

  8. Git-什么是分支

    为了理解什么是分支,我们先要回顾Git是如何存储数据的. Git并不会保存文件的差异值或者说变化量,而是直接保存文件的快照. 在Git中提交时,会保存一个commit对象,该对象包含一个指向暂存内容快 ...

  9. python windows 下pip easy_install 使用错误的问题

    最近电脑重装了系统,又重新安装python .在官网下载了安装包后电脑成功安装了,但使用pip命令时出现以下错误 Fatal error in launcher: Unable to create p ...

  10. kali linux wmtools安装

    1,选择挂载盘时选择自动检测 2,点击安裝vmware tools安裝 3.tar -xzf 壓縮包名 4../vmware-install.pl 5,reboot