mirror of
				https://github.com/microsoft/playwright.git
				synced 2025-06-26 21:40:17 +00:00 
			
		
		
		
	fix(selectors): continue matching after first fail for combined selectors (#1185)
This commit is contained in:
		
							parent
							
								
									342e79c5b4
								
							
						
					
					
						commit
						342a2cf5cc
					
				| @ -68,14 +68,20 @@ class Injected { | |||||||
|     const parsed = this._parseSelector(selector); |     const parsed = this._parseSelector(selector); | ||||||
|     if (!(root as any)['querySelector']) |     if (!(root as any)['querySelector']) | ||||||
|       throw new Error('Node is not queryable.'); |       throw new Error('Node is not queryable.'); | ||||||
|     let element = root as SelectorRoot; |     return this._querySelectorRecursively(root as SelectorRoot, parsed, 0); | ||||||
|     for (const { engine, selector } of parsed) { |   } | ||||||
|       const next = engine.query((element as Element).shadowRoot || element, selector); | 
 | ||||||
|       if (!next) |   private _querySelectorRecursively(root: SelectorRoot, parsed: ParsedSelector, index: number): Element | undefined { | ||||||
|         return; |     const current = parsed[index]; | ||||||
|       element = next; |     root = (root as Element).shadowRoot || root; | ||||||
|  |     if (index === parsed.length - 1) | ||||||
|  |       return current.engine.query(root, current.selector); | ||||||
|  |     const all = current.engine.queryAll(root, current.selector); | ||||||
|  |     for (const next of all) { | ||||||
|  |       const result = this._querySelectorRecursively(next, parsed, index + 1); | ||||||
|  |       if (result) | ||||||
|  |         return result; | ||||||
|     } |     } | ||||||
|     return element as Element; |  | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   querySelectorAll(selector: string, root: Node): Element[] { |   querySelectorAll(selector: string, root: Node): Element[] { | ||||||
|  | |||||||
| @ -126,6 +126,11 @@ module.exports.describe = function({testRunner, expect, selectors, FFOX, CHROMIU | |||||||
|       const text4 = await page.$eval('xpath=/html/body/section/div >> css=div >> css=span', e => e.textContent); |       const text4 = await page.$eval('xpath=/html/body/section/div >> css=div >> css=span', e => e.textContent); | ||||||
|       expect(text4).toBe('Hello from root2'); |       expect(text4).toBe('Hello from root2'); | ||||||
|     }); |     }); | ||||||
|  |     it('should not stop at first failure with >> syntax', async({page, server}) => { | ||||||
|  |       await page.setContent('<div><span>Next</span><button>Previous</button><button>Next</button></div>'); | ||||||
|  |       const html = await page.$eval('button >> "Next"', e => e.outerHTML); | ||||||
|  |       expect(html).toBe('<button>Next</button>'); | ||||||
|  |     }); | ||||||
|   }); |   }); | ||||||
| 
 | 
 | ||||||
|   describe('Page.$$eval', function() { |   describe('Page.$$eval', function() { | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Dmitry Gozman
						Dmitry Gozman