From fe7a87058f402fe3f3c7fcb881c02aed0ac9e9d7 Mon Sep 17 00:00:00 2001 From: "robert.freigang" Date: Thu, 3 Apr 2025 12:38:49 +0200 Subject: [PATCH] Allow to set option without value --- src/DomCrawler/Field/ChoiceFormField.php | 11 +++--- .../DomCrawler/Field/ChoiceFormFieldTest.php | 34 +++++++++++++++++++ tests/fixtures/choice-form-field.html | 18 ++++++++++ 3 files changed, 59 insertions(+), 4 deletions(-) diff --git a/src/DomCrawler/Field/ChoiceFormField.php b/src/DomCrawler/Field/ChoiceFormField.php index 0f456059..afd67eef 100644 --- a/src/DomCrawler/Field/ChoiceFormField.php +++ b/src/DomCrawler/Field/ChoiceFormField.php @@ -13,6 +13,7 @@ namespace Symfony\Component\Panther\DomCrawler\Field; +use Facebook\WebDriver\Exception\NoSuchElementException; use Facebook\WebDriver\WebDriverSelect; use Facebook\WebDriver\WebDriverSelectInterface; use Symfony\Component\DomCrawler\Field\ChoiceFormField as BaseChoiceFormField; @@ -42,7 +43,11 @@ public function hasValue(): bool public function select($value): void { foreach ((array) $value as $v) { - $this->selector->selectByValue($v); + try { + $this->selector->selectByValue($v); + } catch (NoSuchElementException) { + $this->selector->selectByVisibleText($v); + } } } @@ -130,9 +135,7 @@ public function setValue($value): void return; } - foreach ((array) $value as $v) { - $this->selector->selectByValue($v); - } + $this->select($value); } public function addChoice(\DOMElement $node): void diff --git a/tests/DomCrawler/Field/ChoiceFormFieldTest.php b/tests/DomCrawler/Field/ChoiceFormFieldTest.php index 2aa39d7d..bb921881 100644 --- a/tests/DomCrawler/Field/ChoiceFormFieldTest.php +++ b/tests/DomCrawler/Field/ChoiceFormFieldTest.php @@ -92,6 +92,40 @@ public function testGetValueFromSelectMultipleIfNoneIsSelected(callable $clientF $this->assertSame([], $field->getValue()); } + /** + * @dataProvider clientFactoryProvider + */ + public function testGetValueFromSelectSingleWithoutValue(callable $clientFactory): void + { + $crawler = $this->request($clientFactory, '/choice-form-field.html'); + $form = $crawler->filter('form')->form(); + + /** @var ChoiceFormField $field */ + $field = $form['select_single_without_value']; + $this->assertInstanceOf(ChoiceFormField::class, $field); + $this->assertSame('none selected', $field->getValue()); + + $field->select('thirty'); + $this->assertEquals('thirty', $field->getValue()); + } + + /** + * @dataProvider clientFactoryProvider + */ + public function testGetValueFromSelectMultipleWithoutValue(callable $clientFactory): void + { + $crawler = $this->request($clientFactory, '/choice-form-field.html'); + $form = $crawler->filter('form')->form(); + + /** @var ChoiceFormField $field */ + $field = $form['select_multiple_without_value']; + $this->assertInstanceOf(ChoiceFormField::class, $field); + $this->assertSame([], $field->getValue()); + + $field->select('thirty'); + $this->assertEquals(['thirty'], $field->getValue()); + } + /** * @dataProvider clientFactoryProvider */ diff --git a/tests/fixtures/choice-form-field.html b/tests/fixtures/choice-form-field.html index ee694383..65d5cf25 100644 --- a/tests/fixtures/choice-form-field.html +++ b/tests/fixtures/choice-form-field.html @@ -60,6 +60,24 @@ + + + +
radio_checked i_am_not_checked