分析五个Laravel Dusk的使用技巧

目录
  • 1. 填充隐藏字段
  • 2. 模拟 HTML 地理位置
  • 3. 使用 XPath 选择器
  • 4. 整页截屏
  • 5. 访问浏览器错误日志

1. 填充隐藏字段

在测试某些 JS 组件时 (例如自动完成,日期选择器等) ,可能需要编写动作模拟操作与这些组件交互。犹豫这些组件中的大多数最终都会将值保存到隐藏字段中。那么将值直接填写到隐藏字段中可能更加方便。这可以防止不稳定的测试,并确保我们不测试自己不拥有 / 控制的东西 (第三方组件)。

尽管 Laravel Dusk 没有为我们提供类似$browser->fillHidden($field, $value)的方法,但我们可以使用Dusk Browser Macros来实现。

//将以下代码添加到 serviceprovider.php 中

Browser::macro('fillHidden', function ($name , $value) {
    $this->script("document.getElementsByName('$name')[0].value = '$value'");
    return $this;
});

// 然后你可以像这样使用

/** @test */
public function fill_hidden_fields()
{
    $this->browse(function (Browser $browser) {
        $browser->visit('https://website.com/form')
                ->type('input.name', $name)
                ->type('input.address', $address)
                ->fillHidden('checkin_date', $date)
                ->click('#Submit')
                ->waitForText('Orders');
    });
}

2. 模拟 HTML 地理位置

我曾经不得不测试一个页面,该页面需要 HTML 网站提供地理位置,以便它可以显示一些结果。没有可用的直接模拟方法,因此我不得不重写 getCurrentPosition 方法,该方法最终将由页面调用。

/** @test */
public function test_geo_location()
{
    $faker = Faker\Factory::create();
    $latitude = $faker->latitude;
    $longitude = $faker->longitude;

    $this->browse(function (Browser $browser) use($latitude, $longitude) {
        $browser->visit(new Homepage)
            ->assertOnPage();

        $browser->driver->executeScript(
            "window.navigator.geolocation.getCurrentPosition = function(onSuccessCallback) {
                var position = {
                    'coords': { 'latitude': {$latitude}, 'longitude': {$longitude} }
                };
                onSuccessCallback(position);
            }"
        );

        $browser->click('#geolocate-button')
                ->assertSee('Longitude: $longitude')
                ->assertSee('Latitude: Latitude')
    });
}

3. 使用 XPath 选择器

有时,我会遇到无法使用 CSS 选择器来定位元素的情况。这些通常发生在动态表格中,或者在我无法修改的第三方 js 组件中。但是,Laravel Dusk 不直接支持 XPath 选择器,并且经常需要访问基础 WebDriver 实例。

$browser->driver->findElement( WebDriverBy::xpath("//table[@class='x-grid3-row-table']/tbody/tr/td/div/a[contains(text(),'$value')]") )
                ->click();

这种方法的唯一问题就是 [问题不大] 可能会终端$browser链式调用.*

4. 整页截屏

Laravel dusks 为我们提供了失败测试的屏幕截图,这对于了解测试失败的原因非常有帮助。但是,有时错误或有问题的元素可能在屏幕显示区域以外。

要在 Laravel Dusk 中创建完整的屏幕截图,我们必须在我们的 tests \ DuskTestCase.php 中创建一个 captureFailuresFor() 方法,它将覆盖最初在 Laravel\Dusk\Concerns\ProvidesBrowser 中定义的一个方法。

protected function captureFailuresFor($browsers)
{
    $browsers->each(function (Browser $browser, $key) {
        $body = $browser->driver->findElement(WebDriverBy::tagName('body'));
        if (!empty($body)) {
            $currentSize = $body->getSize();
            $size = new WebDriverDimension($currentSize->getWidth(), $currentSize->getHeight());
            $browser->driver->manage()->window()->setSize($size);
        }
        $name = str_replace('\\', '_', get_class($this)).'_'.$this->getName(false);

        $browser->screenshot('failure-'.$name.'-'.$key);
    });
}

现在,无论何时我们调用$browser->screenshot('$shotname'),发生错误时我们都将获得完整的屏幕截图

5. 访问浏览器错误日志

这个没什么问题,只是我发现的一些有趣的东西。我们可以通过调用 $browser->driver->manage()->getLog(‘browser') 来访问浏览器控制台日志。

这将在浏览器的控制台中返回一系列日志。例如,对于页面上没有 javascript 错误的测试而言,它可能很有用。

@test
public function no_browser_errors()
{
    $this->browse(function ($browser) {
        $this->assertEmpty($browser->driver->manage()->getLog('browser'));
    });
}

但是请注意,它不包含console.log调用的输出

以上就是分析五个Laravel Dusk的使用技巧的详细内容,更多关于五个Laravel Dusk的使用技巧的资料请关注我们其它相关文章!

(0)

相关推荐

  • 浅谈Laravel中使用Slack进行异常通知

    概述 通常,我们可以依靠用户反馈.经常查看程序日志来发现程序存在的问题.但这要么不可靠要么不及时,所以下面我们介绍一种比较有效的做法--使用 Slack 通知程序跑出的异常信息. Slack 是一款即时通信软件,类似于 QQ,它提供开放的 API,可以调用它向自己团队中指定的个人或者频道(Channel)发送消息,因此用它来进行异常通知是再合适不过的. 安装 maknz/slack-laravel 包 具体的安装方法请参考 Github 上的 [readme](https://github.co

  • php+laravel 扫码二维码签到功能

    简介 为满足公司签到业务场景 最终敲定使用微信二维码来实现 微信公众号相关配置 在微信公众平台登陆上去后,点开开发中的基本配置看到的基本信息 框架及拓展包 laravel overtrue/laravel-wechat 安装方式:composer require "overtrue/laravel-wechat:^6.0" 详细了解请看:laravel-wechat 配置文件及对应信息 config/wechat.php /* * 公众号 */ 'official_account' =

  • laravel ajax curd 搜索登录判断功能的实现

    今天来说说关于laravel的各种操作 混杂了一点ajax先来个添加表单 有些英文的$没法打出来用中文代替 登录数据我和列表展示混在一起了,千万不要和我犯一样的错误. <form action="insert" method="post" enctype="multipart/form-data"> @csrf <div style="width: 600px;height: auto;margin: 20px aut

  • Laravel中Kafka的使用详解

    本文并没有kafka的安装教程,本文是针对已经安装kafka及其配置好kafka的php拓展并且使用laravel框架进行开发项目,配置一个可供laravel框架使用的生产及消费者类. 以下代码修改自本站的YII框架关于kafka类的代码,经过测试使用在本人的项目中,可正常运行,larvael版本:5.6 代码放置larvael框架位置:app/Tools/Kafka.php <?php namespace App\Tools; use Illuminate\Config\Repository;

  • laravel使用redis队列实例讲解

    1.队列配置文件是config/queue.php(这里我默认配置即可): 2. 创建迁移表(failed-table .jobs.migrations) php artisan queue:table php artisan queue:failed-table php artisan migrate ps:出现下面错误,修改对应表名即可 ps:出现下面红色错误,修改如下图string(字段,长度(随便填)) 3.创建任务 1)生成任务类: 通常,所有的任务类都保存在 app/Jobs 目录.

  • laravel的数据表填充器使用详解

    目录 一.数据表填充器 1.1 填充器(种子文件)的创建与编写 1.1.2.创建填充器 1.1.3.[重点]编写填充器代码 1.2 执行填充器文件 一.数据表填充器 填充操作就是往数据表中写测试数据的操作(增加操作),在开发阶段是很实用的功能. 1.1 填充器(种子文件)的创建与编写 1.1.1.填充器默认的所在目录 1.1.2.创建填充器 php artisan make:seeder 填充器名称 [约定俗成的写法,大写表名 + TableSeeder] 例:以paper为例,则名称应该为Pa

  • Laravel的加密解密与哈希实例讲解

    一.加密解密 当你的应用程序中需要用到加密和解密的地方时可以使用Laravel自带的加密解密工具. Laravel 的加密机制使用的是 OpenSSL 所提供的 AES-256 和 AES-128 加密.强烈建议你使用 Laravel 内建的加密工具,而不是用其它的加密算法.所有 Laravel 加密之后的结果都会使用消息认证码 (MAC) 签名,使其底层值不能在加密后再次修改. 相应的配置文件 config/app.php 首先生成 APP_KEY php artisan key:genera

  • 详解Laravel框架的依赖注入功能

    概述 任何时候,你在一个控制器类中请求一个依赖,这个服务容器负责: 1.自动地在构造函数中检测依赖关系 2.如果需要构建这个依赖关系 3.通过构造函数创建对象形成依赖关系 来看一个非常简单的例子. <?php namespace App\Http\Controllers; use App\User; use App\Repositories\UserRepository; use App\Http\Controllers\Controller; class UserController exte

  • 如何用Laravel包含你自己的帮助函数

    很多教程都会说,你在 composer.json 这个文件中通过添加一个自动加载的文件,就可以实现这个需求.但我认为这不是一个好的方式,当你在 helpers.php 文件中添加了更多的函数时,可读性将变得很差. 下面我将介绍一种方式,让你可以定义很多文件,来包含不同的函数.这将让我们的程序更加整洁和更具可读性. 首先创建一个 HelperServiceProvider.php 服务提供者文件: php artisan make:provider HelperServiceProvider 使用

  • 分析五个Laravel Dusk的使用技巧

    目录 1. 填充隐藏字段 2. 模拟 HTML 地理位置 3. 使用 XPath 选择器 4. 整页截屏 5. 访问浏览器错误日志 1. 填充隐藏字段 在测试某些 JS 组件时 (例如自动完成,日期选择器等) ,可能需要编写动作模拟操作与这些组件交互.犹豫这些组件中的大多数最终都会将值保存到隐藏字段中.那么将值直接填写到隐藏字段中可能更加方便.这可以防止不稳定的测试,并确保我们不测试自己不拥有 / 控制的东西 (第三方组件). 尽管 Laravel Dusk 没有为我们提供类似$browser-

  • 分享五个PHP7性能优化提升技巧

    PHP7已经发布了, 作为PHP10年来最大的版本升级, 最大的性能升级, PHP7在多放的测试中都表现出很明显的性能提升, 然而, 为了让它能发挥出最大的性能, 我还是有几件事想提醒下. 1. Opcache 记得启用Zend Opcache, 因为PHP7即使不启用Opcache速度也比PHP-5.6启用了Opcache快, 所以之前测试时期就发生了有人一直没有启用Opcache的事情. 启用Opcache非常简单, 在php.ini配置文件中加入: zend_extension=opcac

  • 分享五个有用的jquery小技巧

    下文里技巧实现的效果虽然并不新鲜,但通过jQuery的封装,HTML实现了很大的清洁.清爽简洁又高效的代码任何时候都是开发者所醉心追求的终极目标,也许它简单,但是它能量巨大.一起来看看我们小编推荐给大家的五个非常实用的jQuery技巧. 1.禁用鼠标右键 $(document).ready(function() { $(document).bind("contextmenu", function(e) { return false; }); }); 当然jquery1.7版本以后bin

  • Hadoop源码分析五hdfs架构原理剖析

    目录 1. hdfs架构 如果在hadoop配置时写的配置文件不同,启动的服务也有所区别 namenode的下方是三台datanode. namenode左右两边的是两个zkfc. namenode的上方是三台journalnode集群. 2. namenode介绍 namenode作为hdfs的核心,它主要的作用是管理文件的元数据 文件与块的对应关系中的块 namenode负责管理hdfs的元数据 namenode的数据持久化,采用了一种日志加快照的方式 最后还会有一个程序读取这个快照文件和日

  • 分享8个Laravel模型时间戳使用技巧小结

    默认情况下,Laravel Eloquent 模型默认数据表有 created_at 和 updated_at 两个字段.当然,我们可以做很多自定义配置,实现很多有趣的功能.下面举例说明. 1. 禁用时间戳 如果数据表没有这两个字段,保存数据时 Model::create($arrayOfValues); -- 会看到 SQL error.Laravel 在自动填充 created_at / updated_at 的时候,无法找到这两个字段. 禁用自动填充时间戳,只需要在 Eloquent Mo

  • 使用Linux五年积累的一些经验技巧

    1. bash中的$相关参数 复制代码 代码如下: $0 - 表示当前文件名  $* - 以空格分离所有参数,形成一个字符串  $@ - 以空格分离所有参数,形成一个字符串组合.与$*的不同表现在被""引用时,"$*"是一个字符串,而"$@"则包含多个字符串  $# - 传递给进程的参数数目  $? - 上一条命令的执行结果,没有错误时为0  $$ - 本条命令的PID 2. bash技巧,由变量的内容来组合为另一个变量的变量名 EXAMPLE:

  • Laravel框架使用技巧之使用url()全局函数返回前一个页面的地址方法详解

    注意:文章标题中5.2+表示该文章内容可向上兼容,适用于Laravel版本5.2及更高(目前最新为5.6),但不可向下兼容,即不适用于5.2版本以下.推荐大家花一点点时间,将自己的Laravel更新至5.6版本. 在后台开发时,我们经常需要获取用户之前操作页面的地址并生成一个返回之前页面的链接. 而Laravel从版本5.2+开始,便提供了一系列全局帮助函数(Helper Functions)来简化我们的工作: https://laravel.com/docs/5.2/helpers#metho

  • 分享5个非常有用的Laravel Blade指令

    简介 Blade是Laravel提供的一个非常简单.强大的模板引擎,不同于其他流行的PHP模板引擎,Blade在视图中并不约束你使用PHP原生代码.所有的Blade视图都会被编译成原生PHP代码并缓存起来直到被修改,这意味着对应用的性能而言Blade基本上是零开销.Blade视图文件使用.blade.php文件扩展并存放在resources/views目录下. 接下来我将带大家认识下五个 Laravel Blade 指令,这些指令将让你在解决特定问题时如虎添翼.如果你是刚接触 Laravel 的

  • PHP的Laravel框架结合MySQL与Redis数据库的使用部署

    相对于熟读官方文档,更重要的是要把框架环境搭起来. 零.环境介绍 操作系统:centOS 数据库: mysql 5.6 (阿里云RDS) PHP 5.4.4 (>=5.4即可) Laravel 5.0 一.安装LNMP 在安装Laravel之前,需要把Linux + Nginx + Mysql + Php的环境搭建好.具体的搭建步骤这里就不再详述了. P.S. Linux阿里云已经自带了,本文使用的是centOS 6.5 64位的ECS 关于Nginx和Apache的选择看自己喜好,本文使用的是

  • Laravel如何使用Redis共享Session

    一.当系统的访问量上升的时候,使用Redis保存Session可以提高系统的性能,同时也方便多机负载的时候共享Session 1.打开config/database.php.在redis中增加session的连接 'session' => [ 'host' => env('REDIS_HOST', '127.0.0.1'), 'password' => env('REDIS_PASSWORD', null), 'port' => env('REDIS_PORT', 6379), '

随机推荐