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 @@ + + + +