Multiple browsers and the Page Object pattern

后端 未结 2 669
别那么骄傲
别那么骄傲 2020-12-31 07:31

We are using the Page Object pattern to organize our internal AngularJS application tests.

Here is an example page object we have:

var Logi         


        
2条回答
  •  半阙折子戏
    2020-12-31 08:31

    Maybe you could write few functions to make the the browser registration/start/switch smoother. (Basically it is your first option with some support.)

    For example:

    var browserRegistry = [];
    
    function openNewBrowser(){
      if(typeof browserRegistry[0] == 'undefined'){
        browseRegistry[0] = {
          browser: browser,
          element: element,
          $: $,
          $$: $$,
          ... whatever else you need.
        }
      }
      var tmp = browser.forkNewDriverInstance();
      var id = browserRegistry.length;
      browseRegistry[id] = {
          browser: tmp,
          element: tmp.element,
          $: tmp.$,
          $$: tmp.$$,
          ... whatever else you need.
      }
      switchToBrowserContext(id);
      return id;
    }
    function switchToBrowserContext(id){
      browser=browseRegistry[id].browser;
      element=browseRegistry[id].element;
      $=browseRegistry[id].$;
      $$=browseRegistry[id].$$;
    }
    

    And you use it this way in your example:

    describe("Login functionality", function () {
        var scope = {};
    
        beforeEach(function () {
            browser.get("/#login");
            scope.page1 = new LoginPage();
            openNewBrowser();
            browser.get("/#login");
            scope.page2 = new LoginPage();
        });
    
        it("should warn there is an opened session", function () {
            scope.page1.username.clear();
            scope.page1.username.sendKeys(login);
            scope.page1.password.sendKeys(password);
            scope.page1.loginButton.click();
    
            scope.page2.username.clear();
            scope.page2.username.sendKeys(login);
            scope.page2.password.sendKeys(password);
            scope.page2.loginButton.click();    
        });
    }); 
    

    So you can leave your page objects as they are.

    To be honest I think your second approach is cleaner... Using global variables can bite back later. But if you don't want to change your POs, this can also work.

    (I did not test it... sorry for the likely typos/errors.) (You can place the support functions to your protractor conf's onprepare section for example.)

提交回复
热议问题