有大量的浏览器模拟器,比如Goutte、Selenium、 Sahi等。他们都做同样的工作,但做得非常不同。它们的行为不同并且具有非常不同的 API。但是,更重要的是,实际上有两种完全不同类型的浏览器模拟器:
- 无头浏览器模拟器
- 浏览器控制器
第一种浏览器模拟器是简单的纯 HTTP 规范实现,比如 Goutte。这些浏览器模拟器针对应用程序发送真实的 HTTP 请求并解析响应内容。它们的运行和配置非常简单,因为这种类型的模拟器可以用任何可用的编程语言编写,并且可以在没有 GUI 的服务器上通过控制台运行。无头模拟器既有优点也有缺点。优点是简单、快速和无需真正的浏览器即可运行的能力。但是这种浏览器模拟器有一个很大的缺点,它没有 JS/AJAX 支持。因此,您无法使用无头浏览器测试丰富的 GUI Web 应用程序。
第二种浏览器模拟器是浏览器控制器。这些模拟器旨在控制真正的浏览器。没错,一个程序控制另一个程序。浏览器控制器模拟浏览器上的用户交互,并能够从当前浏览器页面检索实际信息。Selenium和Sahi 是两个最著名的浏览器控制器。使用浏览器控制器的主要优点是支持页面上的 JS/AJAX 交互。缺点是此类浏览器模拟器需要安装浏览器、额外配置,并且通常比无头浏览器慢得多。
因此,简单的答案是为您的项目选择最佳模拟器并使用其 API 进行测试。但是正如我们已经看到的,这两种浏览器模拟器类型各有优缺点。如果您选择无头浏览器模拟器,您将无法测试您的 JS/AJAX 页面。如果您选择浏览器控制器,您的整体测试套件在某些时候会变得非常缓慢。所以,在现实世界中,我们应该同时使用两者!这就是您需要Mink的原因。
Mink消除了不同浏览器模拟器之间的 API 差异,为每个浏览器模拟器提供不同的驱动程序(阅读驱动程序章节),并为您提供一种简单的方法来控制浏览器(控制浏览器)、遍历页面(遍历页面)、操作页面元素(操作页面)或与它们交互(与页面交互)。
Mink安装:
Mink 是一个 php 库,您将在测试套件或项目中使用它。在开始之前,请确保您至少安装了 PHP 5.4。
- composer require --dev behat/mink
使用示例:
- <?php
- use Behat\Mink\Mink,
- Behat\Mink\Session,
- Behat\Mink\Driver\GoutteDriver,
- Behat\Mink\Driver\Goutte\Client as GoutteClient;
- $startUrl = 'http://example.com';
- // init Mink and register sessions
- $mink = new Mink(array(
- 'goutte1' => new Session(new GoutteDriver(new GoutteClient())),
- 'goutte2' => new Session(new GoutteDriver(new GoutteClient())),
- 'custom' => new Session(new MyCustomDriver($startUrl))
- ));
- // set the default session name
- $mink->setDefaultSessionName('goutte2');
- // visit a page
- $mink->getSession()->visit($startUrl);
- // call to getSession() without argument will always return a default session if has one (goutte2 here)
- $mink->getSession()->getPage()->findLink('Downloads')->click();
- echo $mink->getSession()->getPage()->getContent();
- // call to getSession() with argument will return session by its name
- $mink->getSession('custom')->getPage()->findLink('Downloads')->click();
- echo $mink->getSession('custom')->getPage()->getContent();
- // this all is done to make possible mixing sessions
- $mink->getSession('goutte1')->getPage()->findLink('Chat')->click();
- $mink->getSession('goutte2')->getPage()->findLink('Chat')->click();