MOBILE-3934 behat: Implement within locator
				
					
				
			This commit is contained in:
		
							parent
							
								
									7b4975b48f
								
							
						
					
					
						commit
						bf2ae1ece7
					
				| @ -345,6 +345,26 @@ | ||||
|         return element.parentElement || (element.getRootNode() && element.getRootNode().host) || null; | ||||
|     }; | ||||
| 
 | ||||
|     /** | ||||
|      * Get closest element matching a selector, without traversing up a given container. | ||||
|      * | ||||
|      * @param {HTMLElement} element Element. | ||||
|      * @param {string} selector Selector. | ||||
|      * @param {HTMLElement} container Topmost container to search within. | ||||
|      * @return {HTMLElement} Closest matching element. | ||||
|      */ | ||||
|     const getClosestMatching = function(element, selector, container) { | ||||
|         if (element.matches(selector)) { | ||||
|             return element; | ||||
|         } | ||||
| 
 | ||||
|         if (element === container || !element.parentElement) { | ||||
|             return null; | ||||
|         } | ||||
| 
 | ||||
|         return getClosestMatching(element.parentElement, selector, container); | ||||
|     }; | ||||
| 
 | ||||
|     /** | ||||
|      * Function to find elements based on their text or Aria label. | ||||
|      * | ||||
| @ -361,6 +381,24 @@ | ||||
| 
 | ||||
|         let container = topContainer; | ||||
| 
 | ||||
|         if (locator.within) { | ||||
|             const withinElements = findElementsBasedOnText(locator.within); | ||||
| 
 | ||||
|             if (withinElements.length === 0) { | ||||
|                 throw new Error('There was no match for within text') | ||||
|             } else if (withinElements.length > 1) { | ||||
|                 const withinElementsAncestors = getTopAncestors(withinElements); | ||||
| 
 | ||||
|                 if (withinElementsAncestors.length > 1) { | ||||
|                     throw new Error('Too many matches for within text'); | ||||
|                 } | ||||
| 
 | ||||
|                 topContainer = container = withinElementsAncestors[0]; | ||||
|             } else { | ||||
|                 topContainer = container = withinElements[0]; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         if (topContainer && locator.near) { | ||||
|             const nearElements = findElementsBasedOnText(locator.near); | ||||
| 
 | ||||
| @ -382,7 +420,7 @@ | ||||
|         do { | ||||
|             const elements = findElementsBasedOnTextWithin(container, locator.text); | ||||
|             const filteredElements = locator.selector | ||||
|                 ? elements.filter(element => element.matches(locator.selector)) | ||||
|                 ? elements.map(element => getClosestMatching(element, locator.selector, container)).filter(element => !!element) | ||||
|                 : elements; | ||||
| 
 | ||||
|             if (filteredElements.length > 0) { | ||||
|  | ||||
| @ -1020,7 +1020,7 @@ class behat_app extends behat_base { | ||||
|      * @return object | ||||
|      */ | ||||
|     public function parse_element_locator(string $text): object { | ||||
|         preg_match('/^"((?:[^"]|\\")*?)"(?: "([^"]*?)")?(?: near "((?:[^"]|\\")*?)"(?: "([^"]*?)")?)?$/', $text, $matches); | ||||
|         preg_match('/^"((?:[^"]|\\")*?)"(?: "([^"]*?)")?(?: (near|within) "((?:[^"]|\\")*?)"(?: "([^"]*?)")?)?$/', $text, $matches); | ||||
| 
 | ||||
|         $locator = [ | ||||
|             'text' => str_replace('\\"', '"', $matches[1]), | ||||
| @ -1028,9 +1028,9 @@ class behat_app extends behat_base { | ||||
|         ]; | ||||
| 
 | ||||
|         if (!empty($matches[3])) { | ||||
|             $locator['near'] = (object) [ | ||||
|                 'text' => str_replace('\\"', '"', $matches[3]), | ||||
|                 'selector' => $matches[4] ?? null, | ||||
|             $locator[$matches[3]] = (object) [ | ||||
|                 'text' => str_replace('\\"', '"', $matches[4]), | ||||
|                 'selector' => $matches[5] ?? null, | ||||
|             ]; | ||||
|         } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user