Skip to content

Commit 3ede9fa

Browse files
committed
feat(rules): add 'no-get-raw-id' rule
1 parent d5c3b34 commit 3ede9fa

File tree

6 files changed

+68
-45
lines changed

6 files changed

+68
-45
lines changed

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ There are various types of rules implemented in the plugin. Here is a rough cate
5959
* [no-array-finder-methods][]: Disallow using `ElementArrayFinder` methods on `ElementFinder`
6060
* [array-callback-return][]: Enforce `return` statements in callbacks of `ElementArrayFinder` methods
6161
* [no-get-inner-outer-html][]: Warn about using deprecated `getInnerHtml()` and `getOuterHtml()` methods
62+
* [no-get-raw-id][]: Warn about using removed `getRawId()` method
6263
* [no-promise-in-if][]: Warn if promise is checked for truthiness inside an `if` condition
6364
6465
#### Locating Elements
@@ -105,6 +106,7 @@ Rule | Default Error Level | Auto-fixable | Options
105106
[no-array-finder-methods][] | 2 | |
106107
[valid-locator-type][] | 2 | |
107108
[no-compound-classes][] | 2 | |
109+
[no-get-raw-id][] | 2 | |
108110
[missing-wait-message][] | 1 (Warning) | |
109111
[no-browser-sleep][] | 1 | |
110112
[no-by-xpath][] | 1 | |
@@ -182,6 +184,7 @@ See [configuring rules][] for more information.
182184
[no-browser-driver]: docs/rules/no-browser-driver.md
183185
[valid-by-id]: docs/rules/valid-by-id.md
184186
[valid-by-tagname]: docs/rules/valid-by-tagname.md
187+
[no-get-raw-id]: docs/rules/no-get-raw-id.md
185188
[configuring rules]: http://eslint.org/docs/user-guide/configuring#configuring-rules
186189
187190
## Recommended configuration

docs/rules/no-get-raw-id.md

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,25 @@
1-
# Warn about using deprecated `getInnerHtml()` and `getOuterHtml()` methods
1+
# Warn about using removed `getRawId()` method
22

3-
Selenium [has deprecated `getInnerHtml()` and `getOuterHtml()` methods in version 2.53](https://github.com/SeleniumHQ/selenium/blob/96ed95a97405fa267eea09c4008cda9e7703e84d/javascript/node/selenium-webdriver/CHANGES.md#change-summary).
4-
And, hence, Protractor itself _does not have these methods documented_ as a part of [public API](http://www.protractortest.org/#/api) anymore.
3+
`getRawId()` method has been removed in [`Protractor` 5.0.0](https://github.com/angular/protractor/blob/ea72d5588aef983aa84705abd1ad1afa36065be7/CHANGELOG.md#500) and in [`Selenium` 3.0.0](https://github.com/SeleniumHQ/selenium/blob/427307d6e24000d7db68e8c36362fab05c477cce/javascript/node/selenium-webdriver/CHANGES.md#v300-beta-1).
4+
Use `getId()` method instead.
55

66
## Rule details
77

8-
Any use of the following patterns are considered warnings:
8+
Any use of the following patterns are considered errors:
99

1010
```js
11-
expect(element(by.id("myid")).getInnerHtml()).toEqual("test");
12-
expect(element(by.id("myid")).getOuterHtml()).toEqual("test");
13-
element.all(by.css(".class")).first().getOuterHtml();
14-
element(by.id("id")).all(by.css(".class")).last().getInnerHtml();
15-
$$(".class").first().getOuterHtml();
16-
$(".class").getInnerHtml().then(function (html) { console.log(html) });
11+
expect(element(by.id("myid")).getRawId()).toEqual("id");
12+
element.all(by.css(".class")).first().getRawId();
13+
element(by.id("id")).all(by.css(".class")).last().getRawId();
14+
$$(".class").first().getRawId();
15+
$(".class").getRawId().then(function (id) { console.log(id) });
1716
```
1817

1918
The following patterns are not warnings:
2019

2120
```js
22-
expect(element(by.id("myid")).getText()).toEqual("test");
23-
getInnerHtml();
24-
var html = getOuterHtml();
25-
elm.getInnerHTML();
26-
elm.getOuterHTML();
21+
expect(element(by.id("myid")).getId()).toEqual("id");
22+
getRawId();
23+
var html = getRawId();
24+
elm.getRawId();
2725
```

index.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ var useCountMethod = require('./lib/rules/use-count-method')
3333
var noBrowserDriver = require('./lib/rules/no-browser-driver')
3434
var validById = require('./lib/rules/valid-by-id')
3535
var validByTagName = require('./lib/rules/valid-by-tagname')
36+
var noGetRawId = require('./lib/rules/no-get-raw-id')
3637

3738
module.exports = {
3839
rules: {
@@ -68,7 +69,8 @@ module.exports = {
6869
'use-count-method': useCountMethod,
6970
'no-browser-driver': noBrowserDriver,
7071
'valid-by-id': validById,
71-
'valid-by-tagname': validByTagName
72+
'valid-by-tagname': validByTagName,
73+
'no-get-raw-id': noGetRawId
7274
},
7375
configs: {
7476
recommended: {
@@ -78,6 +80,7 @@ module.exports = {
7880
'protractor/correct-chaining': 2,
7981
'protractor/no-invalid-selectors': 2,
8082
'protractor/no-array-finder-methods': 2,
83+
'protractor/no-get-raw-id': 2,
8184
'protractor/valid-locator-type': 2,
8285
'protractor/no-compound-classes': 2,
8386
'protractor/missing-wait-message': 1,

lib/is-element-finder.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,18 @@
66
* @fileoverview Utility function to determine if a node is an ElementFinder
77
* @author Alexander Afanasyev
88
*/
9+
10+
var isElementArrayFinder = require('./is-element-array-finder')
11+
var elementArrayFinderGetMethods = [
12+
'get',
13+
'last',
14+
'first'
15+
]
16+
917
module.exports = function (node) {
10-
// handling $ shortcut
1118
var callee = node.callee
1219
if (callee) {
20+
// handling raw $ and element
1321
if (callee.name === '$' || callee.name === 'element') {
1422
return true
1523
}
@@ -19,6 +27,11 @@ module.exports = function (node) {
1927
if (callee.property.name === '$' || callee.property.name === 'element') {
2028
return true
2129
}
30+
31+
// got element finder from element array finder
32+
if (elementArrayFinderGetMethods.indexOf(callee.property.name) > -1 && callee.object && isElementArrayFinder(callee.object)) {
33+
return true
34+
}
2235
}
2336
}
2437

lib/rules/no-get-raw-id.js

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
'use strict'
22

33
/**
4-
* @fileoverview Warn about using `getInnerHtml()` and `getOuterHtml()` methods
4+
* @fileoverview Warn about using `getRawId()` method
55
* @author Alexander Afanasyev
66
*/
7+
var isElementFinder = require('../is-element-finder')
78

89
module.exports = {
910
meta: {
@@ -12,17 +13,14 @@ module.exports = {
1213

1314
create: function (context) {
1415
return {
15-
'CallExpression': function (node) {
16-
var object = node.callee.object
17-
var property = node.callee.property
16+
MemberExpression: function (node) {
17+
var property = node.property
1818

19-
if (object && property) {
20-
var isInnerHtml = property.name === 'getInnerHtml'
21-
var isOuterHtml = property.name === 'getOuterHtml'
22-
if (isInnerHtml || isOuterHtml) {
19+
if (property && property.name === 'getRawId') {
20+
if (node.object && isElementFinder(node.object)) {
2321
context.report({
24-
node: node,
25-
message: 'Unexpected "' + property.name + '()"'
22+
node: property,
23+
message: 'Unexpected "' + property.name + '()". Use "getId()" instead'
2624
})
2725
}
2826
}

test/rules/no-get-raw-id.js

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,73 @@
11
'use strict'
22

3-
var rule = require('../../lib/rules/no-get-inner-outer-html')
3+
var rule = require('../../lib/rules/no-get-raw-id')
44
var RuleTester = require('eslint').RuleTester
55

66
var eslintTester = new RuleTester()
77

8-
eslintTester.run('no-get-inner-outer-html', rule, {
8+
eslintTester.run('no-get-raw-id', rule, {
99
valid: [
10-
'expect(element(by.id("myid")).getText()).toEqual("test");',
11-
'getInnerHtml();',
12-
'var html = getOuterHtml();',
13-
'elm.getInnerHTML();',
10+
'expect(element(by.id("myid")).getId()).toEqual("id");',
11+
'getRawId();',
12+
'var html = getRawId();',
13+
'elm.getRawId();',
1414
'elm.getOuterHTML();'
1515
],
1616

1717
invalid: [
1818
{
19-
code: 'expect(element(by.id("myid")).getInnerHtml()).toEqual("test");',
19+
code: 'expect(element(by.id("myid")).getRawId()).toEqual("id");',
2020
errors: [
2121
{
22-
message: 'Unexpected "getInnerHtml()"'
22+
message: 'Unexpected "getRawId()". Use "getId()" instead'
2323
}
2424
]
2525
},
2626
{
27-
code: 'expect(element(by.id("myid")).getOuterHtml()).toEqual("test");',
27+
code: 'element.all(by.css(".class")).get(1).getRawId();',
2828
errors: [
2929
{
30-
message: 'Unexpected "getOuterHtml()"'
30+
message: 'Unexpected "getRawId()". Use "getId()" instead'
3131
}
3232
]
3333
},
3434
{
35-
code: 'element.all(by.css(".class")).first().getOuterHtml();',
35+
code: 'element.all(by.css(".class")).first().getRawId();',
3636
errors: [
3737
{
38-
message: 'Unexpected "getOuterHtml()"'
38+
message: 'Unexpected "getRawId()". Use "getId()" instead'
3939
}
4040
]
4141
},
4242
{
43-
code: 'element(by.id("id")).all(by.css(".class")).last().getInnerHtml();',
43+
code: 'element(by.id("id")).all(by.css(".class")).last().getRawId();',
4444
errors: [
4545
{
46-
message: 'Unexpected "getInnerHtml()"'
46+
message: 'Unexpected "getRawId()". Use "getId()" instead'
4747
}
4848
]
4949
},
5050
{
51-
code: '$$(".class").first().getOuterHtml();',
51+
code: 'element.all(by.css(".class")).first().$$(".myclass").last().getRawId();',
5252
errors: [
5353
{
54-
message: 'Unexpected "getOuterHtml()"'
54+
message: 'Unexpected "getRawId()". Use "getId()" instead'
5555
}
5656
]
5757
},
5858
{
59-
code: '$(".class").getInnerHtml().then(function (html) { console.log(html) });',
59+
code: '$$(".class").first().getRawId();',
6060
errors: [
6161
{
62-
message: 'Unexpected "getInnerHtml()"'
62+
message: 'Unexpected "getRawId()". Use "getId()" instead'
63+
}
64+
]
65+
},
66+
{
67+
code: '$(".class").getRawId().then(function (id) { console.log(id) });',
68+
errors: [
69+
{
70+
message: 'Unexpected "getRawId()". Use "getId()" instead'
6371
}
6472
]
6573
}

0 commit comments

Comments
 (0)