diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1791f61..4fd3774 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,9 +19,9 @@ jobs: - php: 7.4 stability: lowest symfony: '*' - - php: 8.0 - stability: highest - symfony: '5.4.*@dev' +# - php: 8.0 +# stability: highest +# symfony: '5.4.*@dev' steps: - name: Checkout code uses: actions/checkout@v2.3.3 diff --git a/src/Browser/Mink/BrowserKitDriver.php b/src/Browser/Mink/BrowserKitDriver.php index 6c31286..1a8acdd 100644 --- a/src/Browser/Mink/BrowserKitDriver.php +++ b/src/Browser/Mink/BrowserKitDriver.php @@ -21,6 +21,7 @@ use Symfony\Component\DomCrawler\Field\ChoiceFormField; use Symfony\Component\DomCrawler\Field\FileFormField; use Symfony\Component\DomCrawler\Field\FormField; +use Symfony\Component\DomCrawler\Field\InputFormField; use Symfony\Component\DomCrawler\Field\TextareaFormField; use Symfony\Component\DomCrawler\Form; use Symfony\Component\HttpKernel\HttpKernelBrowser; @@ -648,7 +649,7 @@ private function submit(Form $form) $formId = $this->getFormNodeId($form->getFormNode()); if (isset($this->forms[$formId])) { - $form = $this->forms[$formId]; + $form = $this->addButtons($form, $this->forms[$formId]); } // remove empty file fields from request @@ -800,4 +801,27 @@ private function getCrawler() return $crawler; } + + /** + * Adds button fields from submitted form to cached version. + */ + private function addButtons(Form $submitted, Form $cached): Form + { + foreach ($submitted->all() as $field) { + if (!$field instanceof InputFormField) { + continue; + } + + $nodeReflection = (new \ReflectionObject($field))->getProperty('node'); + $nodeReflection->setAccessible(true); + + $node = $nodeReflection->getValue($field); + + if ('button' === $node->nodeName || \in_array($node->getAttribute('type'), ['submit', 'button', 'image'])) { + $cached->set($field); + } + } + + return $cached; + } } diff --git a/tests/BrowserTests.php b/tests/BrowserTests.php index 318bc41..5934e4f 100644 --- a/tests/BrowserTests.php +++ b/tests/BrowserTests.php @@ -458,6 +458,53 @@ public function can_submit_form_with_different_submit_buttons(): void ->assertOn('/submit-form') ->assertContains('"submit_2":"c"') ->assertNotContains('submit_1') + ->visit('/page1') + ->click('Submit D') + ->assertOn('/submit-form') + ->assertContains('"submit_2":"d"') + ->assertNotContains('submit_1') + ; + } + + /** + * @see https://github.com/zenstruck/browser/issues/55 + * + * @test + */ + public function can_submit_filled_form_with_different_submit_buttons(): void + { + // Submit and Submit B, have the same field name but different values + // Submit C has a different field name (and value) + + $this->browser() + ->visit('/page1') + ->fillField('input_1', 'Kevin') + ->click('Submit') + ->assertOn('/submit-form') + ->assertContains('"input_1":"Kevin"') + ->assertContains('"submit_1":"a"') + ->assertNotContains('submit_2') + ->visit('/page1') + ->fillField('input_1', 'Kevin') + ->click('Submit B') + ->assertOn('/submit-form') + ->assertContains('"input_1":"Kevin"') + ->assertContains('"submit_1":"b"') + ->assertNotContains('submit_2') + ->visit('/page1') + ->fillField('input_1', 'Kevin') + ->click('Submit C') + ->assertOn('/submit-form') + ->assertContains('"input_1":"Kevin"') + ->assertContains('"submit_2":"c"') + ->assertNotContains('submit_1') + ->visit('/page1') + ->fillField('input_1', 'Kevin') + ->click('Submit D') + ->assertOn('/submit-form') + ->assertContains('"input_1":"Kevin"') + ->assertContains('"submit_2":"d"') + ->assertNotContains('submit_1') ; } diff --git a/tests/Fixture/files/page1.html b/tests/Fixture/files/page1.html index 99d0077..5aae113 100644 --- a/tests/Fixture/files/page1.html +++ b/tests/Fixture/files/page1.html @@ -58,6 +58,7 @@

h1 title

+