• 演练:图片的比较
    • 首先生成场景:
    • 生成对象模型
    • 实现场景代码
    • 运行

    演练:图片的比较

    这里的步骤演示了如何使用图片比较API。在运行时获取控件截屏,并同模型中的图片比较,并将比较结果图片生成在报告中。示例中使用了Windows 10的计算器。

    更多图片比较的信息可以参考:图像操作API,以及虚拟控件API

    首先生成场景:

    选择创建新项目,创建时使用Basic模板。并添加如下的场景内容。

    1. 场景: 控件图片比较
    2. 假如有一个控件按钮
    3. 那么检查控件与模型图片是否相同
    4. 而且生成比较图片

    生成对象模型

    针对计算器,获取其中的一个按钮的对象,并添加到模型中。例如这里我们添加了"5" 按钮:

    演练:图片的比较 - 图1

    实现场景代码

    在definitions1.js中编写如下代码定义:

    1. const { TestModel } = require('leanpro.win');
    2. const { Image } = require('leanpro.visual');
    3. const { Given, When, Then } = require('cucumber');
    4. const model = TestModel.loadModel(__dirname + "\\..\\..\\test.tmodel");
    5. //// 你的步骤定义 /////
    6. Given("有一个控件按钮", async function () {
    7. //take screenshots from controls
    8. let five = model.getButton("Five");
    9. let screen1 = await five.takeScreenshot();
    10. let screen2 = await five.modelImage();
    11. //clip the edges from the images
    12. let controlImage = this.controlImage = await Image.fromData(screen1);
    13. let modelImage = this.modelImage = await Image.fromData(screen2);
    14. controlImage = controlImage.clip({ x: 10, y: 10, width: controlImage.width - 20, height: controlImage.height - 20 });
    15. modelImage = modelImage.clip({ x: 10, y: 10, width: modelImage.width - 20, height: modelImage.height - 20 });
    16. //put the images side by side, and attach to the report
    17. let combinedImage = controlImage.drawImage(modelImage, controlImage.width + 10, 0);
    18. this.attach(await combinedImage.getData(), 'image/png');
    19. });
    20. Then("检查控件与模型图片是否相同", async function () {
    21. let result = await Image.imageCompare(this.controlImage, this.modelImage);
    22. this.attach(JSON.stringify(result.info, null, 2), 'text/plain');
    23. this.result = result;
    24. });
    25. Then("生成比较图片", async function () {
    26. let data = await this.result.diffImage.getData();
    27. this.attach(data, 'image/png');
    28. });

    (请修改上面test.tmodel的路径,指向你自己的对象模型文件)

    这个场景有三个步骤。第一个步骤定义中:

    1.获取按钮"5"的屏幕截图,以及保存在模型中的截屏快照图片, 2.调用clip来剪切图像周围的10个像素边缘, 3.将这两个图像附加到World对象中,以便我们可以按照以下步骤进行比较, 4.调用drawImage将它们绘制成一个图像,并将其附加到报告中。

    第二个步骤定义中:

    • 从World对象中获取了两个处理过的截屏,调用imageCompare,返回比较数据,并将比较数据作为文本插入到对象模型中,
    • 因为一个步骤的报表只能添加一组数据,所以如果要再添加图片,需要通过this.result = result将结果数据保存到World中,以便在下一个步骤中附加到报表中。第三个步骤定义中:

    • 从World对象获取图像数据,

    • 调用this.attach()将图像附加到报告中。

    运行

    运行项目,可以看到图片比较的输出信息和比较结果图片都显示在了报告中:

    演练:图片的比较 - 图2

    因为控件的图片和模型比较后发现完全一致,所以场景运行通过。