Using object composition instead of class inheritance for page objects

This commit is contained in:
witzig 2017-05-10 16:18:35 +02:00
parent f106cd2850
commit c3e9781dc4
6 changed files with 60 additions and 80 deletions

View file

@ -5,50 +5,47 @@ const webdriver = require('selenium-webdriver');
const By = webdriver.By;
const until = webdriver.until;
class Page {
constructor(driver, props) {
this.driver = driver;
this.props = props || {
elements: {}
};
}
module.exports = driver => ({
driver,
url: '/',
elements: {},
element(key) {
return this.driver.findElement(By.css(this.props.elements[key] || key));
}
return this.driver.findElement(By.css(this.elements[key] || key));
},
navigate() {
this.driver.navigate().to(config.baseUrl + this.props.url);
this.driver.navigate().to(config.baseUrl + this.url);
return this.waitUntilVisible();
}
},
waitUntilVisible() {
let selector = this.props.elements[this.props.elementToWaitFor];
if (!selector && this.props.url) {
selector = 'body.page--' + (this.props.url.substring(1).replace(/\//g, '--') || 'home');
let selector = this.elements[this.elementToWaitFor];
if (!selector && this.url) {
selector = 'body.page--' + (this.url.substring(1).replace(/\//g, '--') || 'home');
}
return selector ? this.driver.wait(until.elementLocated(By.css(selector))) : this.driver.sleep(1000);
}
},
submit() {
return this.element('submitButton').click();
}
},
click(key) {
return this.element(key).click();
}
},
getText(key) {
return this.element(key).getText();
}
},
getValue(key) {
return this.element(key).getAttribute('value');
}
},
setValue(key, value) {
return this.element(key).sendKeys(value);
}
},
containsText(str) {
// let text = await driver.findElement({ css: 'body' }).getText();
@ -56,6 +53,4 @@ class Page {
return (document.documentElement.textContent || document.documentElement.innerText).indexOf('${str}') > -1;
`);
}
}
module.exports = Page;
});