Laravel5.1phpunit-press()给了我';“无法访问的字段”&引用';

Laravel5.1phpunit-press()给了我';“无法访问的字段”&引用';,php,laravel,testing,phpunit,laravel-5.1,Php,Laravel,Testing,Phpunit,Laravel 5.1,当尝试调用press()方法时,我总是得到 InvalidArgumentException:无法访问的字段“” 在那条线上 根据文件: “按”具有给定文本或名称的按钮 我的方法: press('Create') 我的按钮是 <button class="btn btn-lg btn-primary" type="submit" name="submit">Create</button> 更新1 这是我的表格: {!! Form::open(['route' =&

当尝试调用
press()
方法时,我总是得到

InvalidArgumentException:无法访问的字段“”

在那条线上

根据文件:

“按”具有给定文本或名称的按钮

我的方法:

press('Create') 
我的按钮是

<button class="btn btn-lg btn-primary" type="submit" name="submit">Create</button> 
更新1

这是我的表格:

{!! Form::open(['route' => 'employees.store', 'method' => 'POST']) !!}
  @include('employees.form')
{!! Form::close() !!}

正如您所看到的,我的字段不可能在表单之外

我不确定你的问题的确切原因是什么,但可能有几件事。 我会评论的,但我还没有足够的声誉

首先,您是否通过验证器运行普通html?如果出现语法错误,请尝试修复它们并再次运行单元测试。(你可以试试这个,只需复制并粘贴你的html)

另一个原因可能是您有一些修改DOM的javascript,而Laravel测试无法处理这一点

最后,您可以尝试将
的“value”属性设置为“Create”


根据经验,无法访问的字段错误通常是由按钮在
元素之外引起的,我有一个类似的场景,页面的另一部分通过
$request
传递给控制器,但因为它与其他元素不在同一个即时表单元素内,PHPUnit无法将其与表单关联

将方法从
press()
更改为
click()
,这样做是值得的,因为它只会查找它通常可以单击的内容,而不是尝试将提交按钮与表单匹配

如上所述,PHPUnit无法单独测试JavaScript(当然,如果您使用的是JavaScript),您需要像Selenium这样的东西来完成测试


如果没有标记,很难说,您可以发布表单的标记吗

出现这种情况的主要原因是,当您有如下所示的提交按钮时<代码>提交。当您将按钮的文本更改为Submit之外的其他文本时,它将正常工作。e、 g
创建

前面的建议没有涵盖使两个提交按钮具有相同值的业务需求

我们需要做的是覆盖默认的Laravel表达式。

我们不会用文本查找第二个submit按钮的第一个实例,而是告诉Laravel查找具有我们的特定XPath的元素(第二个submit按钮)


额外积分如果您是XPath新手,可以在Chrome浏览器上右键单击检查过的源代码。您需要的选项是
Copy
copyaxpath

您可能会发现它与
submitForm
方法一起工作:

$this->submitForm('Create', ['username' => 'john']);

我也有类似的问题。这可能与客户端验证失败有关。我认为这与按钮无关,但与表单中提交的其他字段有关。“”表示它可能与具有数组名称的输入相关(例如name=“email[]”)。您可以发布表单的示例吗?如果您的输入具有WebSpanner所述的数组名称,您可以为您的输入提供一个与名称相同但不带数组声明的id,并在PHPUnit中引用输入,而不带括号。这将解决您的问题,并允许PHPUnit看到提交按钮。就是这样。我有两种表单:标准表单和ajax表单。无法测试ajax表单,但这就是问题所在。
<button class="btn btn-lg btn-primary" type="submit" name="submit" value="Create">Create</button>
<input type="submit" class="btn btn-lg btn-primary" name="submit" value="Create" />
    $this->visit(route('user.login'));

    // replace `login-btn-2` with the id of your second button
    $button = $this->crawler->filterXPath('//*[@id="login-btn-2"]'); 

    $form = $button->form($inputs = ['email' => $user->email, 'password' => $password,]);

    $this->makeRequestUsingForm($form);

    $this->see(route('user.loggedin.dashboard'));
$this->submitForm('Create', ['username' => 'john']);