javascript - 使用页面对象支持的 Protractor 测试多个浏览器

标签 javascript protractor pageobjects

我正在编写一个测试,其中两个浏览器需要交互。简单地 fork 浏览器的问题是我的页面对象仍然引用旧浏览器。我不想重写我所有的 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) 是否有其他解决方案不涉及重写我所有的采购订单?

最佳答案

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

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 来接受新的全局变量。 希望对您有所帮助!

干杯

关于javascript - 使用页面对象支持的 Protractor 测试多个浏览器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33481809/

相关文章:

java - 如何在 Appium Java 中创建适用于 Android 和 iOS 的页面对象模型

javascript - 如何从整数中切掉位

java - 在 Selenium 页面对象模型测试中重用登录功能

javascript - 分解 JavaScript 横幅 slider

angularjs - 如何编写自定义消息?

javascript - 从服务器异步加载的动态数据列表列表,用于使用 Protractor 进行测试

javascript - 在 Protractor 中设置 cookie

c# - webdriver html 元素的缩写定义

javascript - 提取两个标记之间的子字符串。第二个 token 可能丢失

javascript - Vue JS,为 JS 中创建的元素添加事件处理程序