From 0269af86422502c1dcdadc4fe8f15f36de3fd101 Mon Sep 17 00:00:00 2001 From: Robert Kerr Date: Mon, 6 Feb 2017 17:47:46 +1100 Subject: [PATCH 1/4] No longer cycles through different options - just selects the first one. --- lib/helper/Nightmare.js | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/lib/helper/Nightmare.js b/lib/helper/Nightmare.js index 0034052bd..e5fc22c69 100644 --- a/lib/helper/Nightmare.js +++ b/lib/helper/Nightmare.js @@ -649,16 +649,14 @@ class Nightmare extends Helper { selectOption(select, option) { let fetchAndCheckOption = function (el, locator) { el = codeceptjs.fetchElement(el); - let found = document.evaluate(locator, el, null, 5); - var current = null; - while (current = found.iterateNext()) { - current.selected = true; - var event = document.createEvent('HTMLEvents'); - if (!el.multiple) el.value = current.value; - event.initEvent('change', true, true); - el.dispatchEvent(event); - } - return !!current; + let found = document.evaluate(locator, el, null, 5, null); + var option = found.iterateNext(); + option.selected = true; + var event = document.createEvent('HTMLEvents'); + if (!el.multiple) el.value = option.value; + event.initEvent('change', true, true); + el.dispatchEvent(event); + return !!option; }; let browser = this.browser; return co(findFields(this.browser, select)).then(co.wrap(function*(fields) { From cf9959247da9c6feaf7035e7632c94bacdf56477 Mon Sep 17 00:00:00 2001 From: Robert Kerr Date: Mon, 20 Feb 2017 10:49:47 +1100 Subject: [PATCH 2/4] Fixed to pass existing tests and added a new test requiring changes. --- lib/helper/Nightmare.js | 23 +++++++++++++------- test/data/app/view/form/select_new.php | 29 ++++++++++++++++++++++++++ test/helper/webapi.js | 9 ++++++++ 3 files changed, 53 insertions(+), 8 deletions(-) create mode 100644 test/data/app/view/form/select_new.php diff --git a/lib/helper/Nightmare.js b/lib/helper/Nightmare.js index e5fc22c69..64fdba545 100644 --- a/lib/helper/Nightmare.js +++ b/lib/helper/Nightmare.js @@ -649,14 +649,21 @@ class Nightmare extends Helper { selectOption(select, option) { let fetchAndCheckOption = function (el, locator) { el = codeceptjs.fetchElement(el); - let found = document.evaluate(locator, el, null, 5, null); - var option = found.iterateNext(); - option.selected = true; - var event = document.createEvent('HTMLEvents'); - if (!el.multiple) el.value = option.value; - event.initEvent('change', true, true); - el.dispatchEvent(event); - return !!option; + let found = document.evaluate(locator, el, null, 5); + var current = null; + var items = []; + while (current = found.iterateNext()) { + items.push(current); + } + for (var i = 0; i < items.length; items++) { + current = items[i]; + current.selected = true; + var event = document.createEvent('HTMLEvents'); + if (!el.multiple) el.value = current.value; + event.initEvent('change', true, true); + el.dispatchEvent(event); + } + return !!current; }; let browser = this.browser; return co(findFields(this.browser, select)).then(co.wrap(function*(fields) { diff --git a/test/data/app/view/form/select_new.php b/test/data/app/view/form/select_new.php new file mode 100644 index 000000000..7f12582ad --- /dev/null +++ b/test/data/app/view/form/select_new.php @@ -0,0 +1,29 @@ + + +
+ + +
+ + + diff --git a/test/helper/webapi.js b/test/helper/webapi.js index 88dac31b8..950454c61 100644 --- a/test/helper/webapi.js +++ b/test/helper/webapi.js @@ -219,6 +219,15 @@ module.exports.tests = function() { return assert.equal(formContents('age'), 'adult'); }); + it('should select option by label and option text - should break', function*() { + yield I.amOnPage('/form/select_new'); + yield I.selectOption('Select a value', 'Option 2'); + // yield I.selectOption('Select a value', 'Option 1'); + yield I.click('Submit'); + yield I.waitForText('Welcome to test app!'); + return assert.equal(formContents('select'), 'option2'); + }); + it('should select multiple options', function*() { yield I.amOnPage('/form/select_multiple'); yield I.selectOption('What do you like the most?', ['Play Video Games', 'Have Sex']); From 592e08a5c5ba01275dc8fab8270d779804057d89 Mon Sep 17 00:00:00 2001 From: Robert Kerr Date: Mon, 20 Feb 2017 10:52:08 +1100 Subject: [PATCH 3/4] Tidied up the new test. --- test/helper/webapi.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/helper/webapi.js b/test/helper/webapi.js index 950454c61..da39805d2 100644 --- a/test/helper/webapi.js +++ b/test/helper/webapi.js @@ -222,9 +222,7 @@ module.exports.tests = function() { it('should select option by label and option text - should break', function*() { yield I.amOnPage('/form/select_new'); yield I.selectOption('Select a value', 'Option 2'); - // yield I.selectOption('Select a value', 'Option 1'); yield I.click('Submit'); - yield I.waitForText('Welcome to test app!'); return assert.equal(formContents('select'), 'option2'); }); From b0e364c8b3edf791acdd34d510adafbcac741796 Mon Sep 17 00:00:00 2001 From: Robert Kerr Date: Mon, 20 Feb 2017 10:54:40 +1100 Subject: [PATCH 4/4] More tidying of new test. --- .../app/view/form/{select_new.php => select_onchange.php} | 0 test/helper/webapi.js | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename test/data/app/view/form/{select_new.php => select_onchange.php} (100%) diff --git a/test/data/app/view/form/select_new.php b/test/data/app/view/form/select_onchange.php similarity index 100% rename from test/data/app/view/form/select_new.php rename to test/data/app/view/form/select_onchange.php diff --git a/test/helper/webapi.js b/test/helper/webapi.js index da39805d2..048df667d 100644 --- a/test/helper/webapi.js +++ b/test/helper/webapi.js @@ -219,8 +219,8 @@ module.exports.tests = function() { return assert.equal(formContents('age'), 'adult'); }); - it('should select option by label and option text - should break', function*() { - yield I.amOnPage('/form/select_new'); + it('should select option by label and option text - with an onchange callback', function*() { + yield I.amOnPage('/form/select_onchange'); yield I.selectOption('Select a value', 'Option 2'); yield I.click('Submit'); return assert.equal(formContents('select'), 'option2');