如何在 Protractor JS 中为两种不同的浏览器设置一个测试用例?

How to set one test case for two different browsers in Protractor JS?

我想在两个不同的浏览器上 运行 相同的测试用例,但它应该为彼此输出另一个结果。

例如,查看下面的测试用例,其中一个测试步骤是截屏 仅适用于 Chrome,另一个应仅捕获适用于 FireFox 的屏幕截图。

注意测试用例中的注释,我已经为不同的浏览器复制了我想要 运行 的代码块。

请大家帮忙。

谢谢。

测试用例

describe ('Login', function() {
    beforeEach(function(){
        browser.ignoreSynchronization = true;
    });

    afterEach(function(){
        browser.ignoreSynchronization = false;
     });

    it ('Enter to the home page', function() {
        browser.driver.get('https://user:pass@www.website.com/');
        browser.driver.sleep(1000);
            expect (browser.driver.getCurrentUrl()).toContain('meet2know.com');
        browser.driver.sleep(3000);
        //--- Capture Screenshoot for FF---
        browser.driver.takeScreenshot().then(function(data){
            var base64Data = data.replace(/^data:image\/png;base64,/,"");
            var fs = require("fs");
                fs.writeFile("homePage.png", base64Data, 'base64', function(err) {
                if(err) console.log(err);
                });
        });
        //--- Capture Screenshoot for Chrome only ---
        browser.driver.takeScreenshot().then(function(data){
            var base64Data = data.replace(/^data:image\/png;base64,/,"");
            var fs = require("fs");
                fs.writeFile("homePage-chrome.png", base64Data, 'base64', function(err) {
                if(err) console.log(err);
                });
        });
    });
});

量角器会议

//var HtmlReporter = require('protractor-html-screenshot-reporter');
var path = require('path');
var fs = require("fs");
exports.config = {
  chromeDriver: 'npm/node_modules/protractor/selenium/chromedriver',
  chromeOnly: false,
  seleniumAddress: 'http://localhost:4444/wd/hub',

  specs: ['login.js'],
  // specs: ['login.js', 'onboarding.js'],

  //specs: ['./Scripts/*.js'],

  multiCapabilities: [{
  'browserName': 'firefox',
      'cli': {
      'args': ['webdriver.firefox.useExisting=default']
      // 'args': ['webdriver.firefox.useExisting=default', '-jsconsole', '-jsdebugger']
}}, {
  'browserName': 'chrome',
  'chromeOptions': {
    args: ['--test-type','--memory-metrics','--console','--crash-on-failure','--load-extension=' + 'C:\Users\idan\AppData\Local\Google\Chrome\User Data\Default\Extensions\idgpnmonknjnojddfkpgkljpfnnfcklj\1.2.4_0'] 
    } 
}],

  // rootElement: '.main',
  framework: "jasmine",
  allScriptsTimeout: 10000,
  getPageTimeout: 10000,
  onPrepare: function() {
    require('C:\automation\npm\node_modules\protractor\node_modules\jasmine-reporters');
    jasmine.getEnv().addReporter(
        new jasmine.JUnitXmlReporter('xmloutput', true, true)
    );
    browser.driver.manage().window().maximize();
    return browser.driver.get('http://user:pass@www.website.com');
  },

  jasmineNodeOpts: {
      onComplete: null,
      // If true, display spec names.
      isVerbose: true,
      // If true, print colors to the terminal.
      showColors: true,
      // If true, include stack traces in failures.
      includeStackTrace: true,
      // Default time to wait in ms before a test fails.
      defaultTimeoutInterval: 660000
    }
}

我相信您希望 运行 在 takeScreenshot() 之后有一个函数可以将屏幕截图保存到不同的文件中,具体取决于 运行ning 的浏览器。是吗?

如果是这样,您可以在 Protractor 中查询浏览器名称(请参阅 Get the current browser name in Protractor test)。您可以按照说明用名称修补 "browser"(使其更易于访问),或按需获取名称。使用它来命名您的文件看起来像这样:

browser.driver.takeScreenshot().then(function(data){
    var base64Data = data.replace(/^data:image\/png;base64,/,"");
    var fs = require("fs");
    return browser.getCapabilities().then(function (cap) {
        var browserName = cap.caps_.browserName;
        var fname = "homePage-" + browserName + ".png";
        fs.writeFile(fname, base64Data, 'base64', function(err) {
            if(err) console.log(err);
        });
    });
});

此外,您可能想使用 writeFileSync 或确保使用 promise 告诉 Protractor 等到您的屏幕截图被写入。 (解决完成处理程序中的承诺。)