|
15 | 15 | * limitations under the License.
|
16 | 16 | */
|
17 | 17 |
|
18 |
| -module.exports.describe = function({testRunner, expect, product, FFOX, CHROMIUM, WEBKIT}) { |
| 18 | +module.exports.describe = function({testRunner, expect, selectors, FFOX, CHROMIUM, WEBKIT}) { |
19 | 19 | const {describe, xdescribe, fdescribe} = testRunner;
|
20 | 20 | const {it, fit, xit, dit} = testRunner;
|
21 | 21 | const {beforeAll, beforeEach, afterAll, afterEach} = testRunner;
|
@@ -393,28 +393,28 @@ module.exports.describe = function({testRunner, expect, product, FFOX, CHROMIUM,
|
393 | 393 |
|
394 | 394 | it('create', async ({page}) => {
|
395 | 395 | await page.setContent(`<div>yo</div><div>ya</div><div>ya</div>`);
|
396 |
| - expect(await page._createSelector('zs', await page.$('div'))).toBe('"yo"'); |
397 |
| - expect(await page._createSelector('zs', await page.$('div:nth-child(2)'))).toBe('"ya"'); |
398 |
| - expect(await page._createSelector('zs', await page.$('div:nth-child(3)'))).toBe('"ya"#1'); |
| 396 | + expect(await selectors._createSelector('zs', await page.$('div'))).toBe('"yo"'); |
| 397 | + expect(await selectors._createSelector('zs', await page.$('div:nth-child(2)'))).toBe('"ya"'); |
| 398 | + expect(await selectors._createSelector('zs', await page.$('div:nth-child(3)'))).toBe('"ya"#1'); |
399 | 399 |
|
400 | 400 | await page.setContent(`<img alt="foo bar">`);
|
401 |
| - expect(await page._createSelector('zs', await page.$('img'))).toBe('img[alt="foo bar"]'); |
| 401 | + expect(await selectors._createSelector('zs', await page.$('img'))).toBe('img[alt="foo bar"]'); |
402 | 402 |
|
403 | 403 | await page.setContent(`<div>yo<span></span></div><span></span>`);
|
404 |
| - expect(await page._createSelector('zs', await page.$('span'))).toBe('"yo"~SPAN'); |
405 |
| - expect(await page._createSelector('zs', await page.$('span:nth-child(2)'))).toBe('SPAN#1'); |
| 404 | + expect(await selectors._createSelector('zs', await page.$('span'))).toBe('"yo"~SPAN'); |
| 405 | + expect(await selectors._createSelector('zs', await page.$('span:nth-child(2)'))).toBe('SPAN#1'); |
406 | 406 | });
|
407 | 407 |
|
408 | 408 | it('children of various display parents', async ({page}) => {
|
409 | 409 | await page.setContent(`<body><div style='position: fixed;'><span>yo</span></div></body>`);
|
410 |
| - expect(await page._createSelector('zs', await page.$('span'))).toBe('"yo"'); |
| 410 | + expect(await selectors._createSelector('zs', await page.$('span'))).toBe('"yo"'); |
411 | 411 |
|
412 | 412 | await page.setContent(`<div style='position: relative;'><span>yo</span></div>`);
|
413 |
| - expect(await page._createSelector('zs', await page.$('span'))).toBe('"yo"'); |
| 413 | + expect(await selectors._createSelector('zs', await page.$('span'))).toBe('"yo"'); |
414 | 414 |
|
415 | 415 | // "display: none" makes all children text invisible - fallback to tag name.
|
416 | 416 | await page.setContent(`<div style='display: none;'><span>yo</span></div>`);
|
417 |
| - expect(await page._createSelector('zs', await page.$('span'))).toBe('SPAN'); |
| 417 | + expect(await selectors._createSelector('zs', await page.$('span'))).toBe('SPAN'); |
418 | 418 | });
|
419 | 419 |
|
420 | 420 | it('boundary', async ({page}) => {
|
@@ -465,7 +465,7 @@ module.exports.describe = function({testRunner, expect, product, FFOX, CHROMIUM,
|
465 | 465 | <div id=target2>hello</div>
|
466 | 466 | </div>
|
467 | 467 | </div>`);
|
468 |
| - expect(await page._createSelector('zs', await page.$('#target'))).toBe('"ya"~"hey"~"hello"'); |
| 468 | + expect(await selectors._createSelector('zs', await page.$('#target'))).toBe('"ya"~"hey"~"hello"'); |
469 | 469 | expect(await page.$eval(`zs="ya"~"hey"~"hello"`, e => e.outerHTML)).toBe('<div id="target">hello</div>');
|
470 | 470 | expect(await page.$eval(`zs="ya"~"hey"~"unique"`, e => e.outerHTML).catch(e => e.message)).toBe('Error: failed to find element matching selector "zs="ya"~"hey"~"unique""');
|
471 | 471 | expect(await page.$$eval(`zs="ya" ~ "hey" ~ "hello"`, es => es.map(e => e.outerHTML).join('\n'))).toBe('<div id="target">hello</div>\n<div id="target2">hello</div>');
|
@@ -498,18 +498,63 @@ module.exports.describe = function({testRunner, expect, product, FFOX, CHROMIUM,
|
498 | 498 |
|
499 | 499 | it('create', async ({page}) => {
|
500 | 500 | await page.setContent(`<div>yo</div><div>"ya</div><div>ye ye</div>`);
|
501 |
| - expect(await page._createSelector('text', await page.$('div'))).toBe('yo'); |
502 |
| - expect(await page._createSelector('text', await page.$('div:nth-child(2)'))).toBe('"\\"ya"'); |
503 |
| - expect(await page._createSelector('text', await page.$('div:nth-child(3)'))).toBe('"ye ye"'); |
| 501 | + expect(await selectors._createSelector('text', await page.$('div'))).toBe('yo'); |
| 502 | + expect(await selectors._createSelector('text', await page.$('div:nth-child(2)'))).toBe('"\\"ya"'); |
| 503 | + expect(await selectors._createSelector('text', await page.$('div:nth-child(3)'))).toBe('"ye ye"'); |
504 | 504 |
|
505 | 505 | await page.setContent(`<div>yo</div><div>yo<div>ya</div>hey</div>`);
|
506 |
| - expect(await page._createSelector('text', await page.$('div:nth-child(2)'))).toBe('hey'); |
| 506 | + expect(await selectors._createSelector('text', await page.$('div:nth-child(2)'))).toBe('hey'); |
507 | 507 |
|
508 | 508 | await page.setContent(`<div> yo <div></div>ya</div>`);
|
509 |
| - expect(await page._createSelector('text', await page.$('div'))).toBe('yo'); |
| 509 | + expect(await selectors._createSelector('text', await page.$('div'))).toBe('yo'); |
510 | 510 |
|
511 | 511 | await page.setContent(`<div> "yo <div></div>ya</div>`);
|
512 |
| - expect(await page._createSelector('text', await page.$('div'))).toBe('" \\"yo "'); |
| 512 | + expect(await selectors._createSelector('text', await page.$('div'))).toBe('" \\"yo "'); |
| 513 | + }); |
| 514 | + }); |
| 515 | + |
| 516 | + describe('selectors.register', () => { |
| 517 | + it('should work', async ({page}) => { |
| 518 | + const createTagSelector = () => ({ |
| 519 | + name: 'tag', |
| 520 | + create(root, target) { |
| 521 | + return target.nodeName; |
| 522 | + }, |
| 523 | + query(root, selector) { |
| 524 | + return root.querySelector(selector); |
| 525 | + }, |
| 526 | + queryAll(root, selector) { |
| 527 | + return Array.from(root.querySelectorAll(selector)); |
| 528 | + } |
| 529 | + }); |
| 530 | + await selectors.register(`(${createTagSelector.toString()})()`); |
| 531 | + await page.setContent('<div><span></span></div><div></div>'); |
| 532 | + expect(await selectors._createSelector('tag', await page.$('div'))).toBe('DIV'); |
| 533 | + expect(await page.$eval('tag=DIV', e => e.nodeName)).toBe('DIV'); |
| 534 | + expect(await page.$eval('tag=SPAN', e => e.nodeName)).toBe('SPAN'); |
| 535 | + expect(await page.$$eval('tag=DIV', es => es.length)).toBe(2); |
| 536 | + }); |
| 537 | + it('should update', async ({page}) => { |
| 538 | + await page.setContent('<div><dummy id=d1></dummy></div><span><dummy id=d2></dummy></span>'); |
| 539 | + expect(await page.$eval('div', e => e.nodeName)).toBe('DIV'); |
| 540 | + const error = await page.$('dummy=foo').catch(e => e); |
| 541 | + expect(error.message).toContain('Unknown engine dummy while parsing selector dummy=foo'); |
| 542 | + await selectors.register(` |
| 543 | + ({ |
| 544 | + name: 'dummy', |
| 545 | + create(root, target) { |
| 546 | + return target.nodeName; |
| 547 | + }, |
| 548 | + query(root, selector) { |
| 549 | + return root.querySelector('dummy'); |
| 550 | + }, |
| 551 | + queryAll(root, selector) { |
| 552 | + return Array.from(root.querySelectorAll('dummy')); |
| 553 | + } |
| 554 | + }) |
| 555 | + `); |
| 556 | + expect(await page.$eval('dummy=foo', e => e.id)).toBe('d1'); |
| 557 | + expect(await page.$eval('css=span >> dummy=foo', e => e.id)).toBe('d2'); |
513 | 558 | });
|
514 | 559 | });
|
515 | 560 | };
|
0 commit comments