【问题标题】:Testing multiple browsers with protractor backed by page objects使用由页面对象支持的量角器测试多个浏览器
【发布时间】:2015-11-02 16:02:26
【问题描述】:

我正在编写一个需要两个浏览器交互的测试。简单地分叉浏览器的问题是我的页面对象仍然引用旧浏览器。我不想重写我所有的 PO 以将浏览器作为参数,所以我尝试了下面链接中的第一个解决方案,他们用新浏览器的版本覆盖了全局变量:

Multiple browsers and the Page Object pattern

但是,更改全局变量似乎不起作用,因为我调用的所有后续页面对象函数都是针对原始浏览器实例执行的。我曾尝试在切换之前和之后记录窗口处理程序,它们确实不同,这只会让我更加困惑。这是一些代码。

规格:

var MultiBrowserFunctions = require('../common/multiBrowserFunctions.js');
var HomePage = require('../home/home.po.js');
describe('blah', function(){
    it('blah', function(){
        MultiBrowserFunctions.openNewBrowser(true);
        HomePage.initializePage();
    });
});

多浏览器功能:

(function() {
var browserRegistry = [];
module.exports = {
    openNewBrowser: function(isSameUrl){
        if(typeof browserRegistry[0] == 'undefined'){
            browserRegistry[0] = {
                    browser: browser,
                    element: element,
                    $: $,
                    $$: $$,
                }
          }
          var tmp = browser.forkNewDriverInstance(isSameUrl);
          var id = browserRegistry.length;
          browserRegistry[id] = {
              browser: tmp,
              element: tmp.element,
              $: tmp.$,
              $$: tmp.$$,
          }
          switchToBrowserContext(id);
          return id;
        },
    resetBrowserInstance : function(){
        browserRegistry.splice(1,browserRegistry.length);
        switchToBrowserContext(0);
    }
}

function switchToBrowserContext(id){
    console.log('---------------------------switching to browser: ' + id);
        browser=browserRegistry[id].browser;
        element=browserRegistry[id].element;
        $=browserRegistry[id].$;
        $$=browserRegistry[id].$$;
    }
}());

我的问题是: (1)为什么这不起作用? (2) 是否有其他不涉及重写我所有 po 的解决方案?

【问题讨论】:

  • 1.没有必要将你的导出包装在一个闭包中 2。这里没有足够的细节来找出问题所在。您提供的示例规范仅打开一个浏览器。你能添加一个更详细的例子吗?

标签: javascript protractor pageobjects


【解决方案1】:

您可以做的是,将浏览器保存在不同的变量中,然后通过实用程序或其他东西覆盖全局变量来在它们之间切换。

describe('Switching browsers back and forth', function () {
   var browserA, browserB;
   it('Browser Switch', function () {
       var browsers = {
           a : browser,
           b : browser.forkNewDriverInstance(true)
        };
        browserA = browsers.a;
        browserB = browsers.b;

        var browserAndElement = switchBrowser(browserB);
        browser = browserAndElement.browser;
        element = browserAndElement.element;
        //do your stuff

        var browserAndElement = switchBrowser(browserA);
        browser = browserAndElement.browser;
        element = browserAndElement.element;
        //do your stuff
    });
});

switchBrowser() 可能如下所示:

this.switchBrowser = function (currentBrowser) {
    browser = currentBrowser;
    element = currentBrowser.element;
    return {
        browser : browser,
        element : element
    }
}

通过这种方式,您不必重写您的 PO 来接收新的全局变量。 希望对您有所帮助!

干杯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-30
    • 2020-07-21
    • 2012-05-13
    • 2015-09-01
    相关资源
    最近更新 更多