rabbitmq-server/deps/rabbitmq_management/selenium/test/pageobjects/BasePage.js

193 lines
5.3 KiB
JavaScript

const { By, Key, until, Builder } = require('selenium-webdriver')
const MENU_TABS = By.css('div#menu ul#tabs')
const USER = By.css('li#logout')
const LOGOUT_FORM = By.css('li#logout form')
const SELECT_VHOSTS = By.css('select#show-vhost')
const OVERVIEW_TAB = By.css('div#menu ul#tabs li#overview')
const CONNECTIONS_TAB = By.css('div#menu ul#tabs li#connections')
const CHANNELS_TAB = By.css('div#menu ul#tabs li#channels')
const QUEUES_AND_STREAMS_TAB = By.css('div#menu ul#tabs li#queues-and-streams')
const EXCHANGES_TAB = By.css('div#menu ul#tabs li#exchanges')
const ADMIN_TAB = By.css('div#menu ul#tabs li#admin')
const STREAM_CONNECTIONS_TAB = By.css('div#menu ul#tabs li#stream-connections')
module.exports = class BasePage {
driver
timeout
polling
constructor (webdriver) {
this.driver = webdriver
// this is another timeout (--timeout 10000) which is the maximum test execution time
this.timeout = parseInt(process.env.TIMEOUT) || 5000 // max time waiting to locate an element. Should be less that test timeout
this.polling = parseInt(process.env.POLLING) || 1000 // how frequent selenium searches for an element
}
async isLoaded () {
return this.waitForDisplayed(MENU_TABS)
}
async logout () {
await this.submit(LOGOUT_FORM)
}
async getUser () {
return this.getText(USER)
}
async waitForOverviewTab() {
return this.waitForDisplayed(OVERVIEW_TAB)
}
async clickOnOverviewTab () {
return this.click(CONNECTIONS_TAB)
}
async clickOnConnectionsTab () {
return this.click(CONNECTIONS_TAB)
}
async waitForConnectionsTab() {
return this.waitForDisplayed(CONNECTIONS_TAB)
}
async clickOnAdminTab () {
return this.click(ADMIN_TAB)
}
async waitForAdminTab() {
return this.waitForDisplayed(ADMIN_TAB)
}
async clickOnChannelsTab () {
return this.click(CHANNELS_TAB)
}
async waitForChannelsTab() {
return this.waitForDisplayed(CHANNELS_TAB)
}
async clickOnExchangesTab () {
return this.click(EXCHANGES_TAB)
}
async waitForExchangesTab() {
return this.waitForDisplayed(EXCHANGES_TAB)
}
async clickOnQueuesTab () {
return this.click(QUEUES_AND_STREAMS_TAB)
}
async waitForQueuesTab() {
return this.waitForDisplayed(QUEUES_AND_STREAMS_TAB)
}
async clickOnStreamTab () {
return this.click(STREAM_CONNECTIONS_TAB)
}
async waitForStreamConnectionsTab() {
return this.waitForDisplayed(STREAM_CONNECTIONS_TAB)
}
async getSelectableVhosts() {
let selectable = await this.waitForDisplayed(SELECT_VHOSTS)
let options = await selectable.findElements(By.css('option'))
let table_model = []
for (let option of options) {
table_model.push(await option.getText())
}
return table_model
}
async getTable(locator, firstNColumns) {
let table = await this.waitForDisplayed(locator)
let rows = await table.findElements(By.css('tbody tr'))
let table_model = []
for (let row of rows) {
let columns = await row.findElements(By.css('td'))
let table_row = []
for (let column of columns) {
if (table_row.length < firstNColumns) table_row.push(await column.getText())
}
table_model.push(table_row)
}
return table_model
}
async waitForLocated (locator) {
try {
return this.driver.wait(until.elementLocated(locator), this.timeout,
'Timed out after 30 seconds locating ' + locator, this.polling)
}catch(error) {
console.error("Failed to locate element " + locator)
throw error
}
}
async waitForVisible (element) {
try {
return this.driver.wait(until.elementIsVisible(element), this.timeout,
'Timed out after 30 seconds awaiting till visible ' + element, this.polling)
}catch(error) {
console.error("Failed to find visible element " + element)
throw error
}
}
async waitForDisplayed (locator) {
return this.waitForVisible(await this.waitForLocated(locator))
}
async getText (locator) {
const element = await this.waitForDisplayed(locator)
return element.getText()
}
async getValue (locator) {
const element = await this.waitForDisplayed(locator)
return element.getAttribute('value')
}
async click (locator) {
const element = await this.waitForDisplayed(locator)
try {
return element.click()
} catch(error) {
console.error("Failed to click on " + locator + " due to " + error);
throw error;
}
}
async submit (locator) {
const element = await this.waitForDisplayed(locator)
return element.submit()
}
async sendKeys (locator, keys) {
const element = await this.waitForDisplayed(locator)
await element.click()
await element.clear()
return element.sendKeys(keys)
}
async chooseFile (locator, file) {
const element = await this.waitForDisplayed(locator)
var remote = require('selenium-webdriver/remote');
driver.setFileDetector(new remote.FileDetector);
return element.sendKeys(file)
}
async acceptAlert () {
await this.driver.wait(until.alertIsPresent(), this.timeout);
await this.driver.sleep(250)
let alert = await this.driver.switchTo().alert();
await this.driver.sleep(250)
return alert.accept();
}
capture () {
this.driver.takeScreenshot().then(
function (image) {
require('fs').writeFileSync('/tmp/capture.png', image, 'base64')
}
)
}
}