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

Laravel Dusk分支页面判断问题求助:if elseif语句失效

解决Laravel Dusk跳转路径判断失效的问题

嘿,我懂你遇到的麻烦了——你想用if-elseif结合assertPathBeginsWith来判断提交后的跳转路径,但这个逻辑根本跑不起来对吧?问题出在Laravel Dusk断言方法的特性上:

assertPathBeginsWith这类断言方法,一旦断言失败就会直接抛出测试异常,终止整个测试流程,而不是返回false让你继续走else分支。所以如果第一个断言不满足,你的测试直接就挂了,根本到不了elseif的判断环节。

给你两个可行的解决方案:

方案一:直接获取当前URL做字符串判断

这是最简洁直观的方式,我们先拿到当前页面的URL路径,再用字符串匹配来做分支判断,不会触发断言异常:

$this->browse(function (Browser $browser) { 
    $browser->visit('/') 
        ->mouseover('@Appliances-mouseover') 
        ->type('@enter-city', 'Location') 
        ->type('@enter-postal-code', '0165') 
        ->click('@select-province') 
        ->click('@selected-province-some-province') 
        ->click('@select-hear-about-us') 
        ->click('@hear-about-us-email') 
        ->click('@agree-terms') 
        ->press('@submit-step-1'); 

    // 提取当前页面的URL路径部分
    $currentPath = parse_url($browser->driver->getCurrentURL(), PHP_URL_PATH);

    if (str_starts_with($currentPath, '/application/prevet')) { 
        $browser->screenshot('Prevet form') 
            ->assertUrlIs('/application/prevet') 
            ->pause(25000); 
    } elseif (str_starts_with($currentPath, '/application/step3')) { 
        $browser->screenshot('step3 form') 
            ->assertUrlIs('/application/step3') 
            ->click('@uploadPayslip') 
            ->assertSee('Personal Documents'); 
    }
});

这里用parse_url提取纯路径部分,再用str_starts_with(PHP 8.0+支持)判断开头。如果你用的是更低版本的PHP,可以换成Illuminate\Support\Str::startsWith(记得先引入use Illuminate\Support\Str;)。

方案二:用try-catch捕获断言异常

这种方式利用断言失败会抛出异常的特性,用try块尝试第一个断言,失败就走catch块执行第二个分支:

$this->browse(function (Browser $browser) { 
    $browser->visit('/') 
        // ... 前面的操作和你原来的代码一致
        ->press('@submit-step-1'); 

    try {
        $browser->assertPathBeginsWith('/application/prevet');
        // 断言成功,执行prevet分支逻辑
        $browser->screenshot('Prevet form') 
            ->assertUrlIs('/application/prevet') 
            ->pause(25000); 
    } catch (\PHPUnit\Framework\ExpectationFailedException $e) {
        // 断言失败,说明跳转到了step3
        $browser->screenshot('step3 form') 
            ->assertUrlIs('/application/step3') 
            ->click('@uploadPayslip') 
            ->assertSee('Personal Documents'); 
    }
});

不过这种方式不如第一种直观,要是有更多分支的话会变得臃肿,所以更推荐方案一。

另外注意你原来的代码有语法错误——最后缺少了闭合的}和);,记得补上哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:39:04