From fab6064602b2ab5bb35d971bf8a200aa57c32f61 Mon Sep 17 00:00:00 2001 From: ismail codar Date: Wed, 9 Jan 2019 14:41:16 +0300 Subject: [PATCH 1/4] Use innerText rather than textContent for label queries. label.textContent usage is problematic for select box in label --- src/queries.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/queries.js b/src/queries.js index e5393222..cf8badcc 100644 --- a/src/queries.js +++ b/src/queries.js @@ -20,7 +20,7 @@ function queryAllLabelsByText( const matcher = exact ? matches : fuzzyMatches const matchNormalizer = makeNormalizer({collapseWhitespace, trim, normalizer}) return Array.from(container.querySelectorAll('label')).filter(label => - matcher(label.textContent, label, text, matchNormalizer), + matcher(label.innerText || label.textContent, label, text, matchNormalizer), ) } From 8d81c51ad8d7a6596af43ac57900f16f7b8655b0 Mon Sep 17 00:00:00 2001 From: ismail codar Date: Thu, 10 Jan 2019 08:21:28 +0300 Subject: [PATCH 2/4] Using getNodeText getNodeText(label) is results to label.innerText --- src/queries.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/queries.js b/src/queries.js index cf8badcc..1df2a918 100644 --- a/src/queries.js +++ b/src/queries.js @@ -20,7 +20,7 @@ function queryAllLabelsByText( const matcher = exact ? matches : fuzzyMatches const matchNormalizer = makeNormalizer({collapseWhitespace, trim, normalizer}) return Array.from(container.querySelectorAll('label')).filter(label => - matcher(label.innerText || label.textContent, label, text, matchNormalizer), + matcher(getNodeText(label), label, text, matchNormalizer), ) } From b0ae02caebff06ef33dfa87d563888fb5007ea46 Mon Sep 17 00:00:00 2001 From: ismail codar Date: Thu, 10 Jan 2019 11:20:29 +0300 Subject: [PATCH 3/4] elements-inside-label test added --- src/__tests__/elements-inside-label.js | 37 ++++++++++++++++++++++++++ src/get-node-text.js | 20 ++++++++------ 2 files changed, 49 insertions(+), 8 deletions(-) create mode 100644 src/__tests__/elements-inside-label.js diff --git a/src/__tests__/elements-inside-label.js b/src/__tests__/elements-inside-label.js new file mode 100644 index 00000000..230c530b --- /dev/null +++ b/src/__tests__/elements-inside-label.js @@ -0,0 +1,37 @@ +// query utilities: +import {getByLabelText} from '../' +import document from './helpers/document' + +function getExampleDOM() { + const div = document.createElement('div') + div.innerHTML = ` + + + + ` + return div +} + +test('elements inside label', () => { + const container = getExampleDOM() + + const element1 = getByLabelText(container, 'Cars') + expect(element1.tagName).toBe('SELECT') + + // this fails because getNodeText function returns incorrect result on JSDOM but it good for browser + // const element2 = getByLabelText(container, 'States'); + // expect(element2.tagName).toBe('SELECT'); + + const element3 = getByLabelText(container, 'I agree to terms') + expect(element3.value).toBe('1') +}) diff --git a/src/get-node-text.js b/src/get-node-text.js index 82af6b67..658617dc 100644 --- a/src/get-node-text.js +++ b/src/get-node-text.js @@ -2,16 +2,20 @@ function getNodeText(node) { const window = node.ownerDocument.defaultView if (node.matches('input[type=submit], input[type=button]')) { - return node.value; + return node.value } - return Array.from(node.childNodes) - .filter( - child => - child.nodeType === window.Node.TEXT_NODE && Boolean(child.textContent), - ) - .map(c => c.textContent) - .join('') + return ( + node.innerText || + Array.from(node.childNodes) + .filter( + child => + child.nodeType === window.Node.TEXT_NODE && + Boolean(child.textContent), + ) + .map(c => c.textContent) + .join('') + ) } export {getNodeText} From c148ce3d8c126c12a083437f883f869d696dc38e Mon Sep 17 00:00:00 2001 From: ismail codar Date: Thu, 10 Jan 2019 12:32:44 +0300 Subject: [PATCH 4/4] Removed code formatting