Skip to content

Commit e72c1e2

Browse files
MarcialRosalesmergify[bot]
authored andcommitted
Improve how to look for elements and wait for them
(cherry picked from commit 89ee77e) (cherry picked from commit 41322bf) (cherry picked from commit 824cc14)
1 parent 54d19ff commit e72c1e2

File tree

11 files changed

+85
-135
lines changed

11 files changed

+85
-135
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22

3-
<form action="<%= url %>" method="POST">
3+
<form action="<%= url %>" id="login_form" method="POST">
44
<input type="hidden" name="access_token" value="<%= access_token %>">
55
<input type="submit" value="<%= name %>">
66
</form>

deps/rabbitmq_management/selenium/suites/suite_template

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,17 @@ kill_container_if_exist() {
5252
docker stop $1 &> /dev/null || true && docker rm $1 &> /dev/null || true
5353
}
5454
wait_for_message() {
55+
attemps_left=10
5556
while ! docker logs $1 | grep -q "$2";
5657
do
5758
sleep 5
58-
echo "Waiting 5sec for $1 to start ..."
59+
echo "Waiting 5sec for $1 to start ($attemps_left attempts left )..."
60+
((attemps_left--))
61+
if [[ "$attemps_left" -lt 1 ]]; then
62+
echo "Timed out waiting"
63+
exit 1
64+
fi
5965
done
60-
6166
}
6267

6368
init_rabbitmq() {

deps/rabbitmq_management/selenium/test/basic-auth/happy-login.js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,8 @@ describe('An internal user with administrator tag', function () {
2020
})
2121

2222
it('can log in into the management ui', async function () {
23-
await login.login('guest', 'guest')
24-
if (!await overview.isLoaded()) {
25-
throw new Error('Failed to login')
26-
}
23+
await login.login('guest', 'guest')
24+
await overview.isLoaded()
2725
assert.equal(await overview.getUser(), 'User guest')
2826
})
2927

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
[
2+
{rabbit, [
3+
{auth_backends, [rabbit_auth_backend_oauth2]}
4+
]},
5+
{rabbitmq_management, [
6+
{login_session_timeout, 1}, %% in minutes
7+
{oauth_enabled, true},
8+
{oauth_initiated_logon_type, idp_initiated},
9+
{oauth_provider_url, "http://localhost:3000"}
10+
]},
11+
{rabbitmq_auth_backend_oauth2, [
12+
{resource_server_id, <<"rabbitmq">>},
13+
{preferred_username_claims, [<<"user_name">>]},
14+
{key_config, [
15+
{default_key, <<"legacy-token-key">>},
16+
{signing_keys,
17+
#{<<"legacy-token-key">> => {pem, <<"-----BEGIN PUBLIC KEY-----
18+
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2dP+vRn+Kj+S/oGd49kq
19+
6+CKNAduCC1raLfTH7B3qjmZYm45yDl+XmgK9CNmHXkho9qvmhdksdzDVsdeDlhK
20+
IdcIWadhqDzdtn1hj/22iUwrhH0bd475hlKcsiZ+oy/sdgGgAzvmmTQmdMqEXqV2
21+
B9q9KFBmo4Ahh/6+d4wM1rH9kxl0RvMAKLe+daoIHIjok8hCO4cKQQEw/ErBe4SF
22+
2cr3wQwCfF1qVu4eAVNVfxfy/uEvG3Q7x005P3TcK+QcYgJxav3lictSi5dyWLgG
23+
QAvkknWitpRK8KVLypEj5WKej6CF8nq30utn15FQg0JkHoqzwiCqqeen8GIPteI7
24+
VwIDAQAB
25+
-----END PUBLIC KEY-----">>}
26+
}
27+
}]
28+
}
29+
]}
30+
].

deps/rabbitmq_management/selenium/test/pageobjects/BasePage.js

Lines changed: 39 additions & 120 deletions
Original file line numberDiff line numberDiff line change
@@ -2,148 +2,67 @@ const { By, Key, until, Builder } = require('selenium-webdriver')
22

33
module.exports = class BasePage {
44
driver
5+
timeout
6+
polling
57

68
constructor (webdriver) {
79
this.driver = webdriver
10+
// this is another timeout (--timeout 10000) which is the maximum test execution time
11+
this.timeout = parseInt(process.env.TIMEOUT) || 5000 // max time waiting to locate an element. Should be less that test timeout
12+
this.polling = parseInt(process.env.POLLING) || 1000 // how frequent selenium searches for an element
813
}
914

10-
async waitForLocated (locator, retries = 3) {
11-
try {
12-
await this.driver.wait(until.elementLocated(locator), 2000)
13-
} catch (err) {
14-
if (retries === 0) {
15-
throw new Error(`Still not able to locate element ${locator.toString()} after maximum retries, Error message: ${err.message.toString()}`)
16-
}
17-
await this.driver.sleep(250)
18-
return this.waitForLocated(driver, locator, retries - 1)
19-
}
15+
async waitForLocated (locator) {
16+
return this.driver.wait(until.elementLocated(locator), this.timeout, 'Timed out after 30 seconds', this.polling);
2017
}
2118

22-
async waitForVisible (locator, retries = 3) {
23-
try {
24-
const element = await this.driver.findElement(locator)
25-
await this.driver.wait(until.elementIsVisible(element), 2000)
26-
} catch (err) {
27-
if (retries === 0) {
28-
throw new Error(`Element ${locator.toString()} still not visible after maximum retries, Error message: ${err.message.toString()}`)
29-
}
30-
await this.driver.sleep(250)
31-
return this.waitForVisible(driver, locator, retries - 1)
32-
}
19+
async waitForVisible (element) {
20+
return this.driver.wait(until.elementIsVisible(element), this.timeout, 'Timed out after 30 seconds', this.polling);
3321
}
3422

35-
async waitForDisplayed (locator, retries = 3) {
36-
await this.waitForLocated(locator, retries)
37-
await this.waitForVisible(locator, retries)
38-
return this.driver.findElement(locator)
23+
async waitForDisplayed (locator) {
24+
return this.waitForVisible(await this.waitForLocated(locator))
3925
}
4026

41-
async hasElement (locator) {
42-
const count = await this.driver.findElements(locator).size()
43-
throw new Error('there are ' + count + ' warnings')
44-
return count > 0
27+
async getText (locator) {
28+
const element = await this.waitForDisplayed(locator)
29+
return element.getText()
4530
}
4631

47-
async getText (locator, retries = 1) {
48-
try {
49-
const element = await this.driver.findElement(locator)
50-
const text = element.getText()
51-
return text
52-
} catch (err) {
53-
if (retries === 0) {
54-
throw new Error(`Unable to get ${locator.toString()} text after maximum retries, error : ${err.message}`)
55-
}
56-
await this.driver.sleep(250)
57-
return this.getText(locator, retries - 1)
58-
}
32+
async getValue (locator) {
33+
const element = await this.waitForDisplayed(locator)
34+
return element.getAttribute('value')
5935
}
6036

61-
async getValue (locator, retries = 1) {
62-
try {
63-
const element = await this.driver.findElement(locator)
64-
const value = element.getAttribute('value')
65-
return value
66-
} catch (err) {
67-
if (retries === 0) {
68-
throw new Error(`Unable to get ${locator.toString()} text after maximum retries, error : ${err.message}`)
69-
}
70-
await this.driver.sleep(250)
71-
return this.getValue(locator, retries - 1)
72-
}
37+
async click (locator) {
38+
const element = await this.waitForDisplayed(locator)
39+
return element.click()
7340
}
7441

75-
async click (locator, retries = 1) {
76-
try {
77-
const element = await this.driver.findElement(locator)
78-
return element.click()
79-
} catch (err) {
80-
if (retries === 0) {
81-
throw new Error(`Still not able to click ${locator.toString()} after maximum retries, Error message: ${err.message.toString()}`)
82-
}
83-
await this.driver.sleep(250)
84-
return this.click(locator, retries - 1)
85-
}
42+
async submit (locator) {
43+
const element = await this.waitForDisplayed(locator)
44+
return element.submit()
8645
}
8746

88-
async submit (locator, retries = 1) {
89-
try {
90-
const element = await this.driver.findElement(locator)
91-
return element.submit()
92-
} catch (err) {
93-
if (retries === 0) {
94-
throw new Error(`Still not able to submit ${locator.toString()} after maximum retries, Error message: ${err.message.toString()}`)
95-
}
96-
await this.driver.sleep(250)
97-
return this.submit(locator, retries - 1)
98-
}
47+
async sendKeys (locator, keys) {
48+
const element = await this.waitForDisplayed(locator)
49+
await element.click()
50+
await element.clear()
51+
return element.sendKeys(keys)
9952
}
10053

101-
async sendKeys (locator, keys, retries = 1) {
102-
try {
103-
const element = await this.driver.findElement(locator)
104-
await element.click()
105-
await element.clear()
106-
return element.sendKeys(keys)
107-
} catch (err) {
108-
console.log(err)
109-
if (retries === 0) {
110-
throw new Error(`Unable to send keys to ${locator.toString()} after maximum retries, error : ${err.message}`)
111-
}
112-
await this.driver.sleep(250)
113-
return this.sendKeys(locator, keys, retries - 1)
114-
}
54+
async chooseFile (locator, file) {
55+
const element = await this.waitForDisplayed(locator)
56+
var remote = require('selenium-webdriver/remote');
57+
driver.setFileDetector(new remote.FileDetector);
58+
return element.sendKeys(file)
11559
}
116-
117-
async chooseFile (locator, file, retries = 1) {
118-
try {
119-
const element = await this.driver.findElement(locator)
120-
var remote = require('selenium-webdriver/remote');
121-
driver.setFileDetector(new remote.FileDetector);
122-
return element.sendKeys(file)
123-
} catch (err) {
124-
console.log(err)
125-
if (retries === 0) {
126-
throw new Error(`Unable to send keys to ${locator.toString()} after maximum retries, error : ${err.message}`)
127-
}
128-
await this.driver.sleep(250)
129-
return this.chooseFile(locator, file, retries - 1)
130-
}
131-
}
132-
async acceptAlert (retries = 3) {
133-
try {
134-
await this.driver.wait(until.alertIsPresent());
135-
await this.driver.sleep(250)
136-
let alert = await this.driver.switchTo().alert();
137-
await this.driver.sleep(250)
138-
return alert.accept();
139-
} catch (err) {
140-
console.log(err)
141-
if (retries === 0) {
142-
throw new Error(`Unable to send keys to ${locator.toString()} after maximum retries, error : ${err.message}`)
143-
}
144-
await this.driver.sleep(250)
145-
return this.alertAccept(retries - 1)
146-
}
60+
async acceptAlert () {
61+
await this.driver.wait(until.alertIsPresent(), this.timeout);
62+
await this.driver.sleep(250)
63+
let alert = await this.driver.switchTo().alert();
64+
await this.driver.sleep(250)
65+
return alert.accept();
14766
}
14867

14968
capture () {

deps/rabbitmq_management/selenium/test/pageobjects/FakePortalPage.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ const { By, Key, until, Builder } = require('selenium-webdriver')
22

33
const BasePage = require('./BasePage')
44

5-
const FORM = By.css('form')
5+
const FORM = By.css('form#login_form')
66
const FAKE_PORTAL_URL = process.env.FAKE_PORTAL_URL || 'http://localhost:3000'
77

88
module.exports = class FakePortalPage extends BasePage {

deps/rabbitmq_management/selenium/test/pageobjects/LoginPage.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ const { By, Key, until, Builder } = require('selenium-webdriver')
22

33
const BasePage = require('./BasePage')
44

5-
const FORM = By.css('form')
5+
const FORM = By.css('div#login form')
66
const USERNAME = By.css('input[name="username"]')
77
const PASSWORD = By.css('input[name="password"]')
88
const LOGIN_BUTTON = By.css('div#outer div#login form input[type=submit]')
@@ -14,7 +14,6 @@ module.exports = class LoginPage extends BasePage {
1414

1515
async login (username, password) {
1616
await this.isLoaded()
17-
1817
await this.sendKeys(USERNAME, username)
1918
await this.sendKeys(PASSWORD, password)
2019
return this.submit(FORM)

deps/rabbitmq_management/selenium/test/pageobjects/OverviewPage.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ const DOWNLOAD_BROKER_FILE = By.css('button#upload-definitions')
2222

2323
module.exports = class OverviewPage extends BasePage {
2424
async isLoaded () {
25-
return await this.waitForDisplayed(MENU_TABS)
25+
return this.waitForDisplayed(MENU_TABS)
2626
}
2727

2828
async logout () {

deps/rabbitmq_management/selenium/test/pageobjects/SSOHomePage.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ module.exports = class SSOHomePage extends BasePage {
1010
return this.waitForDisplayed(LOGIN_BUTTON)
1111
}
1212

13-
async clickToLogin (username, password) {
13+
async clickToLogin () {
1414
await this.isLoaded()
1515
if (!await this.isWarningVisible()) {
1616
return this.click(LOGIN_BUTTON)

deps/rabbitmq_management/selenium/test/pageobjects/VhostAdminTab.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ module.exports = class VhostAdminTab extends AdminTab {
1313
await this.waitForDisplayed(VHOST_NAME)
1414
await this.waitForDisplayed(OVERVIEW_SECTION)
1515
await this.waitForDisplayed(PERMISSIONS_SECTION)
16-
return await this.waitForDisplayed(TOPIC_PERMISSIONS_SECTION)
16+
return this.waitForDisplayed(TOPIC_PERMISSIONS_SECTION)
1717
}
1818

1919
async getName() {

deps/rabbitmq_management/selenium/test/pageobjects/VhostsAdminTab.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,7 @@ module.exports = class VhostsAdminTab extends AdminTab {
1919
await this.click(CHECKBOX_REGEX)
2020
}
2121
await this.driver.sleep(250)
22-
await this.waitForDisplayed(VHOSTS_TABLE_ROWS)
23-
return this.driver.findElement(VHOSTS_TABLE_ROWS)
22+
return this.waitForDisplayed(VHOSTS_TABLE_ROWS)
2423
}
2524
async hasVhosts(vhost, regex = false) {
2625
return await this.searchForVhosts(vhost, regex) != undefined

0 commit comments

Comments
 (0)