2022-11-08 16:41:47 +08:00
|
|
|
const { By, Key, until, Builder } = require('selenium-webdriver')
|
2022-07-01 20:57:14 +08:00
|
|
|
|
|
|
|
module.exports = class BasePage {
|
2022-11-08 16:41:47 +08:00
|
|
|
driver
|
2022-07-01 20:57:14 +08:00
|
|
|
|
2022-11-08 16:41:47 +08:00
|
|
|
constructor (webdriver) {
|
2022-07-01 20:57:14 +08:00
|
|
|
this.driver = webdriver
|
|
|
|
}
|
|
|
|
|
2022-12-19 23:23:25 +08:00
|
|
|
async waitForLocated (locator, retries = 3) {
|
2022-07-01 20:57:14 +08:00
|
|
|
try {
|
2022-12-19 23:23:25 +08:00
|
|
|
await this.driver.wait(until.elementLocated(locator), 2000)
|
2022-07-01 20:57:14 +08:00
|
|
|
} catch (err) {
|
|
|
|
if (retries === 0) {
|
|
|
|
throw new Error(`Still not able to locate element ${locator.toString()} after maximum retries, Error message: ${err.message.toString()}`)
|
|
|
|
}
|
2022-12-19 23:23:25 +08:00
|
|
|
await this.driver.sleep(250)
|
2022-07-06 21:50:11 +08:00
|
|
|
return this.waitForLocated(driver, locator, retries - 1)
|
2022-07-01 20:57:14 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-12-19 23:23:25 +08:00
|
|
|
async waitForVisible (locator, retries = 3) {
|
2022-07-01 20:57:14 +08:00
|
|
|
try {
|
2022-12-19 23:23:25 +08:00
|
|
|
const element = await this.driver.findElement(locator)
|
|
|
|
await this.driver.wait(until.elementIsVisible(element), 2000)
|
2022-07-01 20:57:14 +08:00
|
|
|
} catch (err) {
|
|
|
|
if (retries === 0) {
|
|
|
|
throw new Error(`Element ${locator.toString()} still not visible after maximum retries, Error message: ${err.message.toString()}`)
|
|
|
|
}
|
2022-12-19 23:23:25 +08:00
|
|
|
await this.driver.sleep(250)
|
2022-07-06 21:50:11 +08:00
|
|
|
return this.waitForVisible(driver, locator, retries - 1)
|
2022-07-01 20:57:14 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
async waitForDisplayed (locator, retries = 3) {
|
2022-12-19 23:23:25 +08:00
|
|
|
await this.waitForLocated(locator, retries)
|
|
|
|
await this.waitForVisible(locator, retries)
|
2022-07-01 20:57:14 +08:00
|
|
|
return this.driver.findElement(locator)
|
|
|
|
}
|
|
|
|
|
2022-07-06 21:50:11 +08:00
|
|
|
async hasElement (locator) {
|
2022-11-08 16:41:47 +08:00
|
|
|
const count = await this.driver.findElements(locator).size()
|
|
|
|
throw new Error('there are ' + count + ' warnings')
|
|
|
|
return count > 0
|
2022-07-06 21:50:11 +08:00
|
|
|
}
|
2022-07-01 22:34:28 +08:00
|
|
|
|
2022-07-01 20:57:14 +08:00
|
|
|
async getText (locator, retries = 1) {
|
|
|
|
try {
|
2022-11-08 16:41:47 +08:00
|
|
|
const element = await this.driver.findElement(locator)
|
|
|
|
const text = element.getText()
|
2022-07-01 22:34:28 +08:00
|
|
|
return text
|
2022-07-01 20:57:14 +08:00
|
|
|
} catch (err) {
|
|
|
|
if (retries === 0) {
|
|
|
|
throw new Error(`Unable to get ${locator.toString()} text after maximum retries, error : ${err.message}`)
|
|
|
|
}
|
|
|
|
await this.driver.sleep(250)
|
|
|
|
return this.getText(locator, retries - 1)
|
|
|
|
}
|
|
|
|
}
|
2022-07-01 22:34:28 +08:00
|
|
|
|
2022-11-08 16:41:47 +08:00
|
|
|
async getValue (locator, retries = 1) {
|
|
|
|
try {
|
|
|
|
const element = await this.driver.findElement(locator)
|
|
|
|
const value = element.getAttribute('value')
|
|
|
|
return value
|
|
|
|
} catch (err) {
|
|
|
|
if (retries === 0) {
|
|
|
|
throw new Error(`Unable to get ${locator.toString()} text after maximum retries, error : ${err.message}`)
|
|
|
|
}
|
|
|
|
await this.driver.sleep(250)
|
|
|
|
return this.getValue(locator, retries - 1)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-07-01 20:57:14 +08:00
|
|
|
async click (locator, retries = 1) {
|
|
|
|
try {
|
|
|
|
const element = await this.driver.findElement(locator)
|
2022-07-01 22:34:28 +08:00
|
|
|
return element.click()
|
2022-07-01 20:57:14 +08:00
|
|
|
} catch (err) {
|
|
|
|
if (retries === 0) {
|
|
|
|
throw new Error(`Still not able to click ${locator.toString()} after maximum retries, Error message: ${err.message.toString()}`)
|
|
|
|
}
|
|
|
|
await this.driver.sleep(250)
|
|
|
|
return this.click(locator, retries - 1)
|
|
|
|
}
|
|
|
|
}
|
2022-11-08 16:41:47 +08:00
|
|
|
|
|
|
|
async submit (locator, retries = 1) {
|
|
|
|
try {
|
|
|
|
const element = await this.driver.findElement(locator)
|
|
|
|
return element.submit()
|
|
|
|
} catch (err) {
|
|
|
|
if (retries === 0) {
|
|
|
|
throw new Error(`Still not able to submit ${locator.toString()} after maximum retries, Error message: ${err.message.toString()}`)
|
2022-07-06 22:28:53 +08:00
|
|
|
}
|
2022-11-08 16:41:47 +08:00
|
|
|
await this.driver.sleep(250)
|
|
|
|
return this.submit(locator, retries - 1)
|
2022-07-06 22:28:53 +08:00
|
|
|
}
|
2022-11-08 16:41:47 +08:00
|
|
|
}
|
|
|
|
|
2022-07-01 20:57:14 +08:00
|
|
|
async sendKeys (locator, keys, retries = 1) {
|
|
|
|
try {
|
|
|
|
const element = await this.driver.findElement(locator)
|
|
|
|
await element.click()
|
|
|
|
await element.clear()
|
2022-07-01 22:34:28 +08:00
|
|
|
return element.sendKeys(keys)
|
2022-07-01 20:57:14 +08:00
|
|
|
} catch (err) {
|
2022-12-16 03:09:17 +08:00
|
|
|
console.log(err)
|
2022-07-01 20:57:14 +08:00
|
|
|
if (retries === 0) {
|
|
|
|
throw new Error(`Unable to send keys to ${locator.toString()} after maximum retries, error : ${err.message}`)
|
|
|
|
}
|
|
|
|
await this.driver.sleep(250)
|
|
|
|
return this.sendKeys(locator, keys, retries - 1)
|
|
|
|
}
|
|
|
|
}
|
2022-11-08 16:41:47 +08:00
|
|
|
|
2022-12-16 03:09:17 +08:00
|
|
|
async chooseFile (locator, file, retries = 1) {
|
|
|
|
try {
|
|
|
|
const element = await this.driver.findElement(locator)
|
2022-12-16 19:05:48 +08:00
|
|
|
var remote = require('selenium-webdriver/remote');
|
2022-12-19 23:23:25 +08:00
|
|
|
driver.setFileDetector(new remote.FileDetector);
|
2022-12-16 03:09:17 +08:00
|
|
|
return element.sendKeys(file)
|
|
|
|
} catch (err) {
|
|
|
|
console.log(err)
|
|
|
|
if (retries === 0) {
|
|
|
|
throw new Error(`Unable to send keys to ${locator.toString()} after maximum retries, error : ${err.message}`)
|
|
|
|
}
|
|
|
|
await this.driver.sleep(250)
|
|
|
|
return this.chooseFile(locator, file, retries - 1)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
async acceptAlert (retries = 3) {
|
|
|
|
try {
|
|
|
|
await this.driver.wait(until.alertIsPresent());
|
|
|
|
await this.driver.sleep(250)
|
|
|
|
let alert = await this.driver.switchTo().alert();
|
|
|
|
await this.driver.sleep(250)
|
|
|
|
return alert.accept();
|
|
|
|
} catch (err) {
|
|
|
|
console.log(err)
|
|
|
|
if (retries === 0) {
|
|
|
|
throw new Error(`Unable to send keys to ${locator.toString()} after maximum retries, error : ${err.message}`)
|
|
|
|
}
|
|
|
|
await this.driver.sleep(250)
|
|
|
|
return this.alertAccept(retries - 1)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-11-08 16:41:47 +08:00
|
|
|
capture () {
|
2022-07-06 21:50:11 +08:00
|
|
|
this.driver.takeScreenshot().then(
|
2022-11-08 16:41:47 +08:00
|
|
|
function (image) {
|
|
|
|
require('fs').writeFileSync('/tmp/capture.png', image, 'base64')
|
|
|
|
}
|
|
|
|
)
|
2022-07-06 21:50:11 +08:00
|
|
|
}
|
2022-07-01 20:57:14 +08:00
|
|
|
}
|