Skip to content

Commit 8aab725

Browse files
authored
fix(css selector): properly parse quoted attributes when querying in shadow (#2007)
1 parent d8cccbd commit 8aab725

File tree

2 files changed

+29
-0
lines changed

2 files changed

+29
-0
lines changed

src/injected/cssSelectorEngine.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,9 @@ function split(selector: string): string[] {
201201
} else if (c === quote) {
202202
quote = undefined;
203203
index++;
204+
} else if (c === '\'' || c === '"') {
205+
quote = c;
206+
index++;
204207
} else {
205208
index++;
206209
}

test/queryselector.spec.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,32 @@ describe('Page.$eval', function() {
147147
expect(await page.$eval(`div >> [placeholder="Select date"]`, e => e.outerHTML)).toBe('<input placeholder="Select date">');
148148
expect(await page.$eval(`div >> [placeholder='Select date']`, e => e.outerHTML)).toBe('<input placeholder="Select date">');
149149
});
150+
it('should work with quotes in css attributes', async({page, server}) => {
151+
await page.setContent('<div><input placeholder="Select&quot;date"></div>');
152+
expect(await page.$(`[placeholder="Select\\"date"]`)).toBeTruthy();
153+
expect(await page.$(`[placeholder='Select"date']`)).toBeTruthy();
154+
await page.setContent('<div><input placeholder="Select &quot; date"></div>');
155+
expect(await page.$(`[placeholder="Select \\" date"]`)).toBeTruthy();
156+
expect(await page.$(`[placeholder='Select " date']`)).toBeTruthy();
157+
await page.setContent('<div><input placeholder="Select&apos;date"></div>');
158+
expect(await page.$(`[placeholder="Select'date"]`)).toBeTruthy();
159+
expect(await page.$(`[placeholder='Select\\'date']`)).toBeTruthy();
160+
await page.setContent('<div><input placeholder="Select &apos; date"></div>');
161+
expect(await page.$(`[placeholder="Select ' date"]`)).toBeTruthy();
162+
expect(await page.$(`[placeholder='Select \\' date']`)).toBeTruthy();
163+
});
164+
it('should work with spaces in css attributes when missing', async({page, server}) => {
165+
const inputPromise = page.waitForSelector(`[placeholder="Select date"]`);
166+
expect(await page.$(`[placeholder="Select date"]`)).toBe(null);
167+
await page.setContent('<div><input placeholder="Select date"></div>');
168+
await inputPromise;
169+
});
170+
it('should work with quotes in css attributes when missing', async({page, server}) => {
171+
const inputPromise = page.waitForSelector(`[placeholder="Select\\"date"]`);
172+
expect(await page.$(`[placeholder="Select\\"date"]`)).toBe(null);
173+
await page.setContent('<div><input placeholder="Select&quot;date"></div>');
174+
await inputPromise;
175+
});
150176
});
151177

152178
describe('Page.$$eval', function() {

0 commit comments

Comments
 (0)