如何在Symfony单元测试中模拟回车键触发的搜索栏表单提交?
错误原因
selectButton()仅匹配按钮类元素(<button>标签、type为submit/button/image的<input>标签),匹配依据是按钮的id、value值、按钮内文本,你传入的Search...是搜索输入框的placeholder属性,不属于按钮相关属性,无法匹配到任何元素,因此调用form()时抛出空节点异常。- 500错误是因为前述异常导致后续表单构造、提交逻辑未正常执行,加上你把
followRedirects()放在提交之后调用,重定向未被正确跟随,响应状态不符合断言要求。
解决方案
下面给出两种常用的无按钮表单提交测试方案:
方案1:通过表单或输入框直接获取Form对象
不需要通过按钮定位,直接用CSS选择器找到表单节点,再生成表单对象:
$client = static::createClient(); $crawler = $client->request('GET', '/user/search'); // 方法1:如果表单有id,直接通过id筛选表单 // $form = $crawler->filter('form#你的表单id')->form(); // 方法2:通过搜索输入框反向获取所属表单,更适配你的场景 $searchInput = $crawler->filter('input[name="form_group[userSearchText]"]'); $form = $searchInput->form(); // 赋值后提交 $form['form_group[userSearchText]'] = "Fall Class schedule"; // 开启自动跟随重定向要放在提交前 $client->followRedirects(); $client->submit($form); self::assertResponseIsSuccessful();
方案2:直接构造提交参数(模拟回车提交场景)
不需要解析页面表单,直接模拟表单提交请求,更贴合无按钮回车提交的测试场景:
$client = static::createClient(); $crawler = $client->request('GET', '/user/search'); // 第一个参数传空字符串会自动匹配页面上的第一个表单,第二个参数传表单字段键值对 $client->submitForm('', [ 'form_group[userSearchText]' => 'Fall Class schedule' ]); // 如果提交后有单次重定向,用followRedirect()即可 $client->followRedirect(); self::assertResponseIsSuccessful();
内容的提问来源于stack exchange,提问作者fall1n1
相关产品推荐
相关产品推荐

