From f7ac67a064a74b862267ebbdc7b4e9cb82ebae35 Mon Sep 17 00:00:00 2001 From: Kevin Bond Date: Wed, 7 Feb 2024 12:29:09 -0500 Subject: [PATCH] feat: Allow `selectFieldOptions` to deselect all values (#143) Co-authored-by: Floran Brutel --- README.md | 1 + src/Browser.php | 6 ++++++ src/Browser/Session/Driver/PantherDriver.php | 4 ++++ tests/BrowserTests.php | 4 ++++ 4 files changed, 15 insertions(+) diff --git a/README.md b/README.md index 9d7a86d..9bc9a0d 100644 --- a/README.md +++ b/README.md @@ -142,6 +142,7 @@ $browser ->selectField('Canada') // "radio" select ->selectField('Type', 'Employee') // "select" single option ->selectField('Notification', ['Email', 'SMS']) // "select" multiple options + ->selectField('Notification', []) // "un-select" all multiple options ->attachFile('Photo', '/path/to/photo.jpg') ->attachFile('Photo', ['/path/to/photo1.jpg', '/path/to/photo2.jpg']) // attach multiple files (if field supports this) ->click('Submit') diff --git a/src/Browser.php b/src/Browser.php index ff9cbf2..bb83e75 100644 --- a/src/Browser.php +++ b/src/Browser.php @@ -281,6 +281,12 @@ final public function selectFieldOption(string $selector, string $value): self */ final public function selectFieldOptions(string $selector, array $values): self { + if (!$values) { + $this->session->page()->fillField($selector, $values); + + return $this; + } + foreach ($values as $value) { $this->session()->page()->selectFieldOption($selector, $value, true); } diff --git a/src/Browser/Session/Driver/PantherDriver.php b/src/Browser/Session/Driver/PantherDriver.php index 34eebf6..1c15927 100644 --- a/src/Browser/Session/Driver/PantherDriver.php +++ b/src/Browser/Session/Driver/PantherDriver.php @@ -118,6 +118,10 @@ public function setValue($xpath, $value): void $element = $this->crawlerElement($this->filteredCrawler($xpath)); $jsNode = $this->jsNode($xpath); + if (!$value && 'select' === $element->getTagName() && $element->getAttribute('multiple')) { + $this->executeScript(\sprintf('%s.selectedIndex = -1', $jsNode)); + } + if ('input' === $element->getTagName() && \in_array($element->getAttribute('type'), ['date', 'time', 'color'])) { $this->executeScript(\sprintf('%s.value = \'%s\'', $jsNode, $value)); } else { diff --git a/tests/BrowserTests.php b/tests/BrowserTests.php index e332a76..8738fee 100644 --- a/tests/BrowserTests.php +++ b/tests/BrowserTests.php @@ -389,6 +389,7 @@ public function form_actions_by_field_label(): void ->selectFieldOption('Input 4', 'option 2') ->attachFile('Input 5', new \SplFileInfo(__FILE__)) ->selectFieldOptions('Input 6', ['option 1', 'option 3']) + ->selectFieldOptions('Input 7', []) ->checkField('Radio 3') ->click('Submit') ->assertOn('/submit-form') @@ -398,6 +399,7 @@ public function form_actions_by_field_label(): void ->assertContains('"input_4":"option 2"') ->assertContains(\sprintf('"input_5":"%s"', \pathinfo(__FILE__, \PATHINFO_BASENAME))) ->assertContains('"input_6":["option 1","option 3"]') + ->assertNotContains('"input_7') ->assertContains('"input_8":"option 3"') ; } @@ -415,6 +417,7 @@ public function form_actions_by_field_id(): void ->selectFieldOption('input4', 'option 2') ->attachFile('input5', __FILE__) ->selectFieldOptions('input6', ['option 1', 'option 3']) + ->selectFieldOptions('input7', []) ->checkField('radio3') ->click('Submit') ->assertOn('/submit-form') @@ -424,6 +427,7 @@ public function form_actions_by_field_id(): void ->assertContains('"input_4":"option 2"') ->assertContains(\sprintf('"input_5":"%s"', \pathinfo(__FILE__, \PATHINFO_BASENAME))) ->assertContains('"input_6":["option 1","option 3"]') + ->assertNotContains('"input_7') ->assertContains('"input_8":"option 3"') ; }