377 lines
9.9 KiB
JavaScript
377 lines
9.9 KiB
JavaScript
const Logger= require('../entity/Logger.js');
|
|
const logger=Logger.logger;
|
|
const utils=require('../utils/Utils.js');
|
|
const Utils=utils.Utils;
|
|
const key = require('selenium-webdriver').Key;
|
|
const webdriver = require('selenium-webdriver'),
|
|
by = require('selenium-webdriver/lib/by');
|
|
//const Alert = require('selenium-webdriver');
|
|
//const Alert=webdriver.Alert;
|
|
const By=by.By;
|
|
const loader=By.className("loading-container");
|
|
const titles=By.className("title");
|
|
|
|
const Twait=20000;
|
|
Twaittransaction=5000;
|
|
|
|
class Page {
|
|
constructor(driver) {
|
|
this.driver=driver;
|
|
this.pageTitle;
|
|
}
|
|
|
|
async initTitles() {
|
|
try {
|
|
logger.info("init titles:");
|
|
let array = await this.findWithWait(titles);
|
|
this.pageTitle = array[0];
|
|
return array;
|
|
}
|
|
catch(err) {
|
|
logger.info("Page has no title");
|
|
return null;
|
|
}
|
|
}
|
|
|
|
|
|
async getPageTitle(element){
|
|
logger.info("get title: ");
|
|
let array = await this.initTitles();
|
|
let result;
|
|
if (array!=null) result = await this.getTextByElement(this.pageTitle);
|
|
logger.info("result ");
|
|
return result;
|
|
}
|
|
|
|
|
|
async isElementDisabled(element) {
|
|
logger.info("isElementDisabled :")
|
|
try {
|
|
let field;
|
|
if (element.constructor.name!=="WebElement") {
|
|
field = await this.driver.wait(webdriver.until.elementLocated(element), Twait);
|
|
}
|
|
else field = element;
|
|
|
|
await this.driver.wait(webdriver.until.elementIsDisabled(field), 100);
|
|
logger.info("element disabled ");
|
|
return true;
|
|
}
|
|
catch(err) {
|
|
logger.info("Element enabled or does not present");
|
|
return false;
|
|
}
|
|
}
|
|
|
|
async findElementInArray(locator,className) {
|
|
try {
|
|
await this.driver.wait(webdriver.until.elementsLocated(locator), 10000, 'Element NOT present.Time out.\n');
|
|
let arr = await this.driver.findElements(locator);
|
|
for (let i = 0; i < arr.length; i++) {
|
|
let result = await arr[i].getAttribute("className");
|
|
if (result.includes(className)) return arr[i];
|
|
}
|
|
}
|
|
catch(err) {
|
|
logger.info("Can't find "+ locator+ "in array of "+ className+".\n"+err);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
async isElementPresentWithWait(element) {
|
|
logger.info("is element present with waiting :");
|
|
try {
|
|
await this.driver.wait(webdriver.until.elementLocated(element), Twaittransaction,'Element NOT present.Time out.\n');
|
|
logger.info(" element present");
|
|
return true;
|
|
}
|
|
catch(err) {
|
|
logger.info(" element NOT present, "+ err);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
async isElementPresent(element) {
|
|
logger.info("is element present :");
|
|
try {
|
|
let field;
|
|
if (element.constructor.name!=="WebElement") {
|
|
field = await this.driver.findElement(element);
|
|
}
|
|
else field=element;
|
|
await field.isDisplayed();
|
|
logger.info(" element present");
|
|
return true;
|
|
}
|
|
catch (err) {
|
|
logger.info(" element NOT present");
|
|
return false;
|
|
}
|
|
}
|
|
|
|
async getTextByElement(element) {
|
|
logger.info("get text for element : ");
|
|
let result=await element.getText();
|
|
if(result.length<100) logger.info("text received: "+result);
|
|
return result;
|
|
}
|
|
|
|
async getAttribute(element,attr) {
|
|
logger.info("get attribute = "+attr+ "for element = "+element);
|
|
let field;
|
|
if (element.constructor.name!="WebElement") {
|
|
field = await this.driver.wait(webdriver.until.elementLocated(element), Twait);
|
|
}
|
|
else field = element;
|
|
let result=await field.getAttribute(attr);
|
|
logger.info("received value= "+result);
|
|
return result;
|
|
}
|
|
|
|
async getTextByLocatorFast(locator) {
|
|
logger.info("get text for locator fast:");
|
|
try {
|
|
await this.driver.wait(webdriver.until.elementLocated(locator), 500, 'Element ' + locator + 'NOT present.Time out.\n');
|
|
let result=await this.driver.findElement(locator).getText();
|
|
logger.info("received text: "+result);
|
|
return result;
|
|
}
|
|
catch(err) {
|
|
return "";
|
|
}
|
|
}
|
|
|
|
async getTextByLocator(locator) {
|
|
logger.info("get text for locator ");
|
|
try {
|
|
await this.driver.wait(webdriver.until.elementLocated(locator), Twait, 'Element ' + locator + 'NOT present.Time out.\n');
|
|
let result=await this.driver.findElement(locator).getText();
|
|
logger.info("received text: "+result);
|
|
return result;
|
|
}
|
|
catch(err) {
|
|
return "";
|
|
}
|
|
}
|
|
|
|
async getURL() {
|
|
logger.info("get current page URL ");
|
|
return await this.driver.getCurrentUrl();
|
|
}
|
|
|
|
async open (url) {
|
|
logger.info("open "+url);
|
|
await this.driver.get(url);
|
|
logger.info("Current URL: "+await this.driver.getCurrentUrl());
|
|
logger.info("Current HANDLE: "+await this.driver.getWindowHandle());
|
|
await this.driver.sleep(5000);
|
|
}
|
|
|
|
async clearField(element) {
|
|
|
|
logger.info("clear field :");
|
|
let field;
|
|
if (element.constructor.name!=="WebElement") {
|
|
field = await this.driver.wait(webdriver.until.elementLocated(element), Twait);
|
|
}
|
|
else field = element;
|
|
|
|
let s="";
|
|
let counter=3;
|
|
do {
|
|
await field.click();
|
|
await this.driver.sleep(500);
|
|
for (let i=0;i<40;i++) {
|
|
await field.sendKeys(key.BACK_SPACE);
|
|
}
|
|
await this.driver.sleep(500);
|
|
s=await field.getAttribute('value');
|
|
} while ((s!="")&&(counter-->0));
|
|
}
|
|
|
|
|
|
async clickWithWait(element) {
|
|
logger.info("click with wait" +element);
|
|
try {
|
|
let field;
|
|
if (element.constructor.name!=="WebElement") {
|
|
field = await this.driver.wait(webdriver.until.elementLocated(element), Twait);
|
|
}
|
|
else field = element;
|
|
await field.click();
|
|
// await field.sendKeys(key.TAB);
|
|
return true;
|
|
}
|
|
catch(err) {
|
|
logger.info("Can not click element"+ element);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
async waitUntilLocated(element) {
|
|
logger.info("wait until located");
|
|
try {
|
|
await this.driver.wait(webdriver.until.elementLocated(element), Twait);
|
|
}
|
|
catch(err) {
|
|
logger.info("Element "+ element+" has not appeared in"+ Twait+" sec.");
|
|
}
|
|
|
|
}
|
|
|
|
async fillWithWait(element,k) {
|
|
logger.info("fill with wait :");
|
|
try {
|
|
logger.info("fill:field: "+element +" with value = " + k);
|
|
let field;
|
|
if (element.constructor.name!="WebElement") {
|
|
field = await this.driver.wait(webdriver.until.elementLocated(element), Twait);
|
|
}
|
|
else field = element;
|
|
await field.sendKeys(k);
|
|
return true;
|
|
}
|
|
catch(err) {
|
|
logger.info("Element "+ element+" has not appeared in"+ Twait+" sec.");
|
|
return false;
|
|
}
|
|
}
|
|
|
|
async refresh() {
|
|
logger.info("refresh :");
|
|
await this.driver.navigate().refresh();
|
|
}
|
|
|
|
async findWithoutWait(element) {
|
|
logger.info("find with wait ");
|
|
try {
|
|
await this.driver.wait(webdriver.until.elementLocated(element), 1000);
|
|
return await this.driver.findElements(element);
|
|
}
|
|
catch(err) {
|
|
logger.info("Element "+ element+" have not appeared in"+ 1000+" sec.");
|
|
return null;
|
|
}
|
|
}
|
|
|
|
async findWithWait(element) {
|
|
logger.info("find with wait ");
|
|
try {
|
|
await this.driver.wait(webdriver.until.elementLocated(element), Twait);
|
|
return await this.driver.findElements(element);
|
|
}
|
|
catch(err) {
|
|
logger.info("Element "+ element+" have not appeared in"+ Twait+" sec.");
|
|
return null;
|
|
}
|
|
}
|
|
|
|
async isDisplayedLoader() {
|
|
logger.info("is loader displayed :");
|
|
try {
|
|
let s = await this.driver.findElement(loader).getAttribute("className");
|
|
if (s == "loading-container notdisplayed") {
|
|
logger.info("NOT displayed"+", s="+s);
|
|
return false;
|
|
}
|
|
else {
|
|
logger.info("displayed"+", s="+s);
|
|
return true;
|
|
}
|
|
}
|
|
catch (err) {
|
|
logger.info("can't find loader. "+err);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
async waitUntilLoaderGone() {
|
|
logger.info("wait until loader gone :");
|
|
try {
|
|
let counter = 0;
|
|
let limit=40;
|
|
do {
|
|
this.driver.sleep(1000);
|
|
await this.isDisplayedLoader();
|
|
if (counter++ > limit) throw ("Loading container displayed more than "+limit+" sec");
|
|
} while ((await this.isDisplayedLoader()));
|
|
}
|
|
catch(err) {
|
|
logger.info(err);
|
|
await this.refresh();
|
|
await this.driver.sleep(5000);
|
|
}
|
|
|
|
}
|
|
|
|
async goBack() {
|
|
logger.info("go back :")
|
|
this.driver.navigate().back();
|
|
}
|
|
|
|
async switchToNextPage(){
|
|
logger.info("switch to next tab :");
|
|
let allHandles=[];
|
|
let curHandle;
|
|
try {
|
|
allHandles = await this.driver.getAllWindowHandles();
|
|
curHandle = await this.driver.getWindowHandle();
|
|
if (allHandles.length>2) {
|
|
logger.info("Browser has more than 2 windows"+". \n"+ "Amount of window is "+ allHandles.length);
|
|
let arr=[];
|
|
arr[0]=allHandles[0];
|
|
arr[1]=allHandles[1];
|
|
allHandles=arr;
|
|
logger.info("New allHandles.length="+allHandles.length);
|
|
}
|
|
let handle;
|
|
for (let i = 0; i < allHandles.length; i++) {
|
|
if (curHandle != allHandles[i]) {
|
|
handle = allHandles[i];
|
|
break;
|
|
}
|
|
}
|
|
logger.info("Current handle = "+ curHandle);
|
|
logger.info("Switch to handle = "+ handle);
|
|
await this.driver.switchTo().window(handle);
|
|
}
|
|
catch (err){
|
|
logger.info("can't switch to next tab "+err+". \n"+ "amount of window is "+ allHandles.length);
|
|
logger.info("current handle: "+curHandle);
|
|
}
|
|
}
|
|
|
|
|
|
async isPresentAlert() {
|
|
|
|
logger.info("isPresentAlert:")
|
|
try {
|
|
|
|
let result = await this.driver.switchTo().alert().getText();
|
|
logger.info("alert text: "+result);
|
|
return true;
|
|
}
|
|
catch (err) {
|
|
|
|
logger.info(err);
|
|
return false;
|
|
}
|
|
}
|
|
async acceptAlert() {
|
|
|
|
logger.info("acceptAlert:")
|
|
try {
|
|
|
|
this.driver.switchTo().alert().accept();
|
|
return true;
|
|
}
|
|
catch (err) {
|
|
|
|
logger.info(err);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
}
|
|
module.exports.Page=Page;
|