使用Selenium和openCV对HTML5 canvas游戏进行自动化功能测试(一)

摘要:
上一篇文章描述了HTML5画布游戏的基本工作原理。接下来,我们将讨论如何进行自动功能测试。Selenium是一个跨平台和跨浏览器的工具,用于自动测试网页。自Selenium 2.0以来,Selenium已与WebDriver集成。如果您不知道如何使用Selenium,可以查看官方网站上的示例。Selenium支持多种语言的绑定。为了方便起见,以下测试脚本是用Python编写的。如果我想测试HTML5画布游戏,首先要做的就是找到它的画布标签。然而,两者都是Javascript调用。它们如何与Selenium的Python脚本相关?这可以通过openCV完成。

上一篇讲了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游戏进行自动化功能测试(一)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇vue2.x使用百度地图Postgresql 物理备份冷备份 与 热备份下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

mysql5.7基于gtid主从重做

master上备份mysql/data/Percona-5721/scripts/xtra_sohmysql_fullbak.shscp 备份文件到备机关闭slave service mysql stop在slave服务器恢复全备恢复:恢复注意恢复文件权限问题tar -izxvf xxxx.tar.gz 注意加-iinnobackupex --defaul...

uniapp不同型号手机适配

ps:拿到手机的高度、宽度、高宽比例,自定义页面模块的高度和间距。 主要代码: <view class="cono" :style="{height:navHeight3+'rpx'}"> </view> <view class="banner" v-if="navHeight4==370" style="backgroun...

Encrypt Decrypt

encryptstring                 DESCryptoServiceProvider desc = new DESCryptoServiceProvider();                byte[] key = System.Text.Encoding.Unicode.GetBytes(encryptkey);       ...

NetMQ——推拉模式 Push-Pull

推送端 using (var pushSocket = new PushSocket("@tcp://127.0.0.1:1212")) { while (true) { //pushSocket.Connect();...

日志切割之Logrotate

1、关于日志切割   日志文件包含了关于系统中发生的事件的有用信息,在排障过程中或者系统性能分析时经常被用到。对于忙碌的服务器,日志文件大小会增长极快,服务器会很快消耗磁盘空间,这成了个问题。除此之外,处理一个单个的庞大日志文件也常常是件十分棘手的事。  logrotate是个十分有用的工具,它可以自动对日志进行截断(或轮循)、压缩以及删除旧的日志文件。例...

前端—JavaScript

一、引入JavaScript的引入方式 Script标签内写代码 <script> //在这里写你的JS代码 </script> 引入额外的JS文件 <script src="http://t.zoukankan.com/myscript.js"></script> 二、JavaScript语言规范 注释...