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
相关产品推荐
相关产品推荐

