Lar*el Dusk:通过 DevTools 协议管理浏览器权限


laravel dusk:通过 devtools 协议管理浏览器权限

在 Lar*el Dusk 自动化测试中,处理浏览器权限(如剪贴板访问)是常见的挑战。本文将详细介绍如何通过扩展 `DuskTestCase` 类,利用 `ChromeDevToolsDriver` 执行 `Browser.grantPermissions` 命令,从而在测试运行时程序化地授予特定权限。这将使开发者能够更全面地测试依赖于浏览器权限的用户界面功能,确保测试流程的顺畅与完整性。

自动化测试中的浏览器权限挑战

在进行端到端(E2E)测试时,自动化工具如 Lar*el Dusk 模拟用户与 Web 应用程序的交互。然而,现代浏览器为了安全和隐私,会对某些敏感操作(例如访问剪贴板、地理位置、摄像头或麦克风)进行权限提示。在无头(headless)模式或自动化测试环境中,这些权限提示会阻断测试流程,导致测试失败。传统的点击授权方式在自动化测试中往往不可行,因此需要一种程序化的方式来预先授予必要的权限。

通过 Chrome DevTools 协议授予权限

Lar*el Dusk 基于 Selenium WebDriver,而 Chrome 浏览器提供了一套强大的 DevTools 协议,允许开发者工具或自动化脚本直接与浏览器进行低级别通信。Facebook\WebDriver\Chrome\ChromeDevToolsDriver 类正是连接 WebDriver 与 Chrome DevTools 协议的桥梁。我们可以利用这个类来执行 Browser.grantPermissions 命令,从而在测试开始前或特定测试步骤中授予所需的浏览器权限。

实现权限授予辅助方法

为了方便在多个测试用例中复用权限授予逻辑,建议在 tests/DuskTestCase.php 文件中添加一个辅助方法。

阿贝智能 阿贝智能

阿贝智能是基于AI技术辅助创作儿童绘本、睡前故事和有声书的平台,助你创意实现、梦想成真。

阿贝智能 63 查看详情 阿贝智能
<?php

namespace Tests;

use Facebook\WebDriver\Chrome\ChromeDevToolsDriver;
use Lar*el\Dusk\Browser;
use Lar*el\Dusk\TestCase as BaseTestCase;

abstract class DuskTestCase extends BaseTestCase
{
    use CreatesApplication;

    /**
     * 授予浏览器特定权限。
     *
     * @param Browser $browser 当前的 Dusk 浏览器实例。
     * @param array $permissions 要授予的权限数组,例如 ["clipboardReadWrite", "clipboardSanitizedWrite"]。
     * @return mixed DevTools 命令的执行结果,或 null(如果发生异常)。
     */
    protected function grantPermission(Browser $browser, array $permissions)
    {
        try {
            $driver = $browser->driver;
            // 创建 ChromeDevToolsDriver 实例,用于执行 DevTools 命令
            $devtools = new ChromeDevToolsDriver($driver);

            // 执行 Browser.grantPermissions 命令
            // "permissions" 参数是一个字符串数组,指定要授予的权限类型
            // 更多权限类型请参考 Chrome DevTools 协议文档
            $result = $devtools->execute('Browser.grantPermissions', [
                "permissions" => $permissions,
                // "origin" 参数可选,指定权限作用的源,
                // 如果不指定,通常会作用于当前页面或默认源。
                // 在多数 Dusk 测试场景中,通常无需显式指定。
            ]);

            return $result;
        } catch (\Exception $e) {
            // 捕获异常,例如 DevTools 命令执行失败
            // 可以在此处记录日志或根据需要处理错误
            error_log("Failed to grant permissions: " . $e->getMessage());
            return null;
        }
    }
}

代码解释:

  • $browser->driver:获取当前 Dusk 浏览器实例底层的 WebDriver 实例。
  • new ChromeDevToolsDriver($driver):使用 WebDriver 实例初始化 ChromeDevToolsDriver,这是与 Chrome DevTools 协议通信的关键。
  • $devtools->execute('Browser.grantPermissions', [...]):调用 DevTools 协议中的 Browser.grantPermissions 命令。
  • "permissions":这是一个字符串数组,包含了需要授予的具体权限标识符。例如,clipboardReadWrite 和 clipboardSanitizedWrite 用于读写剪贴板。其他常见的权限还包括 geolocation (地理位置)、camera (摄像头) 和 microphone (麦克风) 等。
  • "origin":这是一个可选参数,用于指定权限生效的源。在大多数 Dusk 测试场景中,由于测试通常在当前页面进行,因此可以省略或让其默认。

在测试用例中使用权限授予方法

一旦 grantPermission 方法被添加到 DuskTestCase 中,你就可以在任何继承自 DuskTestCase 的 Dusk 测试用例中调用它。

<?php

namespace Tests\Browser;

use Lar*el\Dusk\Browser;
use Tests\DuskTestCase;

class ExampleTest extends DuskTestCase
{
    /**
     * 测试剪贴板复制功能。
     *
     * @return void
     */
    public function testClipboardFunctionality()
    {
        $this->browse(function (Browser $browser) {
            // 在执行需要剪贴板权限的操作之前,授予权限
            $this->grantPermission($browser, ["clipboardReadWrite", "clipboardSanitizedWrite"]);

            // 模拟用户操作,例如点击复制按钮
            $browser->visit('/some-page-with-copy-button')
                    ->click('#copy-button');

            // 验证剪贴板内容(可能需要额外的 J*aScript 来获取剪贴板内容并断言)
            // 例如:
            // $clipboardContent = $browser->script('return n*igator.clipboard.readText()')[0];
            // $this->assertEquals('Expected content', $clipboardContent);

            // 注意:直接从浏览器获取剪贴板内容可能需要进一步的实现,
            // 因为 Dusk 默认的 `script` 方法在某些情况下可能无法直接访问到
            // 浏览器上下文的 `n*igator.clipboard`。
            // 更可靠的方法可能是让你的应用在复制后将内容存储在某个可访问的 DOM 元素或 JS 变量中。
        });
    }

    /**
     * 测试需要地理位置权限的功能。
     *
     * @return void
     */
    public function testGeolocationFeature()
    {
        $this->browse(function (Browser $browser) {
            // 授予地理位置权限
            $this->grantPermission($browser, ["geolocation"]);

            // 模拟访问需要地理位置的页面
            $browser->visit('/map-page')
                    ->assertSee('Your current location');
            // 进一步的断言,例如检查地图是否正确显示或位置信息是否被获取
        });
    }
}

注意事项与最佳实践

  • 浏览器兼容性: ChromeDevToolsDriver 和 Browser.grantPermissions 命令是 Chrome/Chromium 浏览器特有的。如果你的 Dusk 测试需要支持其他浏览器(如 Firefox),你需要寻找对应浏览器的权限管理机制或替代方案。
  • 权限列表: 不同的权限有不同的字符串标识符。请查阅 Chrome DevTools 协议文档 以获取完整的权限列表和其对应的字符串。
  • 测试隔离: 每次测试完成后,浏览器环境通常会重置,包括权限状态。但在某些复杂场景下,为了确保测试之间的完全隔离,你可能需要考虑在测试结束后显式地撤销权限(尽管 Browser.grantPermissions 协议中没有直接的 revokePermissions 命令,但通常每次测试运行都是一个新的浏览器上下文)。
  • 错误处理: 在 grantPermission 方法中加入异常捕获和日志记录,可以帮助你调试权限授予失败的情况。

总结

通过利用 Lar*el Dusk 的底层能力和 Chrome DevTools 协议,我们可以有效地在自动化测试中管理浏览器权限。这种方法不仅解决了因权限提示导致的测试中断问题,还使得对依赖敏感浏览器功能的应用程序进行端到端测试成为可能,从而提高了测试的覆盖率和可靠性。掌握这一技巧,将使你的 Lar*el Dusk 测试套件更加健壮和全面。

以上就是Lar*el Dusk:通过 DevTools 协议管理浏览器权限的详细内容,更多请关注php中文网其它相关文章!


# javascript  # 可选  # 测试中  # 这是一个  # 而在  # 阿贝  # webdri  # ai  # facebook  # app  # 浏览器  # js  # java  # laravel  # php  # 工具  # 雪儿漫画网站建设游戏  # 推广阅读广告视频网站  # 网站建设广告平台推广  # 汽车网站建设精英  # 自动化十大关键词排名榜  # 新建网站seo推广计划  # 东营网络营销推广内容  # 崇明专业网站建设  # 直播间营销号推广怎么做  # 百度网站没做好能推广吗  # 都是  # 端到  # 应用程序  # 通常会  # 怎么看 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 在XML中嵌入二进制数据(如图片)的最佳实践是什么? Base64编码与解析注意事项  《友玩*》创建群聊方法  《深林》冬季章节图文攻略  《顺丰同城骑士》查看我的技能方法  Teambition网盘如何共享文件  realme 10 Pro息屏方案_realme 10 Pro省电策略  pubmed数据库官方主页_pubmed学术论文查找官网直达  PHP魔术方法__set与__isset:设计考量、性能权衡与静态分析的视角  优化Leaflet弹出层图片显示:条件渲染策略  C#中的Record类型有什么优势?C# 9新特性Record与Class的用法区别  GBA模拟器手柄按键设置  QQ阅读小说搜索入口地址_QQ阅读小说搜索入口地址搜索在线阅读  c++如何实现一个简单的RPC框架_c++远程过程调用原理与实践  小米civi如何设置锁屏时间  食品生产用水只要符合国家规定的生活饮用水卫生标准就可以吗  掌握Go App Engine项目结构与GOPATH:包管理与导入实践  如何修改Windows截图的默认保存位置_告别C盘让桌面更整洁【教程】  《三角洲行动》战斗步枪与机枪类改装代码分享  使用AI在VS Code中将代码从一种语言翻译成另一种  微星主板BIOS怎么调整内存时序_内存参数手动优化BIOS设置教程  基于键值条件高效映射 Pandas DataFrame 多列数据  yandex网页版直接登录 yandex官方入口平台访问方法  Composer reinstall命令重装损坏的包  除了Copilot,还有哪些值得一试的VS Code AI插件?  高效调试PHP大型嵌套数组:JSON序列化与可视化工具实践  告别繁琐SEO!如何使用SyliusSitemap插件自动化生成网站地图,提升搜索引擎排名  Win10如何关闭操作中心通知 Win10免打扰设置全攻略【清爽】  《花瓣》创建专辑方法  电脑“无法访问指定设备、路径或文件”怎么办?五种权限设置方法  WPS文字如何进行简繁转换  《大润发优鲜》充值方法介绍  如何配置VS Code作为您Git操作的默认编辑器  海棠阅读登录教程_详细讲解海棠登录操作  优化CSS动画与J*aScript定时器协同:构建稳定Toast提示  Coolpad5890 ROM刷机包  《华夏千秋》龙女试炼功法获取方法  DeepSeek超全面指南:入门必看  追剧达人如何发弹幕  之了课堂app做题入口  抖音火山版如何进行提现  《原神》月之一版本新增书籍一览  b站如何剪辑视频_b站必剪app使用教程  《跳跳舞蹈》循环播放方法  《360浏览器》自动保存账号密码设置方法  CSS过渡如何实现按钮悬停效果_transition属性控制背景颜色变化  如何外贸网站设计-能留住客户提升用户体验!  苹果自助维修计划支持哪些设备机型  《盗墓笔记手游》技能介绍  J*a实现任务清单管理_集合框架综合入门练手  抖音作品被限流怎么办 抖音内容优化与流量恢复方法 

 2025-11-30

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.