• 0
  • 0
分享

     视觉回归测试最常见的情况是使用基线图像进行测试。然而,视觉测试的不同方面也值得讨论。我们将介绍模板匹配(使用OpenCV)、布局测试(使用Galen)和OCR(使用Tesseract),并展示如何将这些工具无缝集成到现有的Appium和Selenium测试中。

     我们使用Java(以及OpenCV和Tesseract的Java包装器),但类似的解决方案也可以通过其他技术堆栈实现。

     这篇文章是2020年9月在新加坡的Taqelah和2020年Selenium会议期间(以较短的形式)发表的快速演讲的配套文章。

     我希望这个总结能帮助你选择对你的用例最有影响的工具,并给你一些关于如何将它们集成到你自己的工具箱中的想法。

模板匹配

     对于移动测试,Appium在其1.9版本中以图像定位器策略的形式添加了此功能。

     使用图像定位器(image locator),你可以像任何其他WebElement一样与结果元素交互。例如:

WebElement element = 
driver.findElementByImage(base64EncodedImageFile);
element.click();

     或

By image = MobileBy.image(base64EncodedImageFile);
new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(image)).click();

     开发人员采用的方法是将功能添加到Appium服务器的一部分,并使用OpenCV(这将成为运行Appium服务器的实例的依赖项)来增强实际的图像识别能力。

     有趣的是,客户端与服务器之间的流程如下所示:

  • 从Appium服务器请求截图。

  • 将屏幕截图和模板都发送到Appium服务器进行匹配。

     感觉并不完美,尤其是如果我们想在同一个屏幕上匹配多个模板。

     当我在2018年首次实现模板匹配时(当时还不知道Appium团队已经在开发模板匹配),我也选择了    OpenCV,而是在客户端运行了它。使用OpenCV Java包装器,我的代码要点如下所示:

Mat result = new Mat(resultRows, resultCols, CvType.CV_32FC1);
Imgproc.matchTemplate(image, templ, result, Imgproc.TM_CCOEFF_NORMED);
MinMaxLocResult match = Core.minMaxLoc(result);
if (match.maxVal >= threshold) {
  // found
}

     这种方法不需要向上述Appium服务器发出额外的请求。实际上,除了屏幕截图的功能外,它不需要WebDriver的任何功能。它还可以与Selenium和Appium一起使用。也就是说,这也增加了对OpenCV的依赖,这次是对运行测试执行的实例的依赖。

     我将以上两种方法(客户端和服务器端执行)都包装到TemplateMatcher接口中,以展示其用法(将其视为PoC)。

     布局测试

     另一种视觉测试类型涉及验证页面或屏幕的布局。你可以通过图像比较来做到这一点,图像比较也会隐式检查布局。一种更简单的方法是使用像Galen这样的专用布局测试工具(在我看来,这是最被低估的UI测试框架之一)。

     Galen使用每个屏幕的规范来定义屏幕上的所有(重要)元素及其大小以及它们之间的绝对或相对位置。

     让我们以Google搜索页为例:

图1.png

     我们可以使用以下规范表示它:

SEARCH_FIELD:
   below LOGO
   centered horizontally inside viewport
   visible
LOGO:
   above SEARCH_FIELD
   centered horizontally inside viewport
   width < 100% of SEARCH_FIELD/width
   visible
SEARCH_BUTTON:
   near LUCKY_BUTTON 20px left
   visible

     注意,上面使用的是JustTestLah!框架的语法(通过在页面对象的YAML文件中定义的唯一键引用UI元素)。在纯Galen中,这些需要在spec文件的顶部定义:

@objects
    LOGO          id        hplogo
    SEARCH_FIELD  css       input[name=q]    
    ...

     有多种执行这些检查的方法。我更喜欢将verify方法作为BasePage抽象类的一部分:

private T verify() {
  String baseName = this.getClass().getSimpleName();
  String baseFolder = this.getClass().getPackage().getName().replaceAll("\\.", File.separator);
  String specPath = baseFolder
              + File.separator
              + configuration.getPlatform()
              + File.separator
              + baseName
              + ".spec";
  galen.checkLayout(specPath, locators);
  return (T) this;
}

     这样,每当我们第一次与屏幕交互时,我们都可以轻松地从测试中调用验证(顺便说一句,我使用类似的方法来集成Applitools进行视觉测试):

public class GoogleSteps extends BaseSteps {
  private GooglePage google;
  @Given("I am on the homepage")
  public void homepage() {
    google.verify().someAction().nextAction();
  }
}

     光学字符识别(OCR)

     视觉断言的另一种形式是光学字符识别,其首字母缩写为OCR。每当由于某种原因将文本渲染为图像并且无法使用标准测试工具进行验证时,此功能将非常有用。

     对于那些使用Selenium进行Web抓取而不是进行测试的用户来说,这可能也很有趣,因为这是网站开发人员采取的反措施之一,以使其变得更加困难。

     我们使用Tesseract(一种最初由HP在1980年代开发,目前由Google赞助的OCR工具)。

     我们的示例不是最实际的示例,而是要展示Tesseract在检测不同类型的字体方面的强大功能:我们将验证Google徽标是否确实拼写出“ Google”:

public class GooglePage extends BasePage<GooglePage> {
  @Autowired private OCR ocr;
  ...
  public String getLogoText() {
    return ocr.getText($("LOGO"));
  }
}
public class GoogleSteps extends BaseSteps {
  private GooglePage google;
  ...
  @Then("the Google logo shows the correct text")
  public void checkLogo() {
    assertThat(google.getLogoText()).isEqualTo("Google");
  }
}

     使用的OCR服务如下所示:

public class OCR implements qa.justtestlah.stubs.OCR {
  private Logger LOG = LoggerFactory.getLogger(OCR.class);
  private TakesScreenshot driver;
  private Tesseract ocr;
  @Autowired
  public OCR(Tesseract ocr) {
    this.ocr = ocr;
  }
  /**
   * @param element {@link WebElement} element to perform OCR on
   * @return recognised text of the element
   */
  public String getText(WebElement element) {
    return getText(element.getScreenshotAs(OutputType.FILE));
  }
  /** @return all text recognised on the screen */
  public String getText() {
    return getText(getScreenshot());
  }
  private String getText(File file) {
    LOG.info("Peforming OCR on file {}", file);
    try {
      return ocr.doOCR(file).trim();
    } catch (TesseractException exception) {
      LOG.warn("Error performing OCR", exception);
      return null;
    }
  }
  /**
   * Usage:
   *
   * <pre>
   * new OCR().withDriver(driver);
   * </pre>
   *
   * @param driver {@link WebDriver} to use for capturing screenshots
   * @return this
   */
  public OCR withDriver(WebDriver driver) {
    this.driver = (TakesScreenshot) driver;
    return this;
  }
  /**
   * Usage:
   *
   * <pre>
   * new OCR().withDriver(driver);
   * </pre>
   *
   * @param driver {@link TakesScreenshot} to use for capturing screenshots
   * @return this
   */
  public OCR withDriver(TakesScreenshot driver) {
    this.driver = driver;
    return this;
  }
  private File getScreenshot() {
    return driver.getScreenshotAs(OutputType.FILE);
  }
  @Override
  public void setDriver(WebDriver driver) {
    this.driver = (TakesScreenshot) driver;
  }
}

     这要求在运行测试的实例上安装Tesseract。


作者:磐创 AI

原文链接:https://blog.csdn.net/fendouaini/article/details/109015349#comments_13557259


  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • Dify 的朋友们,很高兴告诉大家,我们刚刚发布了 V0.3.9 版本,在这个版本中有两个重要的新特性和大家同步:Dify 已接入 Antropic 的 Claude2、Claude-instant 模型。这意味着:你可以输入 100K token 超长上下文,相当于几百页的文档甚至是一本书!已支持在网页嵌入你的 AI 应用。这意味着,你能够在几分钟内就可以为你的官方网站创建一个具备你业务数据的 AI 智能客服。让我们一起来看看吧!接入 Antropic,解锁与 AI 超长对话限制Antropic 在数天前发布了新的 Claude 2 模型。它支持用户输出 100K token 的上下文,相当...
            0 0 1625
            分享
          • 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。测试的策略:接口测试也是属于功能测试,所以跟我们以往的功能测试流程并没有太大区别,测试流程依旧是:评审测试接口文档(需求文档);根据接口文档编写测试用例(用例编写完全可以按照以往规则来编写,例如等价类划分,边界值等设计方法);执行测试,查看不同的参数请求,接口的返回的数据是否达到预期。那么设计测试用例时我们主要考虑如下几个方面:功能测试:接口的功能是否正确实现了;接口是否按照设计文档中来实现(比如user...
            12 12 2962
            分享
          • 一、Python安装Window系统下,python的安装很简单。访问python.org/download,下载最新版本,安装过程与其他windows软件类似。记得下载后设置path环境变量,然后Windows命令行就可以调用了:二、Selenium安装(两种安装方法,第一通过pip)Python3.x安装后就默认就会有pip(pip.exe默认在python的Scripts路径下),使用pip安装selenium:pip install selenium后面可以加等号指定selenium的版本:如:pip install selenium==2.53.0因我已安装sel...
            0 0 796
            分享
          • 今日晚间,达达、顺丰同城、闪送相继宣布与抖音生活服务达成合作,为餐饮商家提供同城配送解决方案。在抖音北京本地页面,提供外卖到家业务的商家已经开始提供商家自配业务。据一位火锅品牌商家向新消费日报透露,商家随机选择配送平台的功能,实际上已经试运行一段时间。“达达、顺丰同城、闪送都是全城配送,所以基本可以覆盖主城区所有地点,只是配送费用不同。”此前,抖音曾与饿了么达成合作,“饿了么外卖”出现在抖音小程序,不到4个月时间,抖音在即时配送领域再添新合作商,抖音在本地生活的野心尽显。团购服务商张霖对新消费日报记者表示,抖音选择在这一节点深耕本地生活,是因为价格敏感的用户比例在增加。“虽然总需求萎缩,但线上...
            0 0 747
            分享
          • 说到测试计划相信很多小伙伴进入这行的时候对这个并不陌生,但是要针对一个项目做一个完整的测试计划却不是那么简单,因为我们在测试之前我们首先要针对一个项目的了解,还有项目每个需求的分析,还要进行评审等等一系列的准备工作,所以在测试之前,我们要做好很多前奏工作,确保在测试过程中不会遗漏掉本该要发现的问题,所以本次编辑这篇文章主要是针对测试计划做的一套流程讲解,希望对同行的小伙伴有一定的帮助。一、测试计划的目的(1)为测试各项活动制定一个现实可行的、综合的计划,包括每项测试活动的对象、范围、方法、进度和预期结果。(2)为项目实施建立一个组织模型,并定义测试项目中每个角色的责任和工作内容。(3)开发有效...
            15 15 1492
            分享
      • 51testing软件测试圈微信