В настоящее время я реализую шаблон объекта страницы в транспортирторе/селене.Selenium/WebdriverJs/Protractor chain chain with page objects
Поскольку каждый метод в транспортирщике возвращает обещание, для удобства методы в моем объекте страницы также должны возвращать обещания.
Далее мои объекты страницы могут иметь функции, которые возвращают объект другой страницы или пользовательский объект страницы (например, LeftNavigation, MainContent). Вместо того, чтобы возвращать сам объект страницы, объект страницы должен быть возвращен в рамках обещания. В настоящее время я действительно не понимаю, как это сделать.
Кроме того, я хотел бы связать свои вызовы методов без использования метода .then (..). Для WebElements можно вызвать дополнительные функции, не вызывая метод .then (..), например.
browser.driver.findElement(By.css('#someid')).findElement(By.css('#somebutton')).click();
Я также хотел бы добиться этого с шаблоном страницы объекта:
let pagePromise = AdminBaseBage.get(); // returns a Promise<AdminBasePage>
let mContent = page.mainContent;// should return a Promise<MainContent>
let titlePromise = mContent.getModuleTitle(); // returns a Promise<string>
или даже лучше
AdminBaseBage.get().mainContent.getModuleTitle();
Ниже выпиской из моих PageObjects с некоторыми вопросами здесь:
AdminBasePage.js
var LeftNavigation = require('../../pageobject/LeftNavigation.js');
var MainContent = require('../../pageobject/MainContent.js');
class AdminBasePage {
constructor() {
this._leftNavigation = new LeftNavigation();
this._mainContent = new MainContent();
}
/**
* @returns {Promise<AdminBasePage>}
*/
static getPage() {
return browser.driver.get("index.php").then(function() {
return new AdminBasePage();
});
}
/**
* @returns <LoginPage>
*/
logout() {
this.leftNavigation.logout();
return new LoginPage(); //also here I would like to return a promise.
}
/**
* @returns {LeftNavigation}
*/
get leftNavigation() {
//Instead of return the object directly, I would like to return a promise here.
//But how?
return this._leftNavigation;
};
/**
* @returns {MainContent}
*/
get mainContent() {
//Instead of return the object directly, I would like to return a promise here.
//But how?
return this._mainContent;
};
}
module.exports = AdminBasePage;
MainContent.js
class MainContent {
constructor() {
/** @type {WebElementPromise} */
this._element_mainContent = this.webDriver.findElement(By.css('#maincontent'));
}
/**
* Gets the title of the main content
*
* @returns {webdriver.promise.Promise<string>}
*/
getMainContentTitle() {
return this._element_mainContent
.findElement(By.id('moduleTitle'))
.getText();
}
}
/** @type {MainContent} */
module.exports = MainContent;
Можете ли вы дать какие-либо рекомендации? Я надеюсь, что это как-то понятно, что я пытаюсь объяснить :-)
С уважением
Там нет необходимости для всех '.then', вы должны удалить их. –
Вот что я уже пробовал, но он не работает. Вот почему я использую '.then'. При попытке выполнить это: 'ожидать (page.mainContent.getPagination() getIntPaginationTotalNumber().) ToEqual (2);' Я получаю ошибку 'TypeError:. Не удается прочитать свойство" getPagination 'of undefined' Это потому, что 'page' в этом случае является обещанием (см. метод' AdminBasePage.getPage() '). – Stefan