php - 使用 Laravel Dusk 测试 ReCaptcha
问题描述
我在使用 Laravel Dusk 在表单上测试不可见的 ReCaptcha 时遇到了一个小问题。涉及这种情况的包是Albertcht 的 Invisible Recaptcha
我在CreatesApplication.php
文件中有这个方法/tests
protected function withoutRecaptcha() : void
{
InvisibleReCaptcha::shouldReceive("verifyRequest")
->andReturnTrue();
InvisibleReCaptcha::shouldReceive("verifyResponse")
->once()
->andReturnTrue();
}
这对于功能测试非常有效,因为我只需要点击 API,我可以忽略g-recaptcha-response
来自发布请求的输入。
但是如果我想测试表单本身,使用像 Laravel Dusk 这样的浏览器测试系统,当然这还不够。
我目前的 Dusk 方法如下。
public function a_guest_can_fill_the_registration_form()
{
$this->withoutRecaptcha();
$this->browse(function (Browser $browser) {
$browser->maximize()
->visit(new Register())
->assertPresent("input[name=g-recaptcha-response]")
->fillFormWithRandomData()
->submitForm()
->waitForReload()
->assertVisible(".alert.alert-success");
});
}
这里简单明了,我调用注册表单,填写数据,提交并检查是否出现警报。目前这不起作用,我收到此错误:
There was 1 failure:
1) Tests\Browser\RegisterTest::a_guest_can_fill_the_registration_form
Element [body input[name=g-recaptcha-response]] is not present.
Failed asserting that false is true.
/app/vendor/laravel/dusk/src/Concerns/MakesAssertions.php:806
/app/vendor/laravel/dusk/src/Concerns/ProvidesBrowser.php:67
所以问题很清楚:在测试期间,ReCaptcha 输入没有被渲染,因此不可能点击它甚至伪造它
有没有办法渲染伪造的 ReCaptcha 以使其与 Laravel Dusk 一起使用?
谢谢
解决方案
reCaptcha 通常在 iframe 中。Dusk 无法识别 iframe 中的元素。但是,您可以使用方法->withinFrame('selector', function ($browser) {});
并在 insideFrame 闭包中声明值。
推荐阅读
- typescript - 如何在 next.js 中使用 sass
- css - 如何选择 ::after 元素?
- python - 合并两个表
- python - 在Python中获取数组中对象的世界位置
- sequelize.js - 续集类型错误:“值”参数超出范围
- dataframe - 如何通过管道将 spark rdd 传输到 python 并从 python 返回 rdd
- python - 测试。测试参数化不起作用
- python-3.x - fit_generator 中的日志验证步骤
- azure - 如何在 microsoft face api 中增加每秒事务限制?
- dvc - dvc gc 和远程缓存中的文件