量角器并行运行导致测试失败

时间:2015-11-06 10:00:58

标签: javascript protractor

我使用量角器进行自动化测试,此时所有测试都能正常运行。 但是如果我设置测试运行并行

添加到配置文件:

shardTestFiles: true,
maxInstances: 4,

测试将开始随机失败投掷'没有找到任何元素'和/或“失败的期望'异常。

有人可能会建议导致此问题的原因或解决方法吗?

当开始运行新的浏览器实例和Protractor关注它时,可能是测试失败的原因吗? (此刻我有大约20个spec文件,并且每个spec文件都在运行,启动新的浏览器实例)

环境:

Windows 7 x64
Protractor v2.1.0
Browser Chrome v46

1 个答案:

答案 0 :(得分:1)

解决我的问题我已经使用重写方法创建了一个elementFinder和ElementArrayFinder对象的包装器,还有一些额外的等待可见性和/或存在。

elementFinder.getText()和elementFinder.click()

的示例
function ElementFinderWrapper() {
    var conditions = protractor.ExpectedConditions;

    /**
    * Returns a wrapper for ElementFinder element.
    * @param {webdriver.Locator} locator
    */
    this.get = function(locator){
        return new Control(element(locator));
    };

    /**
    * Creates a wrapper for ElementFinder element.
    * @param {ElementFinder} element_finder
    * @constructor
    */
    function Control(element_finder) {

        /**
        * Returns the visible innerText of this element.
        * @returns {!webdriver.promise.Promise.<string>}
        */
        this.getText = function () {
            return browser.wait(conditions.presenceOf(element_finder), 3000);
               .then(function () {
                   return browser.wait(conditions.visibilityOf(element_finder), 3000);
               })
               .then(function () {
                   return element_finder.getText();
               });
        };

        /**
        * Clicks on visible element.
        * @returns {!webdriver.promise.Promise.<void>}
        */
        this.click = function () {
            return browser.wait(conditions.presenceOf(element_finder), 3000);
               .then(function () {
                   return browser.wait(conditions.visibilityOf(element_finder), 3000);
               })
               .then(function () {
                   return element_finder.click();
               });
        };
    };
};

然后使用类似的东西:

contol = ElementFinderWrapper.get(by.xpath('some path'));
control.getText();
control.click();