mirror of
				https://github.com/microsoft/playwright.git
				synced 2025-06-26 21:40:17 +00:00 
			
		
		
		
	docs: rename proximity selectors to position selectors (#4975)
This commit is contained in:
		
							parent
							
								
									cb6e4a6657
								
							
						
					
					
						commit
						d62b661cfa
					
				@ -20,7 +20,7 @@ Playwright supports various selector engines:
 | 
			
		||||
    - [`:visible`](#css-extension-visible) pseudo-class
 | 
			
		||||
    - [`:text`](#css-extension-text) pseudo-class
 | 
			
		||||
    - [`:has`](#css-extension-has) and [`:is`](#css-extension-is) pseudo-classes
 | 
			
		||||
    - [Proximity selectors](#css-extension-proximity), for example `button:right-of(article)`
 | 
			
		||||
    - [Position selectors](#css-extension-position), for example `button:right-of(article)`
 | 
			
		||||
  * [XPath] selectors, for example `xpath=//html/body/div`
 | 
			
		||||
  * [id selectors][id], for example `id=sign-in`
 | 
			
		||||
  * [Custom selector engines](./extensibility.md)
 | 
			
		||||
@ -264,13 +264,13 @@ await page.click('button:is(:text("Log in"), :text("Sign in"))');
 | 
			
		||||
await page.click(':light(.article > .header)');
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### CSS extension: proximity
 | 
			
		||||
### CSS extension: position
 | 
			
		||||
 | 
			
		||||
Playwright provides a few proximity selectors based on the page layout. These can be combined with regular CSS for better results, for example `input:right-of(:text("Password"))` matches an input field that is to the right of text "Password".
 | 
			
		||||
Playwright provides position selectors based on the page layout. These can be combined with regular CSS for better results, for example `input:right-of(:text("Password"))` matches an input field that is to the right of text "Password".
 | 
			
		||||
 | 
			
		||||
Note that proximity selectors depend on the page layout and may produce unexpected results. For example, a different element could be matched when layout changes by one pixel.
 | 
			
		||||
Note that position selectors depend on the page layout and may produce unexpected results. For example, a different element could be matched when layout changes by one pixel.
 | 
			
		||||
 | 
			
		||||
Proximity selectors use [bounding client rect](https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect) to compute distance and relative position of the elements.
 | 
			
		||||
Position selectors use [bounding client rect](https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect) to compute distance and relative position of the elements.
 | 
			
		||||
* `:right-of(inner > selector)` - Matches elements that are to the right of any element matching the inner selector.
 | 
			
		||||
* `:left-of(inner > selector)` - Matches elements that are to the left of any element matching the inner selector.
 | 
			
		||||
* `:above(inner > selector)` - Matches elements that are above any of the elements matching the inner selector.
 | 
			
		||||
 | 
			
		||||
@ -58,11 +58,11 @@ export class SelectorEvaluatorImpl implements SelectorEvaluator {
 | 
			
		||||
    this._engines.set('text', textEngine);
 | 
			
		||||
    this._engines.set('text-is', textIsEngine);
 | 
			
		||||
    this._engines.set('text-matches', textMatchesEngine);
 | 
			
		||||
    this._engines.set('right-of', createProximityEngine('right-of', boxRightOf));
 | 
			
		||||
    this._engines.set('left-of', createProximityEngine('left-of', boxLeftOf));
 | 
			
		||||
    this._engines.set('above', createProximityEngine('above', boxAbove));
 | 
			
		||||
    this._engines.set('below', createProximityEngine('below', boxBelow));
 | 
			
		||||
    this._engines.set('near', createProximityEngine('near', boxNear));
 | 
			
		||||
    this._engines.set('right-of', createPositionEngine('right-of', boxRightOf));
 | 
			
		||||
    this._engines.set('left-of', createPositionEngine('left-of', boxLeftOf));
 | 
			
		||||
    this._engines.set('above', createPositionEngine('above', boxAbove));
 | 
			
		||||
    this._engines.set('below', createPositionEngine('below', boxBelow));
 | 
			
		||||
    this._engines.set('near', createPositionEngine('near', boxNear));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // This is the only function we should use for querying, because it does
 | 
			
		||||
@ -489,7 +489,7 @@ function boxNear(box1: DOMRect, box2: DOMRect): number | undefined {
 | 
			
		||||
  return score > kThreshold ? undefined : score;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function createProximityEngine(name: string, scorer: (box1: DOMRect, box2: DOMRect) => number | undefined): SelectorEngine {
 | 
			
		||||
function createPositionEngine(name: string, scorer: (box1: DOMRect, box2: DOMRect) => number | undefined): SelectorEngine {
 | 
			
		||||
  return {
 | 
			
		||||
    matches(element: Element, args: (string | number | Selector)[], context: QueryContext, evaluator: SelectorEvaluator): boolean {
 | 
			
		||||
      if (!args.length)
 | 
			
		||||
 | 
			
		||||
@ -47,7 +47,7 @@ it('should work with :visible', async ({page}) => {
 | 
			
		||||
  expect(await page.$eval('div:visible', div => div.id)).toBe('target2');
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
it('should work with proximity selectors', async ({page}) => {
 | 
			
		||||
it('should work with position selectors', async ({page}) => {
 | 
			
		||||
  /*
 | 
			
		||||
 | 
			
		||||
       +--+  +--+
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user