我目前正在用 protractor /硒实现页面对象模式。

由于 protractor 中的每个方法都返回一个promise,为了方便起见,我页面对象中的方法也应返回promise。

另外,我的页面对象可能具有返回另一个页面对象或页面对象的自定义函数(例如LeftNavigation,MainContent)。代替返回页面对象本身,应该在promise中返回页面对象。目前,我并不真正不知道该怎么做。

另外,我想在不使用.then(..)方法的情况下链接我的方法调用。对于WebElement,可以在不调用.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;

你能给点建议吗?
我希望以某种方式清楚我要解释的内容:-)

问候

最佳答案

您不应该使PageObject成为 promise 。 PageObject应该是方法/属性工厂,因此不应成为执行流程中的约束。
我将通过返回具有属性的元素来简化操作,而不是尝试在构造函数中定位所有元素:

describe('Suite', function() {

    it('should module title be ...', function() {
        let pageAdmin = AdminBaseBage.get();
        let mContent = pageAdmin.mainContent;
        let titlePromise = mContent.getModuleTitle();
        expect(titlePromise).toEqual('module title');
    });

});


class MainContent {

    constructor() {

    }

    get element_module_title() { return element(By.css('#maincontent #moduleTitle')); }

    /**
     * Gets the title of the main content
     *
     * @returns {webdriver.promise.Promise<string>}
     */
    getModuleTitle() {
        return this.element_module_title.getText();
    }

}

09-19 15:06