diff --git a/javascript/selenium-webdriver/lib/webdriver.js b/javascript/selenium-webdriver/lib/webdriver.js index b2059de816491..7ac879126269a 100644 --- a/javascript/selenium-webdriver/lib/webdriver.js +++ b/javascript/selenium-webdriver/lib/webdriver.js @@ -1045,6 +1045,9 @@ class WebDriver { async findElementInternal_(locatorFn, context) { let result = await locatorFn(context) if (Array.isArray(result)) { + if (result.length === 0) { + throw new NoSuchElementError('Cannot locate an element with provided parameters') + } result = result[0] } if (!(result instanceof WebElement)) { @@ -1088,7 +1091,15 @@ class WebDriver { * @private */ async findElementsInternal_(locatorFn, context) { - const result = await locatorFn(context) + let result + try { + result = await locatorFn(context) + } catch (ex) { + if (ex instanceof NoSuchElementError) { + return [] + } + throw ex + } if (result instanceof WebElement) { return [result] } diff --git a/javascript/selenium-webdriver/test/lib/webdriver_test.js b/javascript/selenium-webdriver/test/lib/webdriver_test.js index 419fdf6f80212..ff6ed7b5b1c0b 100644 --- a/javascript/selenium-webdriver/test/lib/webdriver_test.js +++ b/javascript/selenium-webdriver/test/lib/webdriver_test.js @@ -726,6 +726,15 @@ describe('WebDriver', function () { assert.strictEqual('Custom locator did not return a WebElement', e.message) }) }) + + it('customLocatorThrowsNoSuchElementErrorForEmptyArray', function () { + const driver = new FakeExecutor().createDriver() + return driver + .findElement((_) => []) + .then(assert.fail, function (e) { + assertIsInstance(error.NoSuchElementError, e) + }) + }) }) describe('findElements', function () { @@ -854,6 +863,20 @@ describe('WebDriver', function () { }) .then((actual) => assert.deepStrictEqual(['one', 'two'], actual)) }) + + it('customLocatorReturnsEmptyArrayForNoSuchElementError', function () { + const driver = new FakeExecutor().createDriver() + return driver + .findElements((_) => { + throw new error.NoSuchElementError() + }) + .then((actual) => assert.deepStrictEqual([], actual)) + }) + + it('customLocatorPropagatesUnexpectedErrors', function () { + const driver = new FakeExecutor().createDriver() + return driver.findElements(throwStubError).then(assert.fail, assertIsStubError) + }) }) describe('sendKeys', function () {