You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel Dusk组件内无法访问Stripe iframe元素问题求助

问题根因

Laravel Dusk 的 within() 方法会自动为组件作用域内的所有 CSS 选择器,拼接你在组件 selector() 方法中返回的 .__PrivateStripeElement 前缀。当你进入 Stripe 独立 iframe 后查找输入框时,Dusk 依然给输入框选择器拼接了此前缀,但 iframe 内部是完全独立的 DOM 结构,不存在对应父元素,因此触发元素找不到的报错。

修复方案

1. 修改 StripeForm 组件代码

选择器前加 @ 前缀即可告知 Dusk 跳过自动拼接组件前缀的逻辑,同时组件方法无需额外传入 Browser 实例,可直接调用 Dusk 原生方法:

// selector 方法保持不变
public function selector()
{
    return '.__PrivateStripeElement';
}

public function fillCardDetails($number = '4242424242424242')
{
    $this->waitFor('@iframe')
         ->withinFrame('@iframe', function($browser) use ($number) {
             $browser->waitFor('@input[placeholder="Card number"]', 10) // 替换固定等待,提升执行效率
                 ->keys('@input[placeholder="Card number"]', $number)
                 ->keys('@input[placeholder="MM / YY"]', '0125')
                 ->keys('@input[placeholder="CVC"]', '123')
                 ->keys('@input[placeholder="ZIP"]', '12345');
         });
}

2. 修改测试调用代码

within 回调接收的参数是组件实例,直接调用组件方法即可:

public function user_can_subscribe()
{
    $this->browse(function (Browser $browser) {
        $browser->visit(new SubscribePage)
            ->within(new StripeForm, function ($stripeForm) {
                $stripeForm->fillCardDetails();
            })
            ->press('@subscribe-button');
    });
}

内容的提问来源于stack exchange,提问作者goddas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 06:15:02