File tree 6 files changed +93
-0
lines changed
6 files changed +93
-0
lines changed Original file line number Diff line number Diff line change @@ -54,6 +54,7 @@ These rules enforce some of the [best practices recommended for using Cypress](h
54
54
| [ no-force] ( docs/rules/no-force.md ) | disallow using ` force: true ` with action commands | |
55
55
| [ no-pause] ( docs/rules/no-pause.md ) | disallow using ` cy.pause() ` calls | |
56
56
| [ no-unnecessary-waiting] ( docs/rules/no-unnecessary-waiting.md ) | disallow waiting for arbitrary time periods | ✅ |
57
+ | [ no-xpath] ( docs/rules/no-xpath.md ) | disallow using ` cy.xpath() ` calls | |
57
58
| [ require-data-selectors] ( docs/rules/require-data-selectors.md ) | require ` data-* ` attribute selectors | |
58
59
| [ unsafe-to-chain-command] ( docs/rules/unsafe-to-chain-command.md ) | disallow actions within chains | ✅ |
59
60
Original file line number Diff line number Diff line change
1
+ # Disallow using ` cy.xpath() ` calls (` cypress/no-xpath ` )
2
+
3
+ <!-- end auto-generated rule header -->
4
+
5
+ This rule disallows the usage of ` cy.xpath() ` for selecting elements.
6
+
7
+ ## Rule Details
8
+
9
+ Examples of ** incorrect** code for this rule:
10
+
11
+ ``` js
12
+ cy .xpath (' //div[@class=\" container\" ]' ).click ()
13
+ ```
14
+
15
+ Examples of ** correct** code for this rule:
16
+
17
+ ``` js
18
+ cy .get (' [data-cy="container"]' ).click ();
19
+ ```
20
+
21
+ ## Further Reading
22
+
23
+ Both ` @cypress/xpath ` and ` cypress-xpath ` are deprecated.
24
+
25
+ See [ the Cypress Best Practices guide] ( https://docs.cypress.io/guides/references/best-practices.html#Selecting-Elements ) .
Original file line number Diff line number Diff line change @@ -12,6 +12,7 @@ module.exports = {
12
12
'no-force' : require ( './lib/rules/no-force' ) ,
13
13
'no-pause' : require ( './lib/rules/no-pause' ) ,
14
14
'no-debug' : require ( './lib/rules/no-debug' ) ,
15
+ 'no-xpath' : require ( './lib/rules/no-xpath' ) ,
15
16
} ,
16
17
configs : {
17
18
recommended : require ( './lib/config/recommended' ) ,
Original file line number Diff line number Diff line change @@ -15,6 +15,7 @@ const plugin = {
15
15
'no-force' : require ( './rules/no-force' ) ,
16
16
'no-pause' : require ( './rules/no-pause' ) ,
17
17
'no-debug' : require ( './rules/no-debug' ) ,
18
+ 'no-xpath' : require ( './rules/no-xpath' ) ,
18
19
} ,
19
20
}
20
21
Original file line number Diff line number Diff line change
1
+ 'use strict'
2
+
3
+ module . exports = {
4
+ meta : {
5
+ type : 'suggestion' ,
6
+ docs : {
7
+ description : 'disallow using `cy.xpath()` calls' ,
8
+ recommended : false ,
9
+ url : 'https://github.com/cypress-io/eslint-plugin-cypress/blob/master/docs/rules/no-xpath.md'
10
+ } ,
11
+ fixable : null , // Or `code` or `whitespace`
12
+ schema : [ ] , // Add a schema if the rule has options
13
+ messages : {
14
+ unexpected : 'Avoid using cy.xpath command' ,
15
+ } ,
16
+ } ,
17
+
18
+ create ( context ) {
19
+ return {
20
+ CallExpression ( node ) {
21
+ if ( isCallingCyXpath ( node ) ) {
22
+ context . report ( { node, messageId : 'unexpected' } )
23
+ }
24
+ } ,
25
+ }
26
+ } ,
27
+ } ;
28
+
29
+ function isCallingCyXpath ( node ) {
30
+ return node . callee . type === 'MemberExpression' &&
31
+ node . callee . object . type === 'Identifier' &&
32
+ node . callee . object . name === 'cy' &&
33
+ node . callee . property . type === 'Identifier' &&
34
+ node . callee . property . name === 'xpath'
35
+ }
Original file line number Diff line number Diff line change
1
+ "use strict" ;
2
+
3
+ //------------------------------------------------------------------------------
4
+ // Requirements
5
+ //------------------------------------------------------------------------------
6
+
7
+ const rule = require ( "../../../lib/rules/no-xpath" ) ,
8
+ RuleTester = require ( "eslint" ) . RuleTester ;
9
+
10
+ //------------------------------------------------------------------------------
11
+ // Tests
12
+ //------------------------------------------------------------------------------
13
+
14
+ const ruleTester = new RuleTester ( ) ;
15
+ ruleTester . run ( "no-xpath" , rule , {
16
+ valid : [
17
+ { code : 'cy.get("button").click({force: true})' } ,
18
+ ] ,
19
+
20
+ invalid : [
21
+ {
22
+ code : "cy.xpath('//div[@class=\"container\"]/p[1]').click()" ,
23
+ errors : [ { messageId : "unexpected" } ] ,
24
+ } ,
25
+ {
26
+ code : "cy.xpath('//p[1]').should('exist')" ,
27
+ errors : [ { messageId : "unexpected" } ]
28
+ }
29
+ ] ,
30
+ } ) ;
You can’t perform that action at this time.
0 commit comments