Laravel Dusk是什么?浏览器测试如何做?

Laravel Dusk是Laravel官方提供的浏览器自动化测试工具,用于模拟用户操作进行端到端测试。它通过安装Dusk包并生成测试文件来编写测试用例,支持访问页面、填写表单、点击按钮及断言结果。使用DatabaseMigrations等trait可确保测试数据隔离,其API设计直观,集成智能等待和失败截图功能,提升测试稳定性与调试效率。通过Page Objects模式可提高测试可维护性,将页面元素与操作封装复用。在CI/CD中运行时需配置无头Chrome、Chromedriver及环境依赖,建议使用Docker保证环境一致,并利用JUnit报告与截图实现快速反馈。执行命令为php artisan dusk,适用于本地或持续集成环境中的自动化测试验证。

laravel dusk是什么?浏览器测试如何做?

Laravel Dusk是Laravel官方提供的一个浏览器自动化测试工具,它允许你像真实用户一样与你的应用进行交互,通过模拟点击、填写表单、导航等操作,来验证应用程序的端到端功能。简单来说,它就是让你的代码去“扮演”一个用户,然后看看你的网站是不是按照预期那样工作。浏览器测试,也就是所谓的端到端(E2E)测试,主要是通过自动化脚本在真实的浏览器环境中运行你的应用,检查从前端界面到后端逻辑的整个流程是否顺畅无误。

解决方案

要进行浏览器测试,尤其是使用Laravel Dusk,核心在于配置环境、编写测试脚本和执行这些脚本。

首先,你需要确保你的Laravel项目已经安装了Dusk。这通常通过Composer完成:

composer require --dev laravel/duskphp artisan dusk:install

安装完成后,Dusk会在你的

tests

目录下创建一个

Browser

文件夹,里面包含一个示例测试文件。

接着,我们就可以开始编写一个简单的浏览器测试了。假设我们有一个登录页面,我们需要测试用户能否成功登录。

// tests/Browser/LoginTest.phpcreate([ // 创建一个测试用户            'email' => 'test@example.com',            'password' => bcrypt('password'),        ]);        $this->browse(function (Browser $browser) use ($user) {            $browser->visit('/login') // 访问登录页面                    ->type('email', $user->email) // 填写邮箱                    ->type('password', 'password') // 填写密码                    ->press('Login') // 点击登录按钮                    ->assertPathIs('/home') // 断言跳转到了/home页面                    ->assertSee('Dashboard'); // 断言页面上显示了"Dashboard"文本        });    }    /**     * 测试用户输入错误凭据时无法登录。     *     * @return void     */    public function testUserCannotLoginWithInvalidCredentials()    {        $this->browse(function (Browser $browser) {            $browser->visit('/login')                    ->type('email', 'wrong@example.com')                    ->type('password', 'wrong-password')                    ->press('Login')                    ->assertPathIs('/login') // 断言还在登录页面                    ->assertSee('These credentials do not match our records.'); // 断言显示错误信息        });    }}

这段代码首先创建了一个测试用户,然后模拟用户访问登录页,输入凭据,点击登录。最后,通过断言(

assertPathIs

assertSee

)来验证操作结果是否符合预期。

要运行这些测试,你只需在命令行中执行:

php artisan dusk

Dusk会自动启动一个Chromium浏览器(通常是无头模式,也就是没有图形界面的模式),执行你的测试,并报告结果。如果测试失败,Dusk还会自动截屏,帮助你定位问题。

为什么选择Laravel Dusk进行端到端测试?

老实说,对于Laravel开发者而言,Dusk的吸引力是巨大的。它不仅仅是一个浏览器自动化工具,更是深度融入了Laravel生态系统。我个人觉得,它最大的优势在于其无缝的集成体验简洁直观的API

首先,作为Laravel的官方工具,Dusk与框架的其他部分协同工作得天衣无缝。你不需要为了进行E2E测试而引入一个完全独立的、可能需要额外配置的框架。Dusk直接利用了Laravel的测试环境,比如数据库迁移(

DatabaseMigrations

trait),这让测试数据的准备变得异常简单。你可以在测试开始前轻松地创建、填充或清空数据库,确保每次测试都在一个干净、可预测的状态下运行。

其次,Dusk的API设计非常“Laravel化”,如果你熟悉Laravel的其他组件,你会发现Dusk的语法非常流畅和直观。它提供了一系列链式调用的方法,比如

visit()

type()

press()

assertSee()

等等,这些方法高度抽象了浏览器操作,让编写测试用例更像是用自然语言描述用户行为,而不是与复杂的Selenium或WebDriver API直接打交道。这种设计大大降低了学习曲线,让开发者能够更快地投入到测试编写中。

再者,Dusk在处理一些浏览器测试中常见的痛点上做得很好,比如等待元素。在现代Web应用中,大量的JavaScript异步加载使得页面元素并非总是立即可用。Dusk内置了智能等待机制,例如

waitFor()

waitUntilMissing()

等,它会在执行操作前自动等待元素出现或消失,这大大减少了测试的“假阳性”失败(即因为元素未加载完成而失败,而非实际功能错误)。这玩意儿真的能省去不少调试时间。

最后,Dusk在测试失败时提供的自动截图功能简直是救命稻草。当测试在CI/CD管道中运行,你无法直观看到浏览器界面时,一张失败时的截图能让你迅速定位到问题所在,无论是UI布局错误、JavaScript报错还是后端返回异常,都能一目了然。这种即时反馈对于快速迭代和修复bug至关重要。

编写高质量Dusk测试用例的关键技巧有哪些?

编写Dusk测试用例,不只是让它们能跑起来,更重要的是让它们稳定、可维护、易读。我个人在实践中总结了一些关键技巧,能让你的Dusk测试真正发挥价值。

一个非常重要的概念是Page Objects(页面对象)模式。随着你的应用越来越复杂,测试用例会越来越多,直接在测试文件中操作各种CSS选择器和XPath会变得非常臃肿和难以维护。Page Objects模式的核心思想是将页面的元素和交互逻辑封装成一个类。比如,你可以创建一个

LoginPage

类,里面定义了登录页的邮箱输入框、密码输入框、登录按钮等元素,以及登录操作的方法。

// tests/Browser/Pages/LoginPage.phpassertPathIs($this->url());    }    /**     * 获取页面元素的选择器。     *     * @return array     */    public function elements()    {        return [            '@emailField' => 'input[name="email"]',            '@passwordField' => 'input[name="password"]',            '@loginButton' => 'button[type="submit"]',        ];    }    /**     * 执行登录操作。     *     * @param  LaravelDuskBrowser  $browser     * @param  string  $email     * @param  string  $password     * @return void     */    public function login(Browser $browser, string $email, string $password)    {        $browser->type('@emailField', $email)                ->type('@passwordField', $password)                ->press('@loginButton');    }}

然后在你的测试中,你可以这样使用:

// tests/Browser/LoginTest.phpuse TestsBrowserPagesLoginPage;// ...$this->browse(function (Browser $browser) use ($user) {    $browser->visit(new LoginPage())            ->on(new LoginPage()) // 进入LoginPage上下文            ->login($user->email, 'password') // 调用Page Object中的方法            ->assertPathIs('/home');});

这样一来,如果登录页面的某个选择器变了,你只需要修改

LoginPage

这一个文件,而不是散落在各个测试用例中的几十个地方。这大大提高了测试的可维护性。

另一个关键是测试数据的管理。Dusk测试通常涉及数据库操作,比如创建用户、文章等。每次运行测试时,你都希望有一个干净、一致的数据库状态。使用

DatabaseMigrations

DatabaseTransactions

(或者

RefreshDatabase

)trait,结合Laravel的工厂(Factories)和数据填充(Seeders),可以高效地管理测试数据。确保你的测试是原子性的,即每个测试用例都是独立的,不依赖于其他测试用例的执行顺序或状态。

还有,要充分利用Dusk提供的断言(Assertions)。除了

assertSee()

assertPathIs()

,还有很多实用的断言,比如

assertInputValue()

(检查表单输入框的值)、

assertChecked()

(检查复选框是否被选中)、

assertSourceHas()

(检查页面源码是否包含某个字符串)等等。选择最能精确验证你期望结果的断言,避免模糊的断言,这能让你的测试更健壮。

最后,对于异步操作和JavaScript密集型页面,智能等待是必不可少的。不要简单地使用

sleep()

,那会使测试变得缓慢且不稳定。优先使用

waitFor()

waitUntilMissing()

waitForText()

waitForLocation()

等Dusk内置的等待方法。这些方法会轮询检查条件,一旦满足就继续执行,比固定等待时间要高效和可靠得多。

在持续集成(CI/CD)环境中运行Dusk测试的实践建议

将Dusk测试集成到CI/CD流程中,是确保代码质量和快速交付的关键一步。但在实际操作中,CI环境与本地开发环境往往存在差异,这可能导致测试失败或运行不稳定。我在这方面也踩过不少坑,所以有些经验想分享。

首先,无头浏览器是CI环境的标配。在CI服务器上,通常没有图形界面来运行完整的浏览器。Dusk默认就会尝试使用无头模式的Chrome。你需要确保CI服务器上安装了Google Chrome浏览器和对应的Chromedriver。很多CI服务(如GitHub Actions、GitLab CI)都提供了预构建的Docker镜像,或者有方便的配置方式来安装这些依赖。例如,在GitHub Actions中,你可以使用

setup-chrome

这样的action来快速配置。

# 示例:GitHub Actions配置jobs:  dusk:    runs-on: ubuntu-latest    steps:      - uses: actions/checkout@v3      - uses: shivammathur/setup-php@v2        with:          php-version: '8.2'          extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, pdo_mysql          ini-values: post_max_size=256M, upload_max_filesize=256M      - name: Install Node.js        uses: actions/setup-node@v3        with:          node-version: '18'      - name: Install Composer Dependencies        run: composer install --no-dev --no-interaction --prefer-dist      - name: Install NPM Dependencies        run: npm install      - name: Build Assets        run: npm run build      - name: Install Chrome        run: |          sudo apt-get update          sudo apt-get install -y google-chrome-stable      - name: Install Chromedriver        run: |          CHROME_VERSION=$(google-chrome --version | grep -oP 'd+.d+.d+' | head -1)          wget "https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/`echo $CHROME_VERSION | cut -d'.' -f1`/linux64/chromedriver-linux64.zip"          unzip chromedriver-linux64.zip          sudo mv chromedriver-linux64/chromedriver /usr/local/bin/chromedriver          sudo chmod +x /usr/local/bin/chromedriver      - name: Prepare Laravel Environment        run: |          cp .env.example .env          php artisan key:generate          php artisan migrate --force          php artisan db:seed --force # 如果你的测试需要seed数据      - name: Run Dusk Tests        run: php artisan dusk

其次,环境配置的一致性至关重要。CI环境通常是临时的、隔离的,你需要确保所有运行Dusk测试所需的依赖(如PHP版本、Composer依赖、Node.js及NPM依赖,甚至数据库服务)都已正确安装和配置。使用Docker容器来构建CI环境是一个非常好的实践,它可以确保你的CI环境与本地开发环境尽可能地保持一致,减少“在我机器上能跑”的问题。

另外,处理网络延迟和资源限制。CI服务器的性能可能不如你的开发机,网络延迟也可能更高。这可能会导致一些原本在本地通过的Dusk测试在CI上失败,因为页面加载时间、JavaScript执行时间可能更长。Dusk的智能等待机制在这里再次发挥作用,但你可能需要适当调整一些

waitFor()

的超时时间,或者确保你的CI环境有足够的资源。如果测试经常因为超时而失败,那可能意味着你的CI环境不够稳定,或者你的测试本身对时间过于敏感。

最后,测试报告和通知。当Dusk测试在CI上运行失败时,你需要及时知道。大多数CI/CD平台都集成了测试报告功能,Dusk本身也能生成JUnit XML格式的报告。配置CI系统来解析这些报告,并在测试失败时发送通知(例如邮件、Slack消息),这样团队就能快速响应,避免问题蔓延。同时,利用Dusk失败时自动截屏的功能,将这些截图作为CI构建产物保存下来,对于远程调试非常有用。

总而言之,在CI/CD中运行Dusk测试,关键在于环境的标准化和稳定性。投入时间去优化你的CI配置,确保它能可靠地运行Dusk测试,这将在长期内为你节省大量时间和精力。

以上就是Laravel Dusk是什么?浏览器测试如何做?的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/146042.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月2日 08:35:27
下一篇 2025年12月2日 08:58:50

相关推荐

  • CSS mask属性无法获取图片:为什么我的图片不见了?

    CSS mask属性无法获取图片 在使用CSS mask属性时,可能会遇到无法获取指定照片的情况。这个问题通常表现为: 网络面板中没有请求图片:尽管CSS代码中指定了图片地址,但网络面板中却找不到图片的请求记录。 问题原因: 此问题的可能原因是浏览器的兼容性问题。某些较旧版本的浏览器可能不支持CSS…

    2025年12月24日
    900
  • 如何用dom2img解决网页打印样式不显示的问题?

    用dom2img解决网页打印样式不显示的问题 想将网页以所见即打印的的效果呈现,需要采取一些措施,特别是在使用了bootstrap等大量采用外部css样式的框架时。 问题根源 在常规打印操作中,浏览器通常会忽略css样式等非必要的页面元素,导致打印出的结果与网页显示效果不一致。这是因为打印机制只识别…

    2025年12月24日
    800
  • 如何用 CSS 模拟不影响其他元素的链接移入效果?

    如何模拟 css 中链接的移入效果 在 css 中,模拟移入到指定链接的效果尤为复杂,因为链接的移入效果不影响其他元素。要实现这种效果,最简单的方法是利用放大,例如使用 scale 或 transform 元素的 scale 属性。下面提供两种方法: scale 属性: .goods-item:ho…

    2025年12月24日
    700
  • Uniapp 中如何不拉伸不裁剪地展示图片?

    灵活展示图片:如何不拉伸不裁剪 在界面设计中,常常需要以原尺寸展示用户上传的图片。本文将介绍一种在 uniapp 框架中实现该功能的简单方法。 对于不同尺寸的图片,可以采用以下处理方式: 极端宽高比:撑满屏幕宽度或高度,再等比缩放居中。非极端宽高比:居中显示,若能撑满则撑满。 然而,如果需要不拉伸不…

    2025年12月24日
    400
  • PC端H5项目如何实现适配:流式布局、响应式设计和两套样式?

    PC端的适配方案及PC与H5兼顾的实现方案探讨 在开发H5项目时,常用的屏幕适配方案是postcss-pxtorem或postcss-px-to-viewport,通常基于iPhone 6标准作为设计稿。但对于PC端网项目,处理不同屏幕大小需要其他方案。 PC端屏幕适配方案 PC端屏幕适配一般采用流…

    2025年12月24日
    300
  • CSS 元素设置 10em 和 transition 后为何没有放大效果?

    CSS 元素设置 10em 和 transition 后为何无放大效果? 你尝试设置了一个 .box 类,其中包含字体大小为 10em 和过渡持续时间为 2 秒的文本。当你载入到页面时,它没有像 YouTube 视频中那样产生放大效果。 原因可能在于你将 CSS 直接写在页面中 在你的代码示例中,C…

    2025年12月24日
    400
  • 如何实现类似横向U型步骤条的组件?

    横向U型步骤条寻求替代品 希望找到类似横向U型步骤条的组件或 CSS 实现。 潜在解决方案 根据给出的参考图片,类似的组件有: 图片所示组件:图片提供了组件的外观,但没有提供具体的实现方式。参考链接:提供的链接指向了 SegmentFault 上的另一个问题,其中可能包含相关的讨论或解决方案建议。 …

    2025年12月24日
    800
  • 如何让小说网站控制台显示乱码,同时网页内容正常显示?

    如何在不影响用户界面的情况下实现控制台乱码? 当在小说网站上下载小说时,大家可能会遇到一个问题:网站上的文本在网页内正常显示,但是在控制台中却是乱码。如何实现此类操作,从而在不影响用户界面(UI)的情况下保持控制台乱码呢? 答案在于使用自定义字体。网站可以通过在服务器端配置自定义字体,并通过在客户端…

    2025年12月24日
    800
  • 如何优化CSS Grid布局中子元素排列和宽度问题?

    css grid布局中的优化问题 在使用css grid布局时可能会遇到以下问题: 问题1:无法控制box1中li的布局 box1设置了grid-template-columns: repeat(auto-fill, 20%),这意味着容器将自动填充尽可能多的20%宽度的列。当li数量大于5时,它们…

    2025年12月24日
    800
  • SASS 中的 Mixins

    mixin 是 css 预处理器提供的工具,虽然它们不是可以被理解的函数,但它们的主要用途是重用代码。 不止一次,我们需要创建多个类来执行相同的操作,但更改单个值,例如字体大小的多个类。 .fs-10 { font-size: 10px;}.fs-20 { font-size: 20px;}.fs-…

    2025年12月24日
    000
  • 如何在地图上轻松创建气泡信息框?

    地图上气泡信息框的巧妙生成 地图上气泡信息框是一种常用的交互功能,它简便易用,能够为用户提供额外信息。本文将探讨如何借助地图库的功能轻松创建这一功能。 利用地图库的原生功能 大多数地图库,如高德地图,都提供了现成的信息窗体和右键菜单功能。这些功能可以通过以下途径实现: 高德地图 JS API 参考文…

    2025年12月24日
    400
  • 如何使用 scroll-behavior 属性实现元素scrollLeft变化时的平滑动画?

    如何实现元素scrollleft变化时的平滑动画效果? 在许多网页应用中,滚动容器的水平滚动条(scrollleft)需要频繁使用。为了让滚动动作更加自然,你希望给scrollleft的变化添加动画效果。 解决方案:scroll-behavior 属性 要实现scrollleft变化时的平滑动画效果…

    2025年12月24日
    000
  • CSS mask 属性无法加载图片:浏览器问题还是代码错误?

    CSS mask 属性请求图片失败 在使用 CSS mask 属性时,您遇到了一个问题,即图片没有被请求获取。这可能是由于以下原因: 浏览器问题:某些浏览器可能在处理 mask 属性时存在 bug。尝试更新到浏览器的最新版本。代码示例中的其他信息:您提供的代码示例中还包含其他 HTML 和 CSS …

    2025年12月24日
    000
  • 如何为滚动元素添加平滑过渡,使滚动条滑动时更自然流畅?

    给滚动元素平滑过渡 如何在滚动条属性(scrollleft)发生改变时为元素添加平滑的过渡效果? 解决方案:scroll-behavior 属性 为滚动容器设置 scroll-behavior 属性可以实现平滑滚动。 html 代码: click the button to slide right!…

    2025年12月24日
    500
  • 如何用 CSS 实现链接移入效果?

    css 中实现链接移入效果的技巧 在 css 中模拟链接的移入效果可能并不容易,因为它们不会影响周围元素。但是,有几个方法可以实现类似的效果: 1. 缩放 最简单的方法是使用 scale 属性,它会放大元素。以下是一个示例: 立即学习“前端免费学习笔记(深入)”; .goods-item:hover…

    2025年12月24日
    000
  • 网页使用本地字体:为什么 CSS 代码中明明指定了“荆南麦圆体”,页面却仍然显示“微软雅黑”?

    网页中使用本地字体 本文将解答如何将本地安装字体应用到网页中,避免使用 src 属性直接引入字体文件。 问题: 想要在网页上使用已安装的“荆南麦圆体”字体,但 css 代码中将其置于第一位的“font-family”属性,页面仍显示“微软雅黑”字体。 立即学习“前端免费学习笔记(深入)”; 答案: …

    2025年12月24日
    000
  • 如何选择元素个数不固定的指定类名子元素?

    灵活选择元素个数不固定的指定类名子元素 在网页布局中,有时需要选择特定类名的子元素,但这些元素的数量并不固定。例如,下面这段 html 代码中,activebar 和 item 元素的数量均不固定: *n *n 如果需要选择第一个 item元素,可以使用 css 选择器 :nth-child()。该…

    2025年12月24日
    200
  • 如何用 CSS 实现类似卡券的缺口效果?

    类似卡券的布局如何实现 想要实现类似卡券的布局,可以使用遮罩(mask)来实现缺口效果。 示例代码: .card { -webkit-mask: radial-gradient(circle at 20px, #0000 20px, red 0) -20px;} 效果: 立即学习“前端免费学习笔记(…

    2025年12月24日
    000
  • 如何用纯代码实现自定义宽度和间距的虚线边框?

    自定义宽度和间距的虚线边框 提问: 如何创建一个自定义宽度和间距的虚线边框,如下图所示: 元素宽度:8px元素高度:1px间距:2px圆角:4px 解答: 传统的解决方案通常涉及使用 border-image 引入切片的图片来实现。但是,这需要引入外部资源。本解答将提供一种纯代码的方法,使用 svg…

    2025年12月24日
    000
  • PC端、PC兼响应式H5项目,如何选择最佳适配方案?

    多屏适配:PC端、PC兼响应式H5项目解决方案 针对PC端的网页适配,业界普遍采用以下方案: 流媒体查询:根据设备屏幕宽度应用不同的样式表,实现不同屏幕尺寸的适配。栅格系统:将布局划分为多个网格,根据屏幕宽度调整网格的显示和隐藏,实现自适应布局。 一般情况下,设计师设计PC页面时,会以特定像素宽度为…

    2025年12月24日
    000

发表回复

登录后才能评论
关注微信