大家好,如果您还对连连看游戏自动化测试实战项目(二)案例分析不太了解,没有关系,今天就由本站为大家分享连连看游戏自动化测试实战项目(二)案例分析的知识,包括的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!
阅读目录
QQ连连看外挂实现原理
GUI自动化测试的原理
什么是句柄
P/Invoke机制
获取游戏窗体的句柄
分析游戏窗口
对游戏窗口进行截图
根据游戏规则来写算法
模拟鼠标点击
源代码下载
QQ连连看外挂实现原理
1. 先调用Win32 API获取"连连看"游戏窗口的句柄,
2. 根据游戏窗口的句柄,然后获取游戏方块中的像素。
3. 用一个二维数组来保存每个方块的像素
4. 用算法判定两个一样的方块能否"消", 如果能"消"的话,就模拟鼠标去点击这两个方块。 继续"消" 下一组方块。
GUI自动化测试的原理
当你点击窗体中的一个button, button会响应然后执行一些操作。 这个过程的本质是: 你在屏幕上点击一个Button, Windows系统根据你点击的位置,知道你要点击哪个Button,然后给这个Button发送鼠标点击的消息。
自动化的原理是: 找到控件的句柄,通过句柄给这个控件发送消息,比如“键盘输入”消息或者“鼠标点击”消息。
什么是句柄
所有的Windows控件本质上都是一个窗体(Window). 每个控件/窗体都有一个与之关联的句柄(handle), 可以通过这个句柄来访问,操纵和检测这个控件/窗体
窗体句柄是由系统产生的一个值,你可以把它想象成与窗体关联的一个ID,通过这个ID可以访问相应的窗体。
在.NET中, 句柄的类型是System.IntPtr, 有点类似Int型。
P/Invoke机制
P/invoke机制叫做"平台调用"机制, 因为Win32API 函数是Windows操作系统的一部分,所以它是用传统的C++程序写的,而不是用C#托管代码写的。 所以我们需要一种机制,让C#中可以调用Win32 API函数.
具体的解决方案是: 先为想要使用的Win32函数创建一个C#外覆函数,或者叫别名函数, 然后调用这个别名函数
实例:
在Win32 API中获取窗体的句柄的函数是 FindWindow(), 它的函数签名用C++描述是这样的
HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName);
在C#中,给这个Win32 函数创建别名函数
需要先引用命名空间: using System.Runtime.InteropServices;
[DllImport("user32.dll", EntryPoint = "FindWindow", CharSet = CharSet.Auto)]public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
DllImport: 指定要使用的函数所在的DLL文件。
EntryPoint: Win32 API函数的名称.
CharSet.Auto: 让.NET框架来决定如何进行字符类型转换
当为一个Win32函数编写相应的C#方法别名的时候, 几乎总要使用static 和extern, 因为大多数Win32函数都是静态函数,而非实例函数。
注意:别名函数和Win32函数的名称并不要求一致。 但是名称一致可以保证代码的可读性.
获取游戏窗体的句柄
我们用Win32 API 函数来获取“连连看"游戏窗体的句柄
我们现在调用上节介绍的C#中的别名函数FindWindow(),就相当于调用了Win32 API 的FindWindow()函数
FindWindow函数接收2个参数,className 或者WindowName 然后返回句柄.
Spy++是.NET中自带工具,我们可以使用它来获取窗体的名字。
具体用法是,启动spy++, 点击"Findow Window"图标,弹出Findow Window 程序后, 用鼠标拖动“靶心”到你要测试的窗体上。
如下图。 可以得到游戏窗体的名字叫"QQ游戏 - 连连看角色版"
这样我们就能轻松获取 游戏窗体的句柄
IntPtr wndPane = Win32API.FindWindow(null, "QQ游戏 - 连连看角色版");
分析游戏窗口
通过屏幕标尺工具, 我们去测量游戏窗口。 (这个比较繁琐,需要你多次去测量,多次调整后才能得到准确的数据).
可以发现 "游戏区域" 距离游戏窗口 水平方向:15像素, 垂直方向:182像素
游戏中垂直方向有11个方块, 水平方向有19个方块
每个方块 长:31像素, 宽:35像素 如下图
对游戏窗口中的所有方块进行截图
一个方块有31*35=1085个像素, 事实上我们不需要获取方块中所有的像素点。 为了节省性能,我只需要获取一个方块中的几个像素就可以了。
我们需要用到2个函数来实现获取方块的像素。
[DllImport("user32.dll")]public static extern IntPtr GetDC(IntPtr hwnd);[DllImport("Gdi32.dll")]public static extern uint GetPixel(IntPtr hdc, int nXPos, int nYPos);
GetDC函数的作用是指定窗口的客户区域或整个屏幕的显示设备上下文环境的句柄, 它的输入参数是窗口的句柄, (上节中我们介绍过可以使用FindWindow函数来获取窗口的句柄). 返回的是DC句柄。 (注意这两个句柄是不同的)
GetPixel根据GetDC获取的DC句柄和X坐标,Y坐标来获取像素点。
实例: 我们获取游戏中 "第三排第四列" 的方块的像素, 代码如下:
IntPtr wndPane = Win32API.FindWindow(null, "QQ游戏 - 连连看角色版");IntPtr hdc = Win32API.GetDC(wndPane);// X轴方向的像素要这么算15+31*3// 因为游戏区域距离游戏窗口左边15像素,每个方块宽31像素,// Y轴方向的像素要这么算 182+35*4// 因为游戏区域距离游戏窗口上方182,每个方块高35像素uint color = Win32API.GetPixel(hdc, 15+31*3 + offX, 182+35*4 + offY);
根据游戏规则来写算法
我们用一个二维数组来保存游戏中的所有方块
private Block[,] blocks = new Block[11, 19];
Block对象代表一个方块,如果方块为空,那么Block包含的是背景色。 如果有方块,那么Block对象中保存该方块的9个像素点。
详细请参考代码中的Block对象。
然后分析游戏规则来写算法来遍历二维数组。
垂直方向,如果两个一样的方块,处于同样的Y轴上,中间没有任何方块可以消, 如图
水平方向,如果两个一样的方块,处于同样的X轴上,中间没有任何方块, 可以消, 如图
拐1个弯, 如果两个一样的方块, 其中一个的X轴和另一个Y成90度,并且中间没有任何方块, 可以消, 如图
拐2个弯, 如图
根据上面这些游戏规则,来设计算法, 具体算法请参考源代码
模拟鼠标点击
模拟鼠标点击的的方法有很多,
其中的一个win32 API 方法为
[DllImport("user32.dll")] public static extern int mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo); const int MOUSEEVENTF_MOVE = 0x0001; //移动鼠标 public const int MOUSEEVENTF_LEFTDOWN = 0x0002; //模拟鼠标左键按下 public const int MOUSEEVENTF_LEFTUP = 0x0004; //模拟鼠标左键抬起 const int MOUSEEVENTF_RIGHTDOWN = 0x0008; //模拟鼠标右键按下 const int MOUSEEVENTF_RIGHTUP = 0x0010; //模拟鼠标右键抬起 const int MOUSEEVENTF_MIDDLEDOWN = 0x0020; //模拟鼠标中键按下 const int MOUSEEVENTF_MIDDLEUP = 0x0040; //模拟鼠标中键抬起 const int MOUSEEVENTF_ABSOLUTE = 0x8000; //标示是否采用绝对坐标
源代码下载
用户评论
哇塞,这个连连看外挂确实实用啊!我之前玩的时候总是输给电脑,现在终于可以反向操作了哈哈!不过我还是觉得游戏本来就应该公平一点,这样的外挂感觉不太好。
有17位网友表示赞同!
学习Python自动化测试挺不错的,这个项目讲解得很清楚。以前我一直对编写脚本苦手,看来还是得多练习啊!这篇文章很有帮助!
有17位网友表示赞同!
一直想学自动化测试,现在看到这个连连看外挂的实战案例,终于有方向了!打算跟着代码自己动手实践一下,感觉应该蛮有趣.
有19位网友表示赞同!
虽然是联看一下游戏,但是这些测试框架和脚本写起来还是挺复杂的。我感觉这种级别的自动化测试项目难度不太适合新手入门?
有10位网友表示赞同!
写的确实不错,很详细的讲解了整个项目的思路和步骤。我现在正在学习Web页面自动化测试,这个连连看外挂的项目可以作为很好的参考。
有11位网友表示赞同!
自动化测试其实挺重要,特别是对于游戏开发来说,能够提高效率、减少人工成本。不过还是要注重正规游戏的体验感,不要过度依赖工具.
有11位网友表示赞同!
感觉这篇文章有点偏向于“作弊”方向,虽然是技术演示,但是这种利用外挂获利的思路也不鼓励吧?还是应该重视公平竞争的精神。
有9位网友表示赞同!
自动化测试的应用场景越来越广了,这款连连看外挂项目就是一个很好的例子。或许以后我们可以用类似的方法来测试更多类型的应用程序?
有10位网友表示赞同!
学习Python的目的是为了解决实际问题,这个连连看外挂的项目就很实用!我打算把它改进一下,看看能不能用来玩一些其他的游戏
有10位网友表示赞同!
这篇博客确实很有价值,详细的讲解了自动化测试中的一些关键概念和技术。不过,也建议作者可以在文章中加入更多代码示例和实战案例,更容易理解。
有13位网友表示赞同!
我也很喜欢玩连连看!现在看到有人用Python实现外挂,我还蛮惊讶的。这样说来,原来游戏也可以自动化测试啊?
有15位网友表示赞同!
这个连连看外挂项目挺有趣的,可以让我们更深入地了解一下自动化测试是如何工作的。但是,这种技术也可以被滥用,需要我们更加谨慎使用。
有13位网友表示赞同!
我一直在学习Python编程,这个连连看外挂的案例非常适合我!通过这种实践项目,我感觉学到的东西比单纯阅读文档要深刻的多。
有18位网友表示赞同!
自动化测试的确是一个很强大的工具,能让程序员更高效地去解决问题。不过也需要考虑它带来的潜在风险,比如会给系统带来一定的安全隐患需要进行充分评估。
有5位网友表示赞同!
项目设计不错,代码逻辑清晰易懂,对于初学者来说也能很好理解自动化测试的基本原理。可以考虑为不同的游戏场景提供不同的测试策略和方法。
有7位网友表示赞同!
感觉这个连连看外挂只针对特定的游戏目标进行操作,缺少对不同游戏类型的一般化测试解决方案。希望后续文章能够介绍更加全面的自动化测试框架和技术。
有12位网友表示赞同!
玩连连看的时候真的很依赖运气,如果能用代码辅助预测下一步的操作,是不是就能轻松破解所有关卡?这个项目给我的感受就是:科技的力量太可怕了!
有10位网友表示赞同!
这篇文章讲解的非常到位,对于想了解自动化测试的人来说是非常优秀的入门指南。我已经开始尝试用类似的方法进行一些小型游戏项目的自动化测试了。
有14位网友表示赞同!