webdriverio / visual-testing

Image comparison / visual regression testing for WebdriverIO
https://webdriver.io/docs/visual-testing
MIT License
110 stars 41 forks source link

TypeError: browser.saveFullPageScreen is not a function #110

Closed sdoigmm closed 1 year ago

sdoigmm commented 1 year ago

This is our wdio.conf.js:

const { join } = require('path')

exports.config = {
    //
    // ====================
    // Runner Configuration
    // ====================
    //
    //
    // ==================
    // Specify Test Files
    // ==================
    // Define which test specs should run. The pattern is relative to the directory
    // from which `wdio` was called.
    //
    // The specs are defined as an array of spec files (optionally using wildcards
    // that will be expanded). The test for each spec file will be run in a separate
    // worker process. In order to have a group of spec files run in the same worker
    // process simply enclose them in an array within the specs array.
    //
    // If you are calling `wdio` from an NPM script (see https://docs.npmjs.com/cli/run-script),
    // then the current working directory is where your `package.json` resides, so `wdio`
    // will be called from there.
    //

    specs: [

        //'./test/specs/**/sandbox-url.spec.js',

        // './test/specs/**/UK-products.spec.js', //passed
        // './test/specs/**/UK-solutions.spec.js', //passed except for dynamic content
        // './test/specs/**/UK-resources.spec.js', //passed except for dynamic content
        // './test/specs/**/UK-tempCategory.spec.js', //passed
        // './test/specs/**/UK-blogPages.spec.js', //passed
        // './test/specs/**/UK-megaMenu.spec.js', //passed

        // './test/specs/**/US-products.spec.js', //passed
        // './test/specs/**/US-solutions.spec.js', //passed
        // './test/specs/**/US-resources.spec.js', //passed
        // './test/specs/**/US-tempCategory.spec.js', //passed
        // './test/specs/**/US-blogPages.spec.js', //passed
        // './test/specs/**/US-megaMenu.spec.js', //7 pass, 1 fail

        './test/specs/**/AU-products.spec.js', //errors
        './test/specs/**/AU-solutions.spec.js', //passed
        './test/specs/**/AU-resources.spec.js', //passed
        './test/specs/**/AU-tempCategory.spec.js', //errors
        './test/specs/**/AU-blogPages.spec.js', //passed
        './test/specs/**/AU-megaMenu.spec.js', //errors

    ],
    // Patterns to exclude.
    exclude: [
        // 'path/to/excluded/files'
    ],
    //
    // ============
    // Capabilities
    // ============
    // Define your capabilities here. WebdriverIO can run multiple capabilities at the same
    // time. Depending on the number of capabilities, WebdriverIO launches several test
    // sessions. Within your capabilities you can overwrite the spec and exclude options in
    // order to group specific specs to a specific capability.
    //
    // First, you can define how many instances should be started at the same time. Let's
    // say you have 3 different capabilities (Chrome, Firefox, and Safari) and you have
    // set maxInstances to 1; wdio will spawn 3 processes. Therefore, if you have 10 spec
    // files and you set maxInstances to 10, all spec files will get tested at the same time
    // and 30 processes will get spawned. The property handles how many capabilities
    // from the same test should run tests.
    //
    maxInstances: 10,
    //
    // If you have trouble getting all important capabilities together, check out the
    // Sauce Labs platform configurator - a great tool to configure your capabilities:
    // https://saucelabs.com/platform/platform-configurator
    //
    capabilities: [
        {
            // maxInstances can get overwritten per capability. So if you have an in-house Selenium
            // grid with only 5 firefox instances available you can make sure that not more than
            // 5 instances get started at a time.
            maxInstances: 10,
            //
            browserName: 'chrome',

            acceptInsecureCerts: true
            // If outputDir is provided WebdriverIO can capture driver session logs
            // it is possible to configure which logTypes to include/exclude.
            // excludeDriverLogs: ['*'], // pass '*' to exclude all driver session logs
            // excludeDriverLogs: ['bugreport', 'server'],
        },
    ],
    //
    // ===================
    // Test Configurations
    // ===================
    // Define all options that are relevant for the WebdriverIO instance here
    //
    // Level of logging verbosity: trace | debug | info | warn | error | silent
    logLevel: 'error',
    //
    // Set specific log levels per logger
    // loggers:
    // - webdriver, webdriverio
    // - @wdio/browserstack-service, @wdio/devtools-service, @wdio/sauce-service
    // - @wdio/mocha-framework, @wdio/jasmine-framework
    // - @wdio/local-runner
    // - @wdio/sumologic-reporter
    // - @wdio/cli, @wdio/config, @wdio/utils
    // Level of logging verbosity: trace | debug | info | warn | error | silent
    // logLevels: {
    //     webdriver: 'info',
    //     '@wdio/appium-service': 'info'
    // },
    //
    // If you only want to run your tests until a specific amount of tests have failed use
    // bail (default is 0 - don't bail, run all tests).
    bail: 0,
    //
    // Set a base URL in order to shorten url command calls. If your `url` parameter starts
    // with `/`, the base url gets prepended, not including the path portion of your baseUrl.
    // If your `url` parameter starts without a scheme or `/` (like `some/path`), the base url
    // gets prepended directly.
    baseUrl: 'https://mandoemedia.com/',
    //
    // Default timeout for all waitFor* commands.
    waitforTimeout: 10000,
    //
    // Default timeout in milliseconds for request
    // if browser driver or grid doesn't send response
    connectionRetryTimeout: 500000,
    //
    // Default request retries count
    connectionRetryCount: 3,
    //
    // Test runner services
    // Services take over a specific job you don't want to take care of. They enhance
    // your test setup with almost no effort. Unlike plugins, they don't add new
    // commands. Instead, they hook themselves up into the test process.
    services: [['chromedriver'],
    ['image-comparison',
        {
            baselineFolder: join(process.cwd(), './tests/visualRegressionBaseline/'),
            formatImageName: '{tag}-{logName}',
            screenshotPath: join(process.cwd(), './tests/visualRegressionDiff/'),
            autoSaveBaseline: true,
            blockOutStatusBar: true,
            blockOutToolBar: true,
            clearRuntimeFolder: true,
            disableCSSAnimation: true
        }]
    ],

    // Framework you want to run your specs with.
    // The following are supported: Mocha, Jasmine, and Cucumber
    // see also: https://webdriver.io/docs/frameworks
    //
    // Make sure you have the wdio adapter package for the specific framework installed
    // before running any tests.
    framework: 'mocha',
    //
    // The number of times to retry the entire specfile when it fails as a whole
    // specFileRetries: 1,
    //
    // Delay in seconds between the spec file retry attempts
    // specFileRetriesDelay: 0,
    //
    // Whether or not retried specfiles should be retried immediately or deferred to the end of the queue
    // specFileRetriesDeferred: false,
    //
    // Test reporter for stdout.
    // The only one supported by default is 'dot'
    // see also: https://webdriver.io/docs/dot-reporter
    reporters: ['spec'/*['Allure',{
        outputDir:'allure-results',
        disableWebdriverStepsReporting: true,
        disableWebdriverScreenshotsReporting: false,
    }]*/],

    //
    // Options to be passed to Mocha.
    // See the full list at http://mochajs.org/
    mochaOpts: {
        ui: 'bdd',
        timeout: 6000000000
    },
    //
    // =====
    // Hooks
    // =====
    // WebdriverIO provides several hooks you can use to interfere with the test process in order to enhance
    // it and to build services around it. You can either apply a single function or an array of
    // methods to it. If one of them returns with a promise, WebdriverIO will wait until that promise got
    // resolved to continue.
    /**
     * Gets executed once before all workers get launched.
     * @param {Object} config wdio configuration object
     * @param {Array.<Object>} capabilities list of capabilities details
     */
    // onPrepare: function (config, capabilities) {
    // },
    /**
     * Gets executed before a worker process is spawned and can be used to initialise specific service
     * for that worker as well as modify runtime environments in an async fashion.
     * @param  {String} cid      capability id (e.g 0-0)
     * @param  {[type]} caps     object containing capabilities for session that will be spawn in the worker
     * @param  {[type]} specs    specs to be run in the worker process
     * @param  {[type]} args     object that will be merged with the main configuration once worker is initialized
     * @param  {[type]} execArgv list of string arguments passed to the worker process
     */
    // onWorkerStart: function (cid, caps, specs, args, execArgv) {
    // },
    /**
     * Gets executed just after a worker process has exited.
     * @param  {String} cid      capability id (e.g 0-0)
     * @param  {Number} exitCode 0 - success, 1 - fail
     * @param  {[type]} specs    specs to be run in the worker process
     * @param  {Number} retries  number of retries used
     */
    // onWorkerEnd: function (cid, exitCode, specs, retries) {
    // },
    /**
     * Gets executed just before initialising the webdriver session and test framework. It allows you
     * to manipulate configurations depending on the capability or spec.
     * @param {Object} config wdio configuration object
     * @param {Array.<Object>} capabilities list of capabilities details
     * @param {Array.<String>} specs List of spec file paths that are to be run
     * @param {String} cid worker id (e.g. 0-0)
     */
    // beforeSession: function (config, capabilities, specs, cid) {
    // },
    /**
     * Gets executed before test execution begins. At this point you can access to all global
     * variables like `browser`. It is the perfect place to define custom commands.
     * @param {Array.<Object>} capabilities list of capabilities details
     * @param {Array.<String>} specs        List of spec file paths that are to be run
     * @param {Object}         browser      instance of created browser/device session
     */
    // before: function (capabilities, specs) {
    // },
    /**
     * Runs before a WebdriverIO command gets executed.
     * @param {String} commandName hook command name
     * @param {Array} args arguments that command would receive
     */
    // beforeCommand: function (commandName, args) {
    // },
    /**
     * Hook that gets executed before the suite starts
     * @param {Object} suite suite details
     */
    // beforeSuite: function (suite) {
    // },
    /**
     * Function to be executed before a test (in Mocha/Jasmine) starts.
     */
    beforeTest: function (test, context) {
        browser.maximizeWindow();
    },
    /**
     * Hook that gets executed _before_ a hook within the suite starts (e.g. runs before calling
     * beforeEach in Mocha)
     */
    // beforeHook: function (test, context) {
    // },
    /**
     * Hook that gets executed _after_ a hook within the suite starts (e.g. runs after calling
     * afterEach in Mocha)
     */
    // afterHook: function (test, context, { error, result, duration, passed, retries }) {
    // },
    /**
     * Function to be executed after a test (in Mocha/Jasmine only)
     * @param {Object}  test             test object
     * @param {Object}  context          scope object the test was executed with
     * @param {Error}   result.error     error object in case the test fails, otherwise `undefined`
     * @param {Any}     result.result    return object of test function
     * @param {Number}  result.duration  duration of test
     * @param {Boolean} result.passed    true if test has passed, otherwise false
     * @param {Object}  result.retries   informations to spec related retries, e.g. `{ attempts: 0, limit: 0 }`
     */
    afterTest: function (test, context, { error, result, duration, passed, retries }) {
        if (error) {
            browser.takeScreenshot();
        }
    },

    /**
     * Hook that gets executed after the suite has ended
     * @param {Object} suite suite details
     */
    // afterSuite: function (suite) {
    // },
    /**
     * Runs after a WebdriverIO command gets executed
     * @param {String} commandName hook command name
     * @param {Array} args arguments that command would receive
     * @param {Number} result 0 - command success, 1 - command error
     * @param {Object} error error object if any
     */
    // afterCommand: function (commandName, args, result, error) {
    // },
    /**
     * Gets executed after all tests are done. You still have access to all global variables from
     * the test.
     * @param {Number} result 0 - test pass, 1 - test fail
     * @param {Array.<Object>} capabilities list of capabilities details
     * @param {Array.<String>} specs List of spec file paths that ran
     */
    // after: function (result, capabilities, specs) {
    // },
    /**
     * Gets executed right after terminating the webdriver session.
     * @param {Object} config wdio configuration object
     * @param {Array.<Object>} capabilities list of capabilities details
     * @param {Array.<String>} specs List of spec file paths that ran
     */
    // afterSession: function (config, capabilities, specs) {
    // },
    /**
     * Gets executed after all workers got shut down and the process is about to exit. An error
     * thrown in the onComplete hook will result in the test run failing.
     * @param {Object} exitCode 0 - success, 1 - fail
     * @param {Object} config wdio configuration object
     * @param {Array.<Object>} capabilities list of capabilities details
     * @param {<Object>} results object containing test results
     */
    // onComplete: function(exitCode, config, capabilities, results) {
    // },
    /**
    * Gets executed when a refresh happens.
    * @param {String} oldSessionId session ID of the old session
    * @param {String} newSessionId session ID of the new session
    */
    // onReload: function(oldSessionId, newSessionId) {
    // }    
}

//If headless is an argument, run Chrome in headless mode
if (process.argv.includes('headless')) {
    exports.config.capabilities[0]['goog:chromeOptions'] = {
        args: ["--headless"]
    };
}

This is an example of an AU test, AU-products.page.js:

` const HomePage = require('../pageobjects/home.page');

describe('Products page', () => {

beforeEach(async () => {

    await browser.maximizeWindow()
    await browser.setTimeout({ 'pageLoad': 1000000 })
    await browser.refresh()
});
afterEach(() => {
    browser.execute('window.localStorage.clear()');
    browser.deleteAllCookies()
    browser.execute('sessionStorage.clear()')

});

//  //===================================================Products- Features page secton 6 pages==============================================================================================================
it('should save Products-Features page screenshotsscreenshots', async () => {
    await browser.url('en-au/features/');
    await browser.pause(4000)
    // await (await HomePage.talktoSales).moveTo()
    // await browser.pause(15000)
    // await(await HomePage.intercomBtn).moveTo() 
    // await browser.pause(1000)       
    await browser.saveFullPageScreen('AU-prod-featuresPage', {});
});
it('should compare Products-Features page screenshots', async () => {
    await browser.url('en-au/features/');
    await browser.pause(4000)
    // await (await HomePage.talktoSales).moveTo()
    // await browser.pause(15000)
    // await(await HomePage.intercomBtn).moveTo() 
    // await browser.pause(1000) 
    await expect(await browser.checkFullPageScreen('AU-prod-featuresPage', { /* some options */ })).toEqual(0);
});
//  //===================================================Products- templates page secton 1==============================================================================================================
it('should save Products-Templates page screenshots', async () => {
    await browser.url('en-au/templates/');
    await browser.pause(4000)
    // await (await HomePage.talktoSales).moveTo()
    // await browser.pause(15000)
    // await(await HomePage.intercomBtn).moveTo() 
    // await browser.pause(1000) 

    await browser.saveFullPageScreen('AU-prod-templatesPage', {});
});
it('should compare Products-Templates page screenshots', async () => {
    await browser.url('en-au/templates/');
    await browser.pause(4000)
    // await (await HomePage.talktoSales).moveTo()
    // await browser.pause(15000)
    // await(await HomePage.intercomBtn).moveTo() 
    // await browser.pause(1000) 
    await expect(await browser.checkFullPageScreen('AU-prod-templatesPage', { /* some options */ })).toEqual(0);
});
//===================================================Products- how-it-works page secton 1==============================================================================================================
it('should save Products-how-it-works page screenshots', async () => {
    await browser.url('en-au/how-it-works/');
    await browser.pause(4000)
    // await (await HomePage.talktoSales).moveTo()
    // await browser.pause(15000)
    // await(await HomePage.intercomBtn).moveTo() 
    // await browser.pause(1000) 
    await browser.saveFullPageScreen('AU-prod-how-it-worksPage', {});
});
it('should compare Products-how-it-works page screenshots', async () => {
    await browser.url('en-au/how-it-works/');
    await browser.pause(4000)
    // await (await HomePage.talktoSales).moveTo()
    // await browser.pause(15000)
    // await(await HomePage.intercomBtn).moveTo() 
    // await browser.pause(1000) 
    await expect(await browser.checkFullPageScreen('AU-prod-how-it-worksPage', { /* some options */ })).toEqual(0);
});
//===================================================Products- industries2 page secton 1==============================================================================================================
it('should save Products-industries2 page screenshots', async () => {
    await browser.url('en-au/industries2/');
    await browser.pause(4000)
    // await (await HomePage.talktoSales).moveTo()
    // await browser.pause(15000)
    // await(await HomePage.intercomBtn).moveTo() 
    // await browser.pause(1000) 
    await browser.saveFullPageScreen('AU-prod-industries2Page', {});
});
it('should compare Products-industries2 page screenshots', async () => {
    await browser.url('en-au/industries2/');
    await browser.pause(4000)
    // await (await HomePage.talktoSales).moveTo()
    // await browser.pause(15000)
    // await(await HomePage.intercomBtn).moveTo() 
    // await browser.pause(1000) 
    await expect(await browser.checkFullPageScreen('AU-prod-industries2Page', { /* some options */ })).toEqual(0);
});
//===================================================Products- ids-getting-started-guide page secton 1==============================================================================================================
it('should save Products-ids-getting-started-guide page screenshots', async () => {
    await browser.url('en-au/ids-getting-started-guide/');
    await browser.pause(4000)
    // await (await HomePage.talktoSales).moveTo()
    // await browser.pause(15000)
    // await(await HomePage.intercomBtn).moveTo() 
    // await browser.pause(1000) 
    await browser.saveFullPageScreen('AU-prod-ids-getting-started-guidePage', {});
});
it('should compare Products-ids-getting-started-guide page screenshots', async () => {
    await browser.url('en-au/ids-getting-started-guide/');
    await browser.pause(4000)
    // await (await HomePage.talktoSales).moveTo()
    // await browser.pause(15000)
    // await(await HomePage.intercomBtn).moveTo() 
    // await browser.pause(1000) 
    await expect(await browser.checkFullPageScreen('AU-prod-ids-getting-started-guidePage', { /* some options */ })).toEqual(0);
});
//===================================================Products- download-player page secton 1==============================================================================================================
it('should save Products-download-player page screenshots', async () => {
    await browser.url('en-au/download-player/');
    await browser.pause(4000)
    // await (await HomePage.talktoSales).moveTo()
    // await browser.pause(15000)
    // await(await HomePage.intercomBtn).moveTo() 
    // await browser.pause(1000) 
    await browser.saveFullPageScreen('AU-prod-download-playerPage', {});
});
it('should compare Products-download-player page screenshots', async () => {
    await browser.url('en-au/download-player/');
    await browser.pause(4000)
    // await (await HomePage.talktoSales).moveTo()
    // await browser.pause(15000)
    // await(await HomePage.intercomBtn).moveTo() 
    // await browser.pause(1000) 
    await expect(await browser.checkFullPageScreen('AU-prod-download-playerPage', { /* some options */ })).toEqual(0);
});

});`

Currently, when running npx wdio wdio.conf.js I'm receiving errors:

`[0-0] TypeError in "Products page.should compare Products-Features page screenshots" TypeError: browser.checkFullPageScreen is not a function

or

[0-0] TypeError in "Products page.should save Products-Features page screenshotsscreenshots" TypeError: browser.saveFullPageScreen is not a function at Context. (\test\specs\UK-products.spec.js:23:23)

UK-products.spec.js:23: await browser.saveFullPageScreen('UK-prod-featuresPage', { }); `

Help appreciated.

wswebcreation commented 1 year ago

Thanks for raising an issue, can you share the logs in a gist by running npx wdio wdio.conf.js -- --logLevel=debug. I only need to have the first few lines of the logs where the services are instantiated. Secondly, can you also provide information like Node and npm version?

Thanks

sdoigmm commented 1 year ago

I cloned our remote webdriver repo into a different local directory, so I had to run npm install again. The error is no longer occurring. Looks like this answer had the same solution.

Cheers.

sdoigmm commented 1 year ago

Hi @wswebcreation,

The same error is reoccurring. I have not changed anything in my environment or test setup.

You had an extra -- in the npx wdio wdio.conf.js -- --logLevel=debug which had me stumped for while. Anyhow:

Node v18.13.0 npm v8.19.3

Execution of 1 workers started at 2023-02-01T08:37:46.663Z

2023-02-01T08:37:46.665Z DEBUG @wdio/utils:initialiseServices: initialise service "chromedriver" as NPM package
2023-02-01T08:37:46.752Z DEBUG @wdio/utils:initialiseServices: initialise service "image-comparison" as NPM package
2023-02-01T08:37:46.850Z INFO @wdio/cli:launcher: Run onPrepare hook
2023-02-01T08:37:46.854Z INFO chromedriver: Start Chromedriver (C:\Users\steve\OneDrive\Documents\Bit Bucket\mandoe-visual-testing-02\node_modules\chromedriver\lib\chromedriver\chromedriver.exe) with args --port=9515 --url-base=/
2023-02-01T08:37:49.417Z INFO chromedriver: Starting ChromeDriver 109.0.5414.74 (e7c5703604daa9cc128ccf5a5d3e993513758913-refs/branch-heads/5414@{#1172}) on port 9515
2023-02-01T08:37:49.418Z INFO chromedriver: Only local connections are allowed.
2023-02-01T08:37:49.419Z INFO chromedriver: Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe.       
2023-02-01T08:37:49.453Z INFO chromedriver: ChromeDriver was started successfully.
2023-02-01T08:37:49.515Z DEBUG @wdio/cli:utils: Finished to run "onPrepare" hook in 2664ms
2023-02-01T08:37:49.573Z INFO @wdio/cli:launcher: Run onWorkerStart hook
2023-02-01T08:37:49.574Z DEBUG @wdio/cli:utils: Finished to run "onWorkerStart" hook in 0ms
2023-02-01T08:37:49.577Z INFO @wdio/local-runner: Start worker 0-0 with arg: wdio.conf.js,--logLevel=debug
[0-0] 2023-02-01T08:37:51.247Z INFO @wdio/local-runner: Run worker command: run
[0-0] 2023-02-01T08:37:51.253Z DEBUG @wdio/config:ConfigParser: No compiler found, continue without compiling files
[0-0] 2023-02-01T08:37:51.258Z DEBUG @wdio/local-runner:utils: init remote session
[0-0] 2023-02-01T08:37:51.266Z DEBUG @wdio/utils:initialiseServices: initialise service "chromedriver" as NPM package
[0-0] 2023-02-01T08:37:51.437Z DEBUG @wdio/utils:initialiseServices: initialise service "image-comparison" as NPM package
wswebcreation commented 1 year ago

Tnx, can you share a bit more of the logs πŸ˜…

sdoigmm commented 1 year ago

@wswebcreation is this enough:

Execution of 1 workers started at 2023-02-02T01:16:36.860Z

2023-02-02T01:16:36.862Z DEBUG @wdio/utils:initialiseServices: initialise service "chromedriver" as NPM package
2023-02-02T01:16:37.006Z DEBUG @wdio/utils:initialiseServices: initialise service "image-comparison" as NPM package
2023-02-02T01:16:37.183Z INFO @wdio/cli:launcher: Run onPrepare hook
2023-02-02T01:16:37.187Z INFO chromedriver: Start Chromedriver (C:\Users\steve\OneDrive\Documents\Bit Bucket\mandoe-visual-testing-02\node_modules\chromedriver\lib\chromedriver\chromedriver.exe) with args --port=9515 --url-base=/
2023-02-02T01:16:38.297Z INFO chromedriver: Starting ChromeDriver 109.0.5414.74 (e7c5703604daa9cc128ccf5a5d3e993513758913-refs/branch-heads/5414@{#1172}) on port 9515
2023-02-02T01:16:38.298Z INFO chromedriver: Only local connections are allowed.
2023-02-02T01:16:38.298Z INFO chromedriver: Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe.
2023-02-02T01:16:38.337Z INFO chromedriver: ChromeDriver was started successfully.
2023-02-02T01:16:38.379Z DEBUG @wdio/cli:utils: Finished to run "onPrepare" hook in 1195ms
2023-02-02T01:16:38.458Z INFO @wdio/cli:launcher: Run onWorkerStart hook
2023-02-02T01:16:38.458Z DEBUG @wdio/cli:utils: Finished to run "onWorkerStart" hook in 0ms
2023-02-02T01:16:38.460Z INFO @wdio/local-runner: Start worker 0-0 with arg: wdio.conf.js,--logLevel=debug
[0-0] 2023-02-02T01:16:40.416Z INFO @wdio/local-runner: Run worker command: run
[0-0] 2023-02-02T01:16:40.423Z DEBUG @wdio/config:ConfigParser: No compiler found, continue without compiling files
[0-0] 2023-02-02T01:16:40.429Z DEBUG @wdio/local-runner:utils: init remote session
[0-0] 2023-02-02T01:16:40.435Z DEBUG @wdio/utils:initialiseServices: initialise service "chromedriver" as NPM package
[0-0] 2023-02-02T01:16:40.565Z DEBUG @wdio/utils:initialiseServices: initialise service "image-comparison" as NPM package
[0-0] 
[0-0] 
[0-0] 
[0-0] ##############################
[0-0] !!CLEARING!!
[0-0] ##############################
[0-0] 
[0-0] 
[0-0] 
[0-0] RUNNING in chrome - C:\Users\steve\OneDrive\Documents\Bit Bucket\mandoe-visual-testing-02\test\specs\AU-solutions.spec.js
[0-0] 2023-02-02T01:16:56.192Z DEBUG @wdio/local-runner:utils: init remote session
[0-0] 2023-02-02T01:16:56.193Z INFO webdriver: Initiate new session using the WebDriver protocol
[0-0] 2023-02-02T01:16:56.324Z INFO webdriver: [POST] http://localhost:9515/session
[0-0] 2023-02-02T01:16:56.324Z INFO webdriver: DATA {
[0-0]   capabilities: {
[0-0]     alwaysMatch: { browserName: 'chrome', acceptInsecureCerts: true },
[0-0]     firstMatch: [ {} ]
[0-0]   },
[0-0]   desiredCapabilities: { browserName: 'chrome', acceptInsecureCerts: true }
[0-0] }

DevTools listening on ws://127.0.0.1:55270/devtools/browser/ca337c5d-a3f4-4ab8-9491-8dee1580ace4
[0-0] 2023-02-02T01:16:56.914Z INFO wdio-image-comparison-service: Adding commands to global browser
[0-0] 2023-02-02T01:16:56.915Z DEBUG @wdio/utils:shim: Finished to run "before" hook in 0ms
[0-0] 2023-02-02T01:16:56.924Z INFO webdriver: COMMAND maximizeWindow()
[0-0] 2023-02-02T01:16:56.925Z INFO webdriver: [POST] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/window/maximize
[0-0] 2023-02-02T01:16:57.057Z INFO webdriver: RESULT { height: 1048, width: 1936, x: -8, y: -8 }
[0-0] 2023-02-02T01:16:57.058Z INFO webdriver: COMMAND setTimeouts(undefined, 1000000, undefined)
[0-0] 2023-02-02T01:16:57.058Z INFO webdriver: [POST] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/timeouts
[0-0] 2023-02-02T01:16:57.058Z INFO webdriver: DATA { pageLoad: 1000000 }
[0-0] 2023-02-02T01:16:57.061Z INFO webdriver: COMMAND refresh()
[0-0] 2023-02-02T01:16:57.061Z INFO webdriver: [POST] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/refresh
[0-0] 2023-02-02T01:16:57.080Z INFO webdriver: COMMAND maximizeWindow()
[0-0] 2023-02-02T01:16:57.081Z INFO webdriver: [POST] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/window/maximize
[0-0] 2023-02-02T01:16:57.081Z DEBUG @wdio/utils:shim: Finished to run "beforeTest" hook in 1ms
[0-0] 2023-02-02T01:16:57.082Z INFO webdriver: COMMAND navigateTo("https://mandoemedia.com/en-au/industries/hospitality/")
[0-0] 2023-02-02T01:16:57.082Z INFO webdriver: [POST] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/url
[0-0] 2023-02-02T01:16:57.082Z INFO webdriver: DATA { url: 'https://mandoemedia.com/en-au/industries/hospitality/' }
[0-0] 2023-02-02T01:16:57.089Z INFO webdriver: RESULT { height: 1048, width: 1936, x: -8, y: -8 }
[6512:21616:0202/091702.102:ERROR:device_event_log_impl.cc(215)] [09:17:02.102] USB: usb_service_win.cc:415 Could not read device interface GUIDs: The system cannot find the file specified. (0x2)
[6512:21616:0202/091702.109:ERROR:device_event_log_impl.cc(215)] [09:17:02.109] USB: usb_device_handle_win.cc:1046 Failed to read descriptor from node connection: A device attached to the system is not functioning. (0x1F)
[6512:21616:0202/091702.112:ERROR:device_event_log_impl.cc(215)] [09:17:02.112] USB: usb_device_handle_win.cc:1046 Failed to read descriptor from node connection: A device attached to the system is not functioning. (0x1F)
[6512:21616:0202/091702.171:ERROR:device_event_log_impl.cc(215)] [09:17:02.172] USB: usb_device_handle_win.cc:1046 Failed to read descriptor from node connection: A device attached to the system is not functioning. (0x1F)
[0-0] 2023-02-02T01:17:11.413Z INFO webdriver: COMMAND saveFullPageScreen("AU-sol-hospitalityPage", <object>)
[0-0] 2023-02-02T01:17:11.414Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-0] 2023-02-02T01:17:11.414Z INFO webdriver: [POST] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/execute/sync
[0-0] 2023-02-02T01:17:11.415Z INFO webdriver: DATA { script: 'hideScrollBars(...) [258 bytes]', args: [ true ] }
[0-0] 2023-02-02T01:17:11.423Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-0] 2023-02-02T01:17:11.424Z INFO webdriver: [POST] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/execute/sync
[0-0] 2023-02-02T01:17:11.424Z INFO webdriver: DATA {
[0-0]   script: 'setCustomCss(...) [1396 bytes]',
[0-0]   args: [
[0-0]     {
[0-0]       addressBarPadding: 0,
[0-0]       disableCSSAnimation: true,
[0-0]       id: 'pic-css',
[0-0]       toolBarPadding: 0
[0-0]     }
[0-0]   ]
[0-0] }
[0-0] 2023-02-02T01:17:11.433Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-0] 2023-02-02T01:17:11.433Z INFO webdriver: [POST] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/execute/sync
[0-0] 2023-02-02T01:17:11.433Z INFO webdriver: DATA { script: 'getScreenDimensions(...) [1221 bytes]', args: [] }
[0-0] 2023-02-02T01:17:11.467Z INFO webdriver: RESULT {
[0-0]   dimensions: {
[0-0]     body: { offsetHeight: 9392, scrollHeight: 9392 },
[0-0]     html: {
[0-0]       clientHeight: 916,
[0-0]       clientWidth: 1920,
[0-0]       offsetHeight: 9392,
[0-0]       scrollHeight: 9392,
[0-0]       scrollWidth: 1920
[0-0]     },
[0-0]     window: {
[0-0]       devicePixelRatio: 1,
[0-0]       innerHeight: 916,
[0-0]       innerWidth: 1920,
[0-0]       outerHeight: 1032,
[0-0]       outerWidth: 1920,
[0-0]       screenHeight: 1080,
[0-0]       screenWidth: 1920
[0-0]     }
[0-0]   }
[0-0] }
[0-0] 2023-02-02T01:17:11.469Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-0] 2023-02-02T01:17:11.470Z INFO webdriver: [POST] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/execute/sync
[0-0] 2023-02-02T01:17:11.470Z INFO webdriver: DATA { script: 'scrollToPosition(...) [155 bytes]', args: [ 0 ] }
[0-0] 2023-02-02T01:17:12.993Z INFO webdriver: COMMAND takeScreenshot()
[0-0] 2023-02-02T01:17:12.994Z INFO webdriver: [GET] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/screenshot
[0-0] 2023-02-02T01:17:13.160Z INFO webdriver: RESULT iVBORw0KGgoAAAANSUhEUgAAB4AAAAOUCAYAAABDqi5YAAAAAXNSR0IArs4c6...
[0-0] 2023-02-02T01:17:13.163Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-0] 2023-02-02T01:17:13.164Z INFO webdriver: [POST] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/execute/sync
[0-0] 2023-02-02T01:17:13.164Z INFO webdriver: DATA { script: 'getDocumentScrollHeight(...) [1384 bytes]', args: [] }
[0-0] 2023-02-02T01:17:13.266Z INFO webdriver: RESULT 9392
[0-0] 2023-02-02T01:17:13.266Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-0] 2023-02-02T01:17:13.266Z INFO webdriver: [POST] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/execute/sync
[0-0] 2023-02-02T01:17:13.267Z INFO webdriver: DATA { script: 'scrollToPosition(...) [155 bytes]', args: [ 916 ] }
[0-0] 2023-02-02T01:17:14.786Z INFO webdriver: COMMAND takeScreenshot()
[0-0] 2023-02-02T01:17:14.786Z INFO webdriver: [GET] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/screenshot
[0-0] 2023-02-02T01:17:14.978Z INFO webdriver: RESULT iVBORw0KGgoAAAANSUhEUgAAB4AAAAOUCAYAAABDqi5YAAAAAXNSR0IArs4c6...
[0-0] 2023-02-02T01:17:14.982Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-0] 2023-02-02T01:17:14.982Z INFO webdriver: [POST] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/execute/sync
[0-0] 2023-02-02T01:17:14.982Z INFO webdriver: DATA { script: 'getDocumentScrollHeight(...) [1384 bytes]', args: [] }
[0-0] 2023-02-02T01:17:14.989Z INFO webdriver: RESULT 9392
[0-0] 2023-02-02T01:17:14.990Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-0] 2023-02-02T01:17:14.990Z INFO webdriver: [POST] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/execute/sync
[0-0] 2023-02-02T01:17:14.990Z INFO webdriver: DATA { script: 'scrollToPosition(...) [155 bytes]', args: [ 1832 ] }
[0-0] 2023-02-02T01:17:16.510Z INFO webdriver: COMMAND takeScreenshot()
[0-0] 2023-02-02T01:17:16.511Z INFO webdriver: [GET] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/screenshot
[0-0] 2023-02-02T01:17:16.794Z INFO webdriver: RESULT iVBORw0KGgoAAAANSUhEUgAAB4AAAAOUCAYAAABDqi5YAAAAAXNSR0IArs4c6...
[0-0] 2023-02-02T01:17:16.798Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-0] 2023-02-02T01:17:16.799Z INFO webdriver: [POST] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/execute/sync
[0-0] 2023-02-02T01:17:16.799Z INFO webdriver: DATA { script: 'getDocumentScrollHeight(...) [1384 bytes]', args: [] }
[0-0] 2023-02-02T01:17:16.806Z INFO webdriver: RESULT 9392
[0-0] 2023-02-02T01:17:16.806Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-0] 2023-02-02T01:17:16.807Z INFO webdriver: [POST] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/execute/sync
[0-0] 2023-02-02T01:17:16.807Z INFO webdriver: DATA { script: 'scrollToPosition(...) [155 bytes]', args: [ 2748 ] }
[0-0] 2023-02-02T01:17:18.315Z INFO webdriver: COMMAND takeScreenshot()
[0-0] 2023-02-02T01:17:18.316Z INFO webdriver: [GET] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/screenshot
[0-0] 2023-02-02T01:17:18.487Z INFO webdriver: RESULT iVBORw0KGgoAAAANSUhEUgAAB4AAAAOUCAYAAABDqi5YAAAAAXNSR0IArs4c6...
[0-0] 2023-02-02T01:17:18.489Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-0] 2023-02-02T01:17:18.490Z INFO webdriver: [POST] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/execute/sync
[0-0] 2023-02-02T01:17:18.490Z INFO webdriver: DATA { script: 'getDocumentScrollHeight(...) [1384 bytes]', args: [] }
[0-0] 2023-02-02T01:17:18.495Z INFO webdriver: RESULT 9392
[0-0] 2023-02-02T01:17:18.495Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-0] 2023-02-02T01:17:18.496Z INFO webdriver: [POST] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/execute/sync
[0-0] 2023-02-02T01:17:18.496Z INFO webdriver: DATA { script: 'scrollToPosition(...) [155 bytes]', args: [ 3664 ] }
[0-0] 2023-02-02T01:17:20.015Z INFO webdriver: COMMAND takeScreenshot()
[0-0] 2023-02-02T01:17:20.016Z INFO webdriver: [GET] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/screenshot
[0-0] 2023-02-02T01:17:20.225Z INFO webdriver: RESULT iVBORw0KGgoAAAANSUhEUgAAB4AAAAOUCAYAAABDqi5YAAAAAXNSR0IArs4c6...
[0-0] 2023-02-02T01:17:20.229Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-0] 2023-02-02T01:17:20.229Z INFO webdriver: [POST] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/execute/sync
[0-0] 2023-02-02T01:17:20.229Z INFO webdriver: DATA { script: 'getDocumentScrollHeight(...) [1384 bytes]', args: [] }
[0-0] 2023-02-02T01:17:20.239Z INFO webdriver: RESULT 9392
[0-0] 2023-02-02T01:17:20.239Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-0] 2023-02-02T01:17:20.240Z INFO webdriver: [POST] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/execute/sync
[0-0] 2023-02-02T01:17:20.240Z INFO webdriver: DATA { script: 'scrollToPosition(...) [155 bytes]', args: [ 4580 ] }
[0-0] 2023-02-02T01:17:21.761Z INFO webdriver: COMMAND takeScreenshot()
[0-0] 2023-02-02T01:17:21.762Z INFO webdriver: [GET] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/screenshot
[0-0] 2023-02-02T01:17:22.046Z INFO webdriver: RESULT iVBORw0KGgoAAAANSUhEUgAAB4AAAAOUCAYAAABDqi5YAAAAAXNSR0IArs4c6...
[0-0] 2023-02-02T01:17:22.051Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-0] 2023-02-02T01:17:22.052Z INFO webdriver: [POST] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/execute/sync
[0-0] 2023-02-02T01:17:22.052Z INFO webdriver: DATA { script: 'getDocumentScrollHeight(...) [1384 bytes]', args: [] }
[0-0] 2023-02-02T01:17:22.059Z INFO webdriver: RESULT 9392
[0-0] 2023-02-02T01:17:22.060Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-0] 2023-02-02T01:17:22.060Z INFO webdriver: [POST] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/execute/sync
[0-0] 2023-02-02T01:17:22.060Z INFO webdriver: DATA { script: 'scrollToPosition(...) [155 bytes]', args: [ 5496 ] }
[0-0] 2023-02-02T01:17:23.575Z INFO webdriver: COMMAND takeScreenshot()
[0-0] 2023-02-02T01:17:23.576Z INFO webdriver: [GET] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/screenshot
[0-0] 2023-02-02T01:17:23.923Z INFO webdriver: RESULT iVBORw0KGgoAAAANSUhEUgAAB4AAAAOUCAYAAABDqi5YAAAAAXNSR0IArs4c6...
[0-0] 2023-02-02T01:17:23.931Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-0] 2023-02-02T01:17:23.931Z INFO webdriver: [POST] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/execute/sync
[0-0] 2023-02-02T01:17:23.931Z INFO webdriver: DATA { script: 'getDocumentScrollHeight(...) [1384 bytes]', args: [] }
[0-0] 2023-02-02T01:17:23.937Z INFO webdriver: RESULT 9392
[0-0] 2023-02-02T01:17:23.937Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-0] 2023-02-02T01:17:23.938Z INFO webdriver: [POST] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/execute/sync
[0-0] 2023-02-02T01:17:23.938Z INFO webdriver: DATA { script: 'scrollToPosition(...) [155 bytes]', args: [ 6412 ] }
[0-0] 2023-02-02T01:17:25.460Z INFO webdriver: COMMAND takeScreenshot()
[0-0] 2023-02-02T01:17:25.460Z INFO webdriver: [GET] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/screenshot
[0-0] 2023-02-02T01:17:25.835Z INFO webdriver: RESULT iVBORw0KGgoAAAANSUhEUgAAB4AAAAOUCAYAAABDqi5YAAAAAXNSR0IArs4c6...
[0-0] 2023-02-02T01:17:25.840Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-0] 2023-02-02T01:17:25.840Z INFO webdriver: [POST] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/execute/sync
[0-0] 2023-02-02T01:17:25.840Z INFO webdriver: DATA { script: 'getDocumentScrollHeight(...) [1384 bytes]', args: [] }
[0-0] 2023-02-02T01:17:25.846Z INFO webdriver: RESULT 9392
[0-0] 2023-02-02T01:17:25.846Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-0] 2023-02-02T01:17:25.847Z INFO webdriver: [POST] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/execute/sync
[0-0] 2023-02-02T01:17:25.847Z INFO webdriver: DATA { script: 'scrollToPosition(...) [155 bytes]', args: [ 7328 ] }
[0-0] 2023-02-02T01:17:27.372Z INFO webdriver: COMMAND takeScreenshot()
[0-0] 2023-02-02T01:17:27.372Z INFO webdriver: [GET] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/screenshot
[0-0] 2023-02-02T01:17:27.540Z INFO webdriver: RESULT iVBORw0KGgoAAAANSUhEUgAAB4AAAAOUCAYAAABDqi5YAAAAAXNSR0IArs4c6...
[0-0] 2023-02-02T01:17:27.542Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-0] 2023-02-02T01:17:27.542Z INFO webdriver: [POST] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/execute/sync
[0-0] 2023-02-02T01:17:27.542Z INFO webdriver: DATA { script: 'getDocumentScrollHeight(...) [1384 bytes]', args: [] }
[0-0] 2023-02-02T01:17:27.549Z INFO webdriver: RESULT 9392
[0-0] 2023-02-02T01:17:27.549Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-0] 2023-02-02T01:17:27.549Z INFO webdriver: [POST] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/execute/sync
[0-0] 2023-02-02T01:17:27.549Z INFO webdriver: DATA { script: 'scrollToPosition(...) [155 bytes]', args: [ 8244 ] }
[0-0] 2023-02-02T01:17:29.060Z INFO webdriver: COMMAND takeScreenshot()
[0-0] 2023-02-02T01:17:29.060Z INFO webdriver: [GET] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/screenshot
[0-0] 2023-02-02T01:17:29.269Z INFO webdriver: RESULT iVBORw0KGgoAAAANSUhEUgAAB4AAAAOUCAYAAABDqi5YAAAAAXNSR0IArs4c6...
[0-0] 2023-02-02T01:17:29.271Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-0] 2023-02-02T01:17:29.271Z INFO webdriver: [POST] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/execute/sync
[0-0] 2023-02-02T01:17:29.271Z INFO webdriver: DATA { script: 'getDocumentScrollHeight(...) [1384 bytes]', args: [] }
[0-0] 2023-02-02T01:17:29.277Z INFO webdriver: RESULT 9392
[0-0] 2023-02-02T01:17:29.277Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-0] 2023-02-02T01:17:29.277Z INFO webdriver: [POST] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/execute/sync
[0-0] 2023-02-02T01:17:29.277Z INFO webdriver: DATA { script: 'scrollToPosition(...) [155 bytes]', args: [ 9160 ] }
[0-0] 2023-02-02T01:17:30.795Z INFO webdriver: COMMAND takeScreenshot()
[0-0] 2023-02-02T01:17:30.795Z INFO webdriver: [GET] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/screenshot
[0-0] 2023-02-02T01:17:30.944Z INFO webdriver: RESULT iVBORw0KGgoAAAANSUhEUgAAB4AAAAOUCAYAAABDqi5YAAAAAXNSR0IArs4c6...
[0-0] 2023-02-02T01:17:30.945Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-0] 2023-02-02T01:17:30.945Z INFO webdriver: [POST] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/execute/sync
[0-0] 2023-02-02T01:17:30.945Z INFO webdriver: DATA { script: 'getDocumentScrollHeight(...) [1384 bytes]', args: [] }
[0-0] 2023-02-02T01:17:30.953Z INFO webdriver: RESULT 9392
[0-0] 2023-02-02T01:17:33.518Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-0] 2023-02-02T01:17:33.519Z INFO webdriver: [POST] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/execute/sync
[0-0] 2023-02-02T01:17:33.519Z INFO webdriver: DATA { script: 'hideScrollBars(...) [258 bytes]', args: [ false ] }
[0-0] 2023-02-02T01:17:33.532Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-0] 2023-02-02T01:17:33.532Z INFO webdriver: [POST] http://localhost:9515/session/53714d5b5c29515b45060a60e16cbee8/execute/sync
[0-0] 2023-02-02T01:17:33.532Z INFO webdriver: DATA {
[0-0]   script: 'removeElementFromDom(...) [197 bytes]',
[0-0]   args: [ 'pic-css' ]
[0-0] }
[0-0] 2023-02-02T01:17:33.540Z INFO webdriver: RESULT {
[0-0]   fileName: 'AU-sol-hospitalityPage-.png',
[0-0]   path: 'C:\\Users\\steve\\OneDrive\\Documents\\Bit Bucket\\mandoe-visual-testing-02\\tests\\visualRegressionDiff\\actual',
[0-0]   devicePixelRatio: 1
[0-0] }
wswebcreation commented 1 year ago

Hi @sdoigmm

I can't see what the error is in the logs. The service is added correctly, you are able to create a screenshot with the saveFullPageScreen command which also means that the commands are added.

sdoigmm commented 1 year ago

Hi @wswebcreation

In the interim, I have powered off my laptop, rebooted, connected ExpressVPN to connect to a UK VPN, and run some of my UK subdirectory tests, e.g. on https://mandoemedia.com/en-gb/*

They all passed.

I disconnect from ExpressVPN, reconnect to a USA VPN, and run some of my USA main website tests, e.g. http://mandoemedia.com/* and they all fail, with the original error

TypeError: browser.saveFullPageScreen is not a function

Here is some of the log output running some of the USA tests:

[0-2] 2023-02-02T12:41:11.531Z INFO webdriver: COMMAND navigateTo("https://mandoemedia.com/blog/topic/case-studies/")
[0-2] 2023-02-02T12:41:11.532Z INFO webdriver: [POST] http://localhost:9515/session/0a064493906d9e543721cb82a6f4aa2d/url
[0-2] 2023-02-02T12:41:11.532Z INFO webdriver: DATA { url: 'https://mandoemedia.com/blog/topic/case-studies/' }
[0-2] 2023-02-02T12:41:11.588Z INFO webdriver: RESULT { height: 1048, width: 1936, x: -8, y: -8 }
[0-0] 2023-02-02T12:41:13.225Z INFO webdriver: COMMAND takeScreenshot()
[0-0] 2023-02-02T12:41:13.225Z INFO webdriver: [GET] http://localhost:9515/session/b47af9b82cdc504d3b0bee3ac01d28fa/screenshot
[0-0] 2023-02-02T12:41:13.225Z DEBUG @wdio/utils:shim: Finished to run "afterTest" hook in 1ms
[0-0] TypeError in "Products page.should compare Products-how-it-works page screenshots"
TypeError: browser.checkFullPageScreen is not a function
    at Context.<anonymous> (C:\Users\steve\OneDrive\Documents\Bit Bucket\mandoe-visual-testing-02\test\specs\US-products.spec.js:71:34)
[0-0] 2023-02-02T12:41:13.229Z INFO webdriver: COMMAND deleteAllCookies()
[0-0] 2023-02-02T12:41:13.230Z INFO webdriver: [DELETE] http://localhost:9515/session/b47af9b82cdc504d3b0bee3ac01d28fa/cookie
[0-0] 2023-02-02T12:41:13.231Z INFO webdriver: COMMAND executeScript("sessionStorage.clear()", <object>)
[0-0] 2023-02-02T12:41:13.231Z INFO webdriver: [POST] http://localhost:9515/session/b47af9b82cdc504d3b0bee3ac01d28fa/execute/sync
[0-0] 2023-02-02T12:41:13.232Z INFO webdriver: DATA { script: 'sessionStorage.clear()', args: [] }
[0-0] 2023-02-02T12:41:13.234Z INFO webdriver: COMMAND executeScript("window.localStorage.clear()", <object>)
[0-0] 2023-02-02T12:41:13.234Z INFO webdriver: [POST] http://localhost:9515/session/b47af9b82cdc504d3b0bee3ac01d28fa/execute/sync
[0-0] 2023-02-02T12:41:13.234Z INFO webdriver: DATA { script: 'window.localStorage.clear()', args: [] }
[0-0] 2023-02-02T12:41:13.237Z INFO webdriver: COMMAND maximizeWindow()
[0-0] 2023-02-02T12:41:13.237Z INFO webdriver: [POST] http://localhost:9515/session/b47af9b82cdc504d3b0bee3ac01d28fa/window/maximize
[0-0] 2023-02-02T12:41:13.595Z INFO webdriver: RESULT iVBORw0KGgoAAAANSUhEUgAAB4AAAAOUCAYAAABDqi5YAAAAAXNSR0IArs4c6...
[0-0] 2023-02-02T12:41:13.700Z INFO webdriver: RESULT { height: 1048, width: 1936, x: -8, y: -8 }
[0-0] 2023-02-02T12:41:13.701Z INFO webdriver: COMMAND setTimeouts(undefined, 1000000, undefined)
[0-0] 2023-02-02T12:41:13.701Z INFO webdriver: [POST] http://localhost:9515/session/b47af9b82cdc504d3b0bee3ac01d28fa/timeouts
[0-0] 2023-02-02T12:41:13.701Z INFO webdriver: DATA { pageLoad: 1000000 }
[0-0] 2023-02-02T12:41:13.704Z INFO webdriver: COMMAND refresh()
[0-0] 2023-02-02T12:41:13.704Z INFO webdriver: [POST] http://localhost:9515/session/b47af9b82cdc504d3b0bee3ac01d28fa/refresh
[0-0] 2023-02-02T12:41:13.716Z INFO webdriver: COMMAND maximizeWindow()
[0-0] 2023-02-02T12:41:13.716Z INFO webdriver: [POST] http://localhost:9515/session/b47af9b82cdc504d3b0bee3ac01d28fa/window/maximize
[0-0] 2023-02-02T12:41:13.717Z DEBUG @wdio/utils:shim: Finished to run "beforeTest" hook in 1ms
[0-0] 2023-02-02T12:41:13.718Z INFO webdriver: COMMAND navigateTo("https://mandoemedia.com/industries2/")
[0-0] 2023-02-02T12:41:13.719Z INFO webdriver: [POST] http://localhost:9515/session/b47af9b82cdc504d3b0bee3ac01d28fa/url
[0-0] 2023-02-02T12:41:13.719Z INFO webdriver: DATA { url: 'https://mandoemedia.com/industries2/' }
[0-0] 2023-02-02T12:41:15.358Z INFO webdriver: RESULT { height: 1048, width: 1936, x: -8, y: -8 }
[0-2] 2023-02-02T12:41:16.521Z INFO webdriver: COMMAND checkFullPageScreen("US-Res-case-studiesPage", <object>)
[0-2] 2023-02-02T12:41:16.524Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-2] 2023-02-02T12:41:16.524Z INFO webdriver: [POST] http://localhost:9515/session/0a064493906d9e543721cb82a6f4aa2d/execute/sync
[0-2] 2023-02-02T12:41:16.524Z INFO webdriver: DATA { script: 'hideScrollBars(...) [258 bytes]', args: [ true ] }
[0-2] 2023-02-02T12:41:16.625Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-2] 2023-02-02T12:41:16.625Z INFO webdriver: [POST] http://localhost:9515/session/0a064493906d9e543721cb82a6f4aa2d/execute/sync
[0-2] 2023-02-02T12:41:16.626Z INFO webdriver: DATA {
[0-2]   script: 'setCustomCss(...) [1396 bytes]',
[0-2]   args: [
[0-2]     {
[0-2]       addressBarPadding: 0,
[0-2]       disableCSSAnimation: true,
[0-2]       id: 'pic-css',
[0-2]       toolBarPadding: 0
[0-2]     }
[0-2]   ]
[0-2] }
[0-2] 2023-02-02T12:41:16.673Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-2] 2023-02-02T12:41:16.673Z INFO webdriver: [POST] http://localhost:9515/session/0a064493906d9e543721cb82a6f4aa2d/execute/sync
[0-2] 2023-02-02T12:41:16.673Z INFO webdriver: DATA { script: 'getScreenDimensions(...) [1221 bytes]', args: [] }
[0-2] 2023-02-02T12:41:16.693Z INFO webdriver: RESULT {
[0-2]   dimensions: {
[0-2]     body: { offsetHeight: 916, scrollHeight: 916 },
[0-2]     html: {
[0-2]       clientHeight: 916,
[0-2]       clientWidth: 1920,
[0-2]       offsetHeight: 916,
[0-2]       scrollHeight: 916,
[0-2]       scrollWidth: 1920
[0-2]     },
[0-2]     window: {
[0-2]       devicePixelRatio: 1,
[0-2]       innerHeight: 916,
[0-2]       innerWidth: 1920,
[0-2]       outerHeight: 1032,
[0-2]       outerWidth: 1920,
[0-2]       screenHeight: 1080,
[0-2]       screenWidth: 1920
[0-2]     }
[0-2]   }
[0-2] }
[0-2] 2023-02-02T12:41:16.694Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-2] 2023-02-02T12:41:16.695Z INFO webdriver: [POST] http://localhost:9515/session/0a064493906d9e543721cb82a6f4aa2d/execute/sync
[0-2] 2023-02-02T12:41:16.695Z INFO webdriver: DATA { script: 'scrollToPosition(...) [155 bytes]', args: [ 0 ] }
[0-2] 2023-02-02T12:41:18.377Z INFO webdriver: COMMAND takeScreenshot()
[0-2] 2023-02-02T12:41:18.377Z INFO webdriver: [GET] http://localhost:9515/session/0a064493906d9e543721cb82a6f4aa2d/screenshot
[0-2] 2023-02-02T12:41:18.616Z INFO webdriver: RESULT iVBORw0KGgoAAAANSUhEUgAAB4AAAAOUCAYAAABDqi5YAAAAAXNSR0IArs4c6...
[0-2] 2023-02-02T12:41:18.617Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-2] 2023-02-02T12:41:18.617Z INFO webdriver: [POST] http://localhost:9515/session/0a064493906d9e543721cb82a6f4aa2d/execute/sync
[0-2] 2023-02-02T12:41:18.617Z INFO webdriver: DATA { script: 'getDocumentScrollHeight(...) [1384 bytes]', args: [] }
[0-2] 2023-02-02T12:41:18.624Z INFO webdriver: RESULT 916
[0-2] 2023-02-02T12:41:18.914Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-2] 2023-02-02T12:41:18.915Z INFO webdriver: [POST] http://localhost:9515/session/0a064493906d9e543721cb82a6f4aa2d/execute/sync
[0-2] 2023-02-02T12:41:18.915Z INFO webdriver: DATA { script: 'hideScrollBars(...) [258 bytes]', args: [ false ] }
[0-2] 2023-02-02T12:41:18.927Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-2] 2023-02-02T12:41:18.927Z INFO webdriver: [POST] http://localhost:9515/session/0a064493906d9e543721cb82a6f4aa2d/execute/sync
[0-2] 2023-02-02T12:41:18.927Z INFO webdriver: DATA {
[0-2]   script: 'removeElementFromDom(...) [197 bytes]',
[0-2]   args: [ 'pic-css' ]
[0-2] }
[0-2] 2023-02-02T12:41:19.544Z INFO webdriver: RESULT 0
[0-2] 2023-02-02T12:41:19.554Z DEBUG @wdio/utils:shim: Finished to run "afterTest" hook in 1ms
[0-2] 2023-02-02T12:41:19.556Z INFO webdriver: COMMAND deleteAllCookies()
[0-2] 2023-02-02T12:41:19.557Z INFO webdriver: [DELETE] http://localhost:9515/session/0a064493906d9e543721cb82a6f4aa2d/cookie
[0-2] 2023-02-02T12:41:19.559Z INFO webdriver: COMMAND executeScript("sessionStorage.clear()", <object>)
[0-2] 2023-02-02T12:41:19.559Z INFO webdriver: [POST] http://localhost:9515/session/0a064493906d9e543721cb82a6f4aa2d/execute/sync
[0-2] 2023-02-02T12:41:19.562Z INFO webdriver: DATA { script: 'sessionStorage.clear()', args: [] }
[0-2] 2023-02-02T12:41:19.568Z INFO webdriver: COMMAND executeScript("window.localStorage.clear()", <object>)
[0-2] 2023-02-02T12:41:19.569Z INFO webdriver: [POST] http://localhost:9515/session/0a064493906d9e543721cb82a6f4aa2d/execute/sync
[0-2] 2023-02-02T12:41:19.569Z INFO webdriver: DATA { script: 'window.localStorage.clear()', args: [] }
[0-2] 2023-02-02T12:41:19.574Z INFO webdriver: COMMAND maximizeWindow()
[0-2] 2023-02-02T12:41:19.575Z INFO webdriver: [POST] http://localhost:9515/session/0a064493906d9e543721cb82a6f4aa2d/window/maximize
[0-2] 2023-02-02T12:41:19.702Z INFO webdriver: RESULT { height: 1048, width: 1936, x: -8, y: -8 }
[0-2] 2023-02-02T12:41:19.703Z INFO webdriver: COMMAND setTimeouts(undefined, 1000000, undefined)
[0-2] 2023-02-02T12:41:19.703Z INFO webdriver: [POST] http://localhost:9515/session/0a064493906d9e543721cb82a6f4aa2d/timeouts
[0-2] 2023-02-02T12:41:19.703Z INFO webdriver: DATA { pageLoad: 1000000 }
[0-2] 2023-02-02T12:41:19.707Z INFO webdriver: COMMAND refresh()
[0-2] 2023-02-02T12:41:19.707Z INFO webdriver: [POST] http://localhost:9515/session/0a064493906d9e543721cb82a6f4aa2d/refresh
[0-2] 2023-02-02T12:41:19.721Z INFO webdriver: COMMAND maximizeWindow()
[0-2] 2023-02-02T12:41:19.721Z INFO webdriver: [POST] http://localhost:9515/session/0a064493906d9e543721cb82a6f4aa2d/window/maximize
[0-2] 2023-02-02T12:41:19.722Z DEBUG @wdio/utils:shim: Finished to run "beforeTest" hook in 1ms
[0-2] 2023-02-02T12:41:19.723Z INFO webdriver: COMMAND navigateTo("https://mandoemedia.com/about-us/")
[0-2] 2023-02-02T12:41:19.723Z INFO webdriver: [POST] http://localhost:9515/session/0a064493906d9e543721cb82a6f4aa2d/url
[0-2] 2023-02-02T12:41:19.723Z INFO webdriver: DATA { url: 'https://mandoemedia.com/about-us/' }
[0-2] 2023-02-02T12:41:20.787Z INFO webdriver: RESULT { height: 1048, width: 1936, x: -8, y: -8 }
[0-0] 2023-02-02T12:41:21.615Z INFO webdriver: COMMAND takeScreenshot()
[0-0] 2023-02-02T12:41:21.616Z INFO webdriver: [GET] http://localhost:9515/session/b47af9b82cdc504d3b0bee3ac01d28fa/screenshot
[0-0] 2023-02-02T12:41:21.618Z DEBUG @wdio/utils:shim: Finished to run "afterTest" hook in 3ms
[0-0] TypeError in "Products page.should save Products-industries2 page screenshots"
TypeError: browser.saveFullPageScreen is not a function
    at Context.<anonymous> (C:\Users\steve\OneDrive\Documents\Bit Bucket\mandoe-visual-testing-02\test\specs\US-products.spec.js:81:23)
[0-0] 2023-02-02T12:41:21.621Z INFO webdriver: COMMAND deleteAllCookies()
[0-0] 2023-02-02T12:41:21.621Z INFO webdriver: [DELETE] http://localhost:9515/session/b47af9b82cdc504d3b0bee3ac01d28fa/cookie
[0-0] 2023-02-02T12:41:21.626Z INFO webdriver: COMMAND executeScript("sessionStorage.clear()", <object>)
[0-0] 2023-02-02T12:41:21.627Z INFO webdriver: [POST] http://localhost:9515/session/b47af9b82cdc504d3b0bee3ac01d28fa/execute/sync
[0-0] 2023-02-02T12:41:21.628Z INFO webdriver: DATA { script: 'sessionStorage.clear()', args: [] }
[0-0] 2023-02-02T12:41:21.633Z INFO webdriver: COMMAND executeScript("window.localStorage.clear()", <object>)
[0-0] 2023-02-02T12:41:21.634Z INFO webdriver: [POST] http://localhost:9515/session/b47af9b82cdc504d3b0bee3ac01d28fa/execute/sync
[0-0] 2023-02-02T12:41:21.634Z INFO webdriver: DATA { script: 'window.localStorage.clear()', args: [] }
[0-0] 2023-02-02T12:41:21.640Z INFO webdriver: COMMAND maximizeWindow()
[0-0] 2023-02-02T12:41:21.640Z INFO webdriver: [POST] http://localhost:9515/session/b47af9b82cdc504d3b0bee3ac01d28fa/window/maximize
[0-0] 2023-02-02T12:41:22.116Z INFO webdriver: RESULT iVBORw0KGgoAAAANSUhEUgAAB4AAAAOUCAYAAABDqi5YAAAAAXNSR0IArs4c6...
[0-0] 2023-02-02T12:41:22.230Z INFO webdriver: RESULT { height: 1048, width: 1936, x: -8, y: -8 }
[0-0] 2023-02-02T12:41:22.231Z INFO webdriver: COMMAND setTimeouts(undefined, 1000000, undefined)
[0-0] 2023-02-02T12:41:22.231Z INFO webdriver: [POST] http://localhost:9515/session/b47af9b82cdc504d3b0bee3ac01d28fa/timeouts
[0-0] 2023-02-02T12:41:22.231Z INFO webdriver: DATA { pageLoad: 1000000 }
[0-0] 2023-02-02T12:41:22.235Z INFO webdriver: COMMAND refresh()
[0-0] 2023-02-02T12:41:22.235Z INFO webdriver: [POST] http://localhost:9515/session/b47af9b82cdc504d3b0bee3ac01d28fa/refresh
[0-1] 2023-02-02T12:41:22.348Z INFO webdriver: RESULT 6.01
[0-1] 2023-02-02T12:41:22.366Z INFO webdriver: COMMAND takeScreenshot()
[0-1] 2023-02-02T12:41:22.367Z INFO webdriver: [GET] http://localhost:9515/session/3500f858611bb2d9062ca3575f83c676/screenshot
[0-1] 2023-02-02T12:41:22.369Z DEBUG @wdio/utils:shim: Finished to run "afterTest" hook in 3ms
[0-1] Error in "Solutions page.should compare Solutions-hospitality page screenshots"
Error: expect(received).toEqual(expected) // deep equality

Expected: 0
Received: 6.01
    at Context.<anonymous> (C:\Users\steve\OneDrive\Documents\Bit Bucket\mandoe-visual-testing-02\test\specs\US-solutions.spec.js:33:103)
[0-1] 2023-02-02T12:41:22.389Z INFO webdriver: COMMAND deleteAllCookies()
[0-1] 2023-02-02T12:41:22.390Z INFO webdriver: [DELETE] http://localhost:9515/session/3500f858611bb2d9062ca3575f83c676/cookie
[0-1] 2023-02-02T12:41:22.452Z INFO webdriver: COMMAND executeScript("sessionStorage.clear()", <object>)
[0-1] 2023-02-02T12:41:22.453Z INFO webdriver: [POST] http://localhost:9515/session/3500f858611bb2d9062ca3575f83c676/execute/sync
[0-1] 2023-02-02T12:41:22.453Z INFO webdriver: DATA { script: 'sessionStorage.clear()', args: [] }
[0-1] 2023-02-02T12:41:22.459Z INFO webdriver: COMMAND executeScript("window.localStorage.clear()", <object>)
[0-1] 2023-02-02T12:41:22.459Z INFO webdriver: [POST] http://localhost:9515/session/3500f858611bb2d9062ca3575f83c676/execute/sync
[0-1] 2023-02-02T12:41:22.460Z INFO webdriver: DATA { script: 'window.localStorage.clear()', args: [] }
[0-1] 2023-02-02T12:41:22.472Z INFO webdriver: COMMAND maximizeWindow()
[0-1] 2023-02-02T12:41:22.473Z INFO webdriver: [POST] http://localhost:9515/session/3500f858611bb2d9062ca3575f83c676/window/maximize
[0-1] 2023-02-02T12:41:22.778Z INFO webdriver: RESULT iVBORw0KGgoAAAANSUhEUgAAB4AAAAOUCAYAAABDqi5YAAAAAXNSR0IArs4c6...
[0-1] 2023-02-02T12:41:22.910Z INFO webdriver: RESULT { height: 1048, width: 1936, x: -8, y: -8 }
[0-1] 2023-02-02T12:41:22.911Z INFO webdriver: COMMAND setTimeouts(undefined, 1000000, undefined)
[0-1] 2023-02-02T12:41:22.911Z INFO webdriver: [POST] http://localhost:9515/session/3500f858611bb2d9062ca3575f83c676/timeouts
[0-1] 2023-02-02T12:41:22.911Z INFO webdriver: DATA { pageLoad: 1000000 }
[0-1] 2023-02-02T12:41:22.916Z INFO webdriver: COMMAND refresh()
[0-1] 2023-02-02T12:41:22.916Z INFO webdriver: [POST] http://localhost:9515/session/3500f858611bb2d9062ca3575f83c676/refresh
[0-0] 2023-02-02T12:41:24.204Z INFO webdriver: COMMAND maximizeWindow()
[0-0] 2023-02-02T12:41:24.205Z INFO webdriver: [POST] http://localhost:9515/session/b47af9b82cdc504d3b0bee3ac01d28fa/window/maximize
[0-0] 2023-02-02T12:41:24.207Z DEBUG @wdio/utils:shim: Finished to run "beforeTest" hook in 3ms
[0-0] 2023-02-02T12:41:24.209Z INFO webdriver: COMMAND navigateTo("https://mandoemedia.com/industries2/")
[0-0] 2023-02-02T12:41:24.209Z INFO webdriver: [POST] http://localhost:9515/session/b47af9b82cdc504d3b0bee3ac01d28fa/url
[0-0] 2023-02-02T12:41:24.209Z INFO webdriver: DATA { url: 'https://mandoemedia.com/industries2/' }
[0-0] 2023-02-02T12:41:24.275Z INFO webdriver: RESULT { height: 1048, width: 1936, x: -8, y: -8 }
[0-1] 2023-02-02T12:41:24.376Z INFO webdriver: COMMAND maximizeWindow()
[0-1] 2023-02-02T12:41:24.377Z INFO webdriver: [POST] http://localhost:9515/session/3500f858611bb2d9062ca3575f83c676/window/maximize
[0-1] 2023-02-02T12:41:24.378Z DEBUG @wdio/utils:shim: Finished to run "beforeTest" hook in 2ms
[0-1] 2023-02-02T12:41:24.379Z INFO webdriver: COMMAND navigateTo("https://mandoemedia.com/industries/gift-store/")
[0-1] 2023-02-02T12:41:24.380Z INFO webdriver: [POST] http://localhost:9515/session/3500f858611bb2d9062ca3575f83c676/url
[0-1] 2023-02-02T12:41:24.380Z INFO webdriver: DATA { url: 'https://mandoemedia.com/industries/gift-store/' }
[0-1] 2023-02-02T12:41:24.481Z INFO webdriver: RESULT { height: 1048, width: 1936, x: -8, y: -8 }
[0-2] 2023-02-02T12:41:26.271Z INFO webdriver: COMMAND saveFullPageScreen("US-Res-about-usPage", <object>)
[0-2] 2023-02-02T12:41:26.272Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-2] 2023-02-02T12:41:26.273Z INFO webdriver: [POST] http://localhost:9515/session/0a064493906d9e543721cb82a6f4aa2d/execute/sync
[0-2] 2023-02-02T12:41:26.273Z INFO webdriver: DATA { script: 'hideScrollBars(...) [258 bytes]', args: [ true ] }
[0-2] 2023-02-02T12:41:26.293Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-2] 2023-02-02T12:41:26.294Z INFO webdriver: [POST] http://localhost:9515/session/0a064493906d9e543721cb82a6f4aa2d/execute/sync
[0-2] 2023-02-02T12:41:26.294Z INFO webdriver: DATA {
[0-2]   script: 'setCustomCss(...) [1396 bytes]',
[0-2]   args: [
[0-2]     {
[0-2]       addressBarPadding: 0,
[0-2]       disableCSSAnimation: true,
[0-2]       id: 'pic-css',
[0-2]       toolBarPadding: 0
[0-2]     }
[0-2]   ]
[0-2] }
[0-2] 2023-02-02T12:41:26.350Z INFO webdriver: COMMAND executeScript(<fn>, <object>)
[0-2] 2023-02-02T12:41:26.350Z INFO webdriver: [POST] http://localhost:9515/session/0a064493906d9e543721cb82a6f4aa2d/execute/sync
[0-2] 2023-02-02T12:41:26.351Z INFO webdriver: DATA { script: 'getScreenDimensions(...) [1221 bytes]', args: [] }
[0-2] 2023-02-02T12:41:26.360Z INFO webdriver: RESULT {
[0-2]   dimensions: {
[0-2]     body: { offsetHeight: 4691, scrollHeight: 4691 },
[0-2]     html: {
[0-2]       clientHeight: 916,
[0-2]       clientWidth: 1920,
[0-2]       offsetHeight: 4691,
[0-2]       scrollHeight: 4691,
[0-2]       scrollWidth: 1920
[0-2]     },
[0-2]     window: {
[0-2]       devicePixelRatio: 1,
[0-2]       innerHeight: 916,
[0-2]       innerWidth: 1920,
[0-2]       outerHeight: 1032,
[0-2]       outerWidth: 1920,
[0-2]       screenHeight: 1080,
[0-2]       screenWidth: 1920
[0-2]     }
[0-2]   }
[0-2] }
wswebcreation commented 1 year ago

This is not related to the module, but please provide a reproducible example for debugging.

sdoigmm commented 1 year ago

Sure.

wdio.conf.js:

const { join } = require('path')

exports.config = {
    //
    // ====================
    // Runner Configuration
    // ====================
    //
    //
    // ==================
    // Specify Test Files
    // ==================
    // Define which test specs should run. The pattern is relative to the directory
    // from which `wdio` was called.
    //
    // The specs are defined as an array of spec files (optionally using wildcards
    // that will be expanded). The test for each spec file will be run in a separate
    // worker process. In order to have a group of spec files run in the same worker
    // process simply enclose them in an array within the specs array.
    //
    // If you are calling `wdio` from an NPM script (see https://docs.npmjs.com/cli/run-script),
    // then the current working directory is where your `package.json` resides, so `wdio`
    // will be called from there.
    //

    specs: [

        // './test/specs/**/sandbox-url.spec.js',

        // './test/specs/**/UK-products.spec.js', //passed
        // './test/specs/**/UK-solutions.spec.js', //passed except for dynamic content
        // './test/specs/**/UK-resources.spec.js', //passed except for dynamic content
        // './test/specs/**/UK-tempCategory.spec.js', //passed
        // './test/specs/**/UK-blogPages.spec.js', //passed
        // './test/specs/**/UK-megaMenu.spec.js', //passed

        './test/specs/**/US-products.spec.js', //passed
        // './test/specs/**/US-solutions.spec.js', //passed
        // './test/specs/**/US-resources.spec.js', //passed
        // './test/specs/**/US-tempCategory.spec.js', //passed
        // './test/specs/**/US-blogPages.spec.js', //passed
        // './test/specs/**/US-megaMenu.spec.js', //passed

        // './test/specs/**/AU-products.spec.js', //errors
        // './test/specs/**/AU-solutions.spec.js', //passed
        // './test/specs/**/AU-resources.spec.js', //passed
        // './test/specs/**/AU-tempCategory.spec.js', //passed
        // './test/specs/**/AU-blogPages.spec.js', //passed
        // './test/specs/**/AU-megaMenu.spec.js', // 1 error

    ],
    // Patterns to exclude.
    exclude: [
        // 'path/to/excluded/files'
    ],
    //
    // ============
    // Capabilities
    // ============
    // Define your capabilities here. WebdriverIO can run multiple capabilities at the same
    // time. Depending on the number of capabilities, WebdriverIO launches several test
    // sessions. Within your capabilities you can overwrite the spec and exclude options in
    // order to group specific specs to a specific capability.
    //
    // First, you can define how many instances should be started at the same time. Let's
    // say you have 3 different capabilities (Chrome, Firefox, and Safari) and you have
    // set maxInstances to 1; wdio will spawn 3 processes. Therefore, if you have 10 spec
    // files and you set maxInstances to 10, all spec files will get tested at the same time
    // and 30 processes will get spawned. The property handles how many capabilities
    // from the same test should run tests.
    //
    maxInstances: 10,
    //
    // If you have trouble getting all important capabilities together, check out the
    // Sauce Labs platform configurator - a great tool to configure your capabilities:
    // https://saucelabs.com/platform/platform-configurator
    //
    capabilities: [
        {
            // maxInstances can get overwritten per capability. So if you have an in-house Selenium
            // grid with only 5 firefox instances available you can make sure that not more than
            // 5 instances get started at a time.
            maxInstances: 10,
            //
            browserName: 'chrome',

            acceptInsecureCerts: true
            // If outputDir is provided WebdriverIO can capture driver session logs
            // it is possible to configure which logTypes to include/exclude.
            // excludeDriverLogs: ['*'], // pass '*' to exclude all driver session logs
            // excludeDriverLogs: ['bugreport', 'server'],
        },
    ],
    //
    // ===================
    // Test Configurations
    // ===================
    // Define all options that are relevant for the WebdriverIO instance here
    //
    // Level of logging verbosity: trace | debug | info | warn | error | silent
    logLevel: 'error',
    //
    // Set specific log levels per logger
    // loggers:
    // - webdriver, webdriverio
    // - @wdio/browserstack-service, @wdio/devtools-service, @wdio/sauce-service
    // - @wdio/mocha-framework, @wdio/jasmine-framework
    // - @wdio/local-runner
    // - @wdio/sumologic-reporter
    // - @wdio/cli, @wdio/config, @wdio/utils
    // Level of logging verbosity: trace | debug | info | warn | error | silent
    // logLevels: {
    //     webdriver: 'info',
    //     '@wdio/appium-service': 'info'
    // },
    //
    // If you only want to run your tests until a specific amount of tests have failed use
    // bail (default is 0 - don't bail, run all tests).
    bail: 0,
    //
    // Set a base URL in order to shorten url command calls. If your `url` parameter starts
    // with `/`, the base url gets prepended, not including the path portion of your baseUrl.
    // If your `url` parameter starts without a scheme or `/` (like `some/path`), the base url
    // gets prepended directly.
    baseUrl: 'https://mandoemedia.com/',
    //
    // Default timeout for all waitFor* commands.
    waitforTimeout: 10000,
    //
    // Default timeout in milliseconds for request
    // if browser driver or grid doesn't send response
    connectionRetryTimeout: 500000,
    //
    // Default request retries count
    connectionRetryCount: 3,
    //
    // Test runner services
    // Services take over a specific job you don't want to take care of. They enhance
    // your test setup with almost no effort. Unlike plugins, they don't add new
    // commands. Instead, they hook themselves up into the test process.
    services: [['chromedriver'],
    ['image-comparison',
        {
            baselineFolder: join(process.cwd(), './tests/visualRegressionBaseline/'),
            formatImageName: '{tag}-{logName}',
            screenshotPath: join(process.cwd(), './tests/visualRegressionDiff/'),
            autoSaveBaseline: true,
            blockOutStatusBar: true,
            blockOutToolBar: true,
            clearRuntimeFolder: true,
            disableCSSAnimation: true
        }]
    ],

    // Framework you want to run your specs with.
    // The following are supported: Mocha, Jasmine, and Cucumber
    // see also: https://webdriver.io/docs/frameworks
    //
    // Make sure you have the wdio adapter package for the specific framework installed
    // before running any tests.
    framework: 'mocha',
    //
    // The number of times to retry the entire specfile when it fails as a whole
    // specFileRetries: 1,
    //
    // Delay in seconds between the spec file retry attempts
    // specFileRetriesDelay: 0,
    //
    // Whether or not retried specfiles should be retried immediately or deferred to the end of the queue
    // specFileRetriesDeferred: false,
    //
    // Test reporter for stdout.
    // The only one supported by default is 'dot'
    // see also: https://webdriver.io/docs/dot-reporter
    reporters: ['spec'/*['Allure',{
        outputDir:'allure-results',
        disableWebdriverStepsReporting: true,
        disableWebdriverScreenshotsReporting: false,
    }]*/],

    //
    // Options to be passed to Mocha.
    // See the full list at http://mochajs.org/
    mochaOpts: {
        ui: 'bdd',
        timeout: 6000000000
    },
    //
    // =====
    // Hooks
    // =====
    // WebdriverIO provides several hooks you can use to interfere with the test process in order to enhance
    // it and to build services around it. You can either apply a single function or an array of
    // methods to it. If one of them returns with a promise, WebdriverIO will wait until that promise got
    // resolved to continue.
    /**
     * Gets executed once before all workers get launched.
     * @param {Object} config wdio configuration object
     * @param {Array.<Object>} capabilities list of capabilities details
     */
    // onPrepare: function (config, capabilities) {
    // },
    /**
     * Gets executed before a worker process is spawned and can be used to initialise specific service
     * for that worker as well as modify runtime environments in an async fashion.
     * @param  {String} cid      capability id (e.g 0-0)
     * @param  {[type]} caps     object containing capabilities for session that will be spawn in the worker
     * @param  {[type]} specs    specs to be run in the worker process
     * @param  {[type]} args     object that will be merged with the main configuration once worker is initialized
     * @param  {[type]} execArgv list of string arguments passed to the worker process
     */
    // onWorkerStart: function (cid, caps, specs, args, execArgv) {
    // },
    /**
     * Gets executed just after a worker process has exited.
     * @param  {String} cid      capability id (e.g 0-0)
     * @param  {Number} exitCode 0 - success, 1 - fail
     * @param  {[type]} specs    specs to be run in the worker process
     * @param  {Number} retries  number of retries used
     */
    // onWorkerEnd: function (cid, exitCode, specs, retries) {
    // },
    /**
     * Gets executed just before initialising the webdriver session and test framework. It allows you
     * to manipulate configurations depending on the capability or spec.
     * @param {Object} config wdio configuration object
     * @param {Array.<Object>} capabilities list of capabilities details
     * @param {Array.<String>} specs List of spec file paths that are to be run
     * @param {String} cid worker id (e.g. 0-0)
     */
    // beforeSession: function (config, capabilities, specs, cid) {
    // },
    /**
     * Gets executed before test execution begins. At this point you can access to all global
     * variables like `browser`. It is the perfect place to define custom commands.
     * @param {Array.<Object>} capabilities list of capabilities details
     * @param {Array.<String>} specs        List of spec file paths that are to be run
     * @param {Object}         browser      instance of created browser/device session
     */
    // before: function (capabilities, specs) {
    // },
    /**
     * Runs before a WebdriverIO command gets executed.
     * @param {String} commandName hook command name
     * @param {Array} args arguments that command would receive
     */
    // beforeCommand: function (commandName, args) {
    // },
    /**
     * Hook that gets executed before the suite starts
     * @param {Object} suite suite details
     */
    // beforeSuite: function (suite) {
    // },
    /**
     * Function to be executed before a test (in Mocha/Jasmine) starts.
     */
    beforeTest: function (test, context) {
        browser.maximizeWindow();
    },
    /**
     * Hook that gets executed _before_ a hook within the suite starts (e.g. runs before calling
     * beforeEach in Mocha)
     */
    // beforeHook: function (test, context) {
    // },
    /**
     * Hook that gets executed _after_ a hook within the suite starts (e.g. runs after calling
     * afterEach in Mocha)
     */
    // afterHook: function (test, context, { error, result, duration, passed, retries }) {
    // },
    /**
     * Function to be executed after a test (in Mocha/Jasmine only)
     * @param {Object}  test             test object
     * @param {Object}  context          scope object the test was executed with
     * @param {Error}   result.error     error object in case the test fails, otherwise `undefined`
     * @param {Any}     result.result    return object of test function
     * @param {Number}  result.duration  duration of test
     * @param {Boolean} result.passed    true if test has passed, otherwise false
     * @param {Object}  result.retries   informations to spec related retries, e.g. `{ attempts: 0, limit: 0 }`
     */
    afterTest: function (test, context, { error, result, duration, passed, retries }) {
        if (error) {
            browser.takeScreenshot();
        }
    },

    /**
     * Hook that gets executed after the suite has ended
     * @param {Object} suite suite details
     */
    // afterSuite: function (suite) {
    // },
    /**
     * Runs after a WebdriverIO command gets executed
     * @param {String} commandName hook command name
     * @param {Array} args arguments that command would receive
     * @param {Number} result 0 - command success, 1 - command error
     * @param {Object} error error object if any
     */
    // afterCommand: function (commandName, args, result, error) {
    // },
    /**
     * Gets executed after all tests are done. You still have access to all global variables from
     * the test.
     * @param {Number} result 0 - test pass, 1 - test fail
     * @param {Array.<Object>} capabilities list of capabilities details
     * @param {Array.<String>} specs List of spec file paths that ran
     */
    // after: function (result, capabilities, specs) {
    // },
    /**
     * Gets executed right after terminating the webdriver session.
     * @param {Object} config wdio configuration object
     * @param {Array.<Object>} capabilities list of capabilities details
     * @param {Array.<String>} specs List of spec file paths that ran
     */
    // afterSession: function (config, capabilities, specs) {
    // },
    /**
     * Gets executed after all workers got shut down and the process is about to exit. An error
     * thrown in the onComplete hook will result in the test run failing.
     * @param {Object} exitCode 0 - success, 1 - fail
     * @param {Object} config wdio configuration object
     * @param {Array.<Object>} capabilities list of capabilities details
     * @param {<Object>} results object containing test results
     */
    // onComplete: function(exitCode, config, capabilities, results) {
    // },
    /**
    * Gets executed when a refresh happens.
    * @param {String} oldSessionId session ID of the old session
    * @param {String} newSessionId session ID of the new session
    */
    // onReload: function(oldSessionId, newSessionId) {
    // }    
}

//If headless is an argument, run Chrome in headless mode
if (process.argv.includes('headless')) {
    exports.config.capabilities[0]['goog:chromeOptions'] = {
        args: ["--headless"]
    };
}

US-products.spec.js:

const HomePage = require('../pageobjects/home.page');

describe('Products page', () => {

    beforeEach(async () => {  
        await browser.maximizeWindow()
        await browser.setTimeout({ 'pageLoad':1000000 }) 
        await browser.refresh() 
     });
    afterEach(() => {
        browser.execute('window.localStorage.clear()');     
        browser.deleteAllCookies()
        browser.execute('sessionStorage.clear()')        
    });

//  //===================================================Products- Features page secton 6 pages==============================================================================================================
    it('should save Products-Features page screenshotsscreenshots', async () => { 
        await browser.url('/features/'); 
        await browser.pause(4000) 
        // await(await HomePage.talktoSales).moveTo()  
        // await browser.pause(15000)    
        // await(await HomePage.intercomBtn).moveTo() 
        // await browser.pause(1000)       
        await browser.saveFullPageScreen('US-prod-featuresPage', { });
    }); 
    it('should compare Products-Features page screenshots', async () => {  
        await browser.url('/features/');
        await browser.pause(4000) 
        // await(await HomePage.talktoSales).moveTo()  
        // await browser.pause(15000)    
        // await(await HomePage.intercomBtn).moveTo() 
        // await browser.pause(1000) 
        await expect(await browser.checkFullPageScreen('US-prod-featuresPage', { /* some options */ })).toEqual(0);
    });
        //  //===================================================Products- templates page secton 1==============================================================================================================
    it('should save Products-Templates page screenshots', async () => { 
        await browser.url('/templates/'); 
        await browser.pause(4000) 
        // await(await HomePage.talktoSales).moveTo()  
        // await browser.pause(15000)    
        // await(await HomePage.intercomBtn).moveTo() 
        // await browser.pause(1000) 
        await browser.saveFullPageScreen('US-prod-templatesPage', { });
    }); 
    it('should compare Products-Templates page screenshots', async () => {  
        await browser.url('/templates/'); 
        await browser.pause(4000) 
        // await(await HomePage.talktoSales).moveTo()  
        // await browser.pause(15000)    
        // await(await HomePage.intercomBtn).moveTo() 
        // await browser.pause(1000) 
        await expect(await browser.checkFullPageScreen('US-prod-templatesPage', { /* some options */ })).toEqual(0);
    });
 //===================================================Products- how-it-works page secton 1==============================================================================================================
    it('should save Products-how-it-works page screenshots', async () => { 
      await browser.url('/how-it-works/'); 
      await browser.pause(4000) 
      // await(await HomePage.talktoSales).moveTo()  
      // await browser.pause(15000)    
      // await(await HomePage.intercomBtn).moveTo() 
      // await browser.pause(1000) 
      await browser.saveFullPageScreen('US-prod-how-it-worksPage', { });
    }); 
    it('should compare Products-how-it-works page screenshots', async () => {  
      await browser.url('/how-it-works/'); 
      await browser.pause(4000) 
      // await(await HomePage.talktoSales).moveTo()  
      // await browser.pause(15000)    
      // await(await HomePage.intercomBtn).moveTo() 
      // await browser.pause(1000) 
      await expect(await browser.checkFullPageScreen('US-prod-how-it-worksPage', { /* some options */ })).toEqual(0);
    });
     //===================================================Products- industries2 page secton 1==============================================================================================================
    it('should save Products-industries2 page screenshots', async () => { 
        await browser.url('/industries2/'); 
        await browser.pause(4000) 
        // await(await HomePage.talktoSales).moveTo()  
        // await browser.pause(15000)    
        // await(await HomePage.intercomBtn).moveTo() 
        // await browser.pause(1000) 
        await browser.saveFullPageScreen('US-prod-industries2Page', { });
    }); 
    it('should compare Products-industries2 page screenshots', async () => {  
        await browser.url('/industries2/'); 
   await browser.pause(4000) 
        // await(await HomePage.talktoSales).moveTo()  
        // await browser.pause(15000)    
        // await(await HomePage.intercomBtn).moveTo() 
        // await browser.pause(1000) 
        await expect(await browser.checkFullPageScreen('US-prod-industries2Page', { /* some options */ })).toEqual(0);
    });
        //===================================================Products- ids-getting-started-guide page secton 1==============================================================================================================
    it('should save Products-ids-getting-started-guide page screenshots', async () => { 
        await browser.url('/ids-getting-started-guide/'); 
        await browser.pause(4000) 
        // await(await HomePage.talktoSales).moveTo()  
        // await browser.pause(15000)    
        // await(await HomePage.intercomBtn).moveTo() 
        // await browser.pause(1000) 
        await browser.saveFullPageScreen('US-prod-ids-getting-started-guidePage', { });
    }); 
    it('should compare Products-ids-getting-started-guide page screenshots', async () => {  
        await browser.url('/ids-getting-started-guide/'); 
   await browser.pause(4000) 
        // await(await HomePage.talktoSales).moveTo()  
        // await browser.pause(15000)    
        // await(await HomePage.intercomBtn).moveTo() 
        // await browser.pause(1000) 
        await expect(await browser.checkFullPageScreen('US-prod-ids-getting-started-guidePage', { /* some options */ })).toEqual(0);
    });
    //===================================================Products- download-player page secton 1==============================================================================================================
    it('should save Products-download-player page screenshots', async () => { 
        await browser.url('/download-player/'); 
        await browser.pause(4000) 
        // await(await HomePage.talktoSales).moveTo()  
        // await browser.pause(15000)    
        // await(await HomePage.intercomBtn).moveTo() 
        // await browser.pause(1000) 
        await browser.saveFullPageScreen('US-prod-download-playerPage', { });
    }); 
    it('should compare Products-download-player page screenshots', async () => {  
        await browser.url('/download-player/'); 
        await browser.pause(4000) 
        // await(await HomePage.talktoSales).moveTo()  
        // await browser.pause(15000)    
        // await(await HomePage.intercomBtn).moveTo() 
        // await browser.pause(1000) 
        await expect(await browser.checkFullPageScreen('US-prod-download-playerPage', { /* some options */ })).toEqual(0);
    });
});

/pageobjects/home.page.js:

const Page = require('./page');

class HomePage extends Page {

    get locationtclick() {return $("(//div)[239]")}
    get talktoSales(){return $("//a[@class='buttonLink_blueFilled__o04lE']")} 
    get startFreeTrial(){return $("//a[@class='buttonLink_blueFilled__o04lE']")}
    get popUpclick() {return $("//div[@class='spu-container']")} 

    get locationtxt () {return $("//div[@class='siteFooter_flagFlex__eaEyZ']/a[3]")} 
    get locationtxt1 () {return $("//div[@class='siteFooter_flagFlex__eaEyZ']/a[2]")}  
    get mandoeTxt () {return $("//h1[contains(text(),'Design your New Improved Digital Signage in Minutes')]")}   
    get intercomMessengerIframe(){return $("//iframe[@title='Intercom live chat']")}

    get intercomMesTxt(){return $("//span[contains(text(),'Send us a message')]")}

    get intercomBtnSvg(){return $("(//*[name()='svg'][@focusable='false'])[2]")}
    get closeintercom(){return $("//div[@class='intercom-1f2urc1 e4nbtsn3']")}

    get intcMsgr(){return $("//div[@aria-label='Open Intercom Messenger']//div[1]")}
    get frame(){return $("#intercom-frame")}
    get intercomBtn(){return $("//iframe[@title='Intercom live chat']")}

    get mandoeLogo(){return $("//div[@class='siteHeader_logoWrap__tymZ3']/a/svg")}
    get talkToSalesBtn(){return $("//a[@href='https://mandoemedia.com/contact/sales/']")}
    get productsLnk(){return $("//button[@class='desktopNavigation_headerText__bZrI_']")}
    // get sanboxUrlBtn(){return $(".fl-button[href='https://sandbox.mandoemedia.com/sandbox?template=R2FsbGVyeTovL2dhbGxlcnkvUHVibGljL1RlbXBsYXRlcy9MYW5kc2NhcGUvSG9zcGl0YWxpdHlfQ2FmZS9Ib3NwaXRhbGl0eV9DYWZlXzAxNS50ZW1wbGF0ZQ%3D%3D']")}
//=============================Home page==================================================================

    // get googleRatingTxt(){return $("//div[@class='pp-rating-title mobile-centered']")}
    // get driveFootTxt(){return $("//strong[normalize-space()='Drive foot traffic']")}
    // get dailySalesSection(){return $("//div[@id='section-daily-sales']")}
    // get gaov(){return $("//img[@id='reduce-marketing-costs']")}
    get getStartedTdy(){return $("(//*[name()='svg'][@class='siteFooter_svgBlackMask__6LPbq'])")}
    get talktoSalesFooterBtn(){return $("//a[@href='/contact/sales/'][normalize-space()='Talk to Us']")}
//====================================Features Page ====================================================
    get featuresScroll2(){return $("(//div)[90]")}
    get featuresScroll3(){return $("(//div)[102]")}
    get featuresScroll4(){return $("(//div)[116]")}
    get featuresScroll5(){return $("(//div)[135]")}
    get featuresScroll6(){return $("(//div)[157]")}
    get featuresScroll7(){return $("(//div)[205]")}
    get featuresScroll8(){return $("//p[contains(text(),'See what content played at what times and match it')]")}
    get featuresScroll9(){return $("(//div)[226]")}
    get featuresScroll10(){return $("//div[@class='pp-rating-title']")}
    get featuresScroll11(){return $("//img[@title='Mandoe makes digital Signage Simple']")}
//============================================How it works Page,Hardware and Player software pages ============================================

     get howItworksScroll2(){return $("(//a[@role='button'])[4]")}//step1
     get howItworksScroll3(){return $("//p[normalize-space()='Step 1']")}//step1
     get howItworksScroll4(){return $("//p[normalize-space()='Step 2']")}//step2
     get howItworksScroll5(){return $("(//div)[176]")}//step3
     get howItworksScroll6(){return $("(//div)[201]")}//step4
     get howItworksScroll7(){return $("(//div)[239]")}
     get howItworksScroll8(){return $("(//img[@title='Mandoe makes digital Signage Simple']")}
     get hardwareScroll2(){return $("(//p)[2]")}  
     get hardwareScroll3(){return $("(//img[@title='connect power'])[1]")} 
     get hardwareScroll4(){return $("//img[@title='connect HDMI']")}
     get hardwareScroll5(){return $("(//img[@title='step 3'])[1]")}  
     get hardwareScroll6(){return $("//img[@title='separator']")} 

     get hardwareScroll7(){return $("(//div)[223]")} 
     get hardwareScroll8(){return $("(//div)[248]")} 
     get hardwareScroll9(){return $("(//div)[279]")}          
     get playerSoftScroll2(){return $("(//div)[95]")}     
     get  playerSoftScroll3(){return $("//span[normalize-space()='Linux Desktop Player']")}

     get  playerSoftScroll4(){return $("//p[contains(text(),'Take Mandoe for a test drive to see how easy it is')]")}

//============================================ Industries2 Page ==============================================
     get industries2Scroll2(){return $("(//div)[256]")}//hospitality section
     get industries2Scroll3(){return $("//h3[normalize-space()='Clubs']")}//freshfood section
     get industries2Scroll4(){return $("(//div)[321]")}//fitness section
     get  industries2Scroll5(){return $("(//div)[351]")}//health section
     get industries2Scroll6(){return $("(//div)[381]")}//medical section
     get  industries2Scroll7(){return $("(//div)[411]")}//hairnbeauty section
     get  industries2Scroll8(){return $("(//div)[441]")}//retail section
     get  industries2Scroll9(){return $("(//div)[471]")}//corporateHR section
     get  industries2Scroll10(){return $("(//div)[501]")}//realestate section
     get  industries2Scroll11(){return $("(//div)[557]")}

//==========================================================================================================================

    get featuresLnk(){return $("//a[@href='/features/']")}
    get templatesLnk(){return $("//button[@class='desktopNavigation_headerText__bZrI_']")}
    get signtypesLnk(){return $("(//button[@class='desktopNavigation_headerText__bZrI_'])[2]")}
    get pricingPageLnk(){return $("//a[normalize-space()='Pricing']")}
    get pricingTxt(){return $("//strong[contains(text(),'What’s included?')]")}
    get templatesLnk(){return $("//button[@class='desktopNavigation_headerText__bZrI_']")}
    get scrollTotempTxt(){return $("//span[normalize-space()='Digital Signage Templates']")}
    get howItworksLnk(){return $("//a[normalize-space()='How it Works']")}
    get startFreetrialTxt(){return $("(//a[@role='button'])[4]")}
    get industriesLnk(){return $("//ul[@class='corporal']//a[contains(text(),'Industries')]")}
    get hardwareLnk(){return $("//a[normalize-space()='Hardware']")}
    get playerSoftwareLnk(){return $("//a[normalize-space()='Player Software']")}
//=========================================Soultions Page Hospitality=========================================================
    get Scroll2(){return $("(//div)[103]")}
    get Scroll3(){return $("(//div)[124]")}
    get Scroll4(){return $("(//div)[129]")}
    get Scroll5(){return $("(//div)[158]")}
    get Scroll6(){return $("(//div)[171]")}
    get Scroll7(){return $("(//div)[208]")}
    get Scroll8(){return $("(//div)[236]")}
    get Scroll9(){return $("(//div)[264]")}
    get Scroll10(){return $("(//div)[708]")}
    get Scroll11(){return $("(//div)[726]")}
    get Scroll12(){return $("(//div)[756]")}//medical , fitness
    get hospitalityScroll13(){return $("//span[normalize-space()='Benefits of digital signage for hospitality venues']")}
    get Scroll14(){return $("//h2[normalize-space()='What our customers say']")}//fitness, medical
    get Scroll15(){return $("(//div[contains(text(),'350+ 5-star reviews on Google')])[2]")}
    get Scroll16(){return $("(//div)[1049]")}
    get Scroll17(){return $("(//div)[1060]")}
    //=============================================Retail===================================
    get retailScroll10(){return $("(//div)[668]")}
    get retailScroll11(){return $("(//div)[686]")}
    get retailScroll12(){return $("(//div)[706]")}
    get retailScroll13(){return $("//span[normalize-space()='Benefits of digital signage for gift stores']")}
    get retailScroll14(){return $("(//div)[786]")}
    get retailScroll15(){return $("(//div[contains(text(),'350+ 5-star reviews on Google')])[2]")}
    get retailScroll16(){return $("//h2[@itemprop='headline']//a[@title='Books']")}
    get retailScroll17(){return $("//p[contains(text(),'Take Mandoe for a test drive to see how easy it is')]")}

//======================================================Hair and Beauty==============================================================
    get hairnBeautyScroll9(){return $("(//strong[normalize-space()='Landscape'])[1]")}
    get hairnBeautyScroll10(){return $("(//div)[678]")}
    get hairnBeautyScroll11(){return $("(//div)[696]")}
    get hairnBeautyScroll12(){return $("(//div)[716]")}
    get hairnBeautyScroll13(){return $("//span[normalize-space()='Benefits of digital signage for Hair Salons']")}
    get hairnBeautyScroll14(){return $("(//div)[796]")}
    get hairnBeautyScroll15(){return $("(//div)[874]")}
    get hairnBeautyScroll16(){return $("//h2[@itemprop='headline']//a[@title='Doctor']")}   

 //=========================================================Medical===========================================  
    get medicalScroll10(){return $("(//div)[718]")}//fitness
    get medicalScroll11(){return $("(//div)[736]")}//fitness  
    get medicalScroll13(){return $("//span[normalize-space()='Benefits of digital signage for Pharmacies']")}
    get medicalScroll15(){return $("(//div)[920]")}//fitness
    get medicalScroll16(){return $("//h2[@itemprop='headline']//a[@title='Clinics']")}  
    get fitnessScroll13(){return $("//span[normalize-space()='Benefits of digital signage for gyms']")}////fitness 
    get sallyImg(){return $("(//div)[848]")}//medical

//======================================================Digital Menu Boards ================================================

    get digitalMenuBoardsScroll2(){return $("(//div)[109]")}
    get digitalMenuBoardsScroll3(){return $("(//div)[133]")}
    get digitalMenuBoardsScroll4(){return $("(//div)[166]")}
    get digitalMenuBoardsScroll5(){return $("(//div)[195]")}
    get digitalMenuBoardsScroll6(){return $("//img[@alt='digital menuboard analytics']")}
    get digitalMenuBoardsScroll7(){return $("(//div)[263]")}
    get digitalMenuBoardsScroll8(){return $("(//h3)[8]")}
    get digitalMenuBoardsScroll9(){return $("(//p)[12]")}
    get digitalMenuBoardsScroll10(){return $("(//div)[825]")}
//========================================Window Signage=================================================    
    get windowSignageScroll6(){return $("//img[@title='Crust - reporting']")}
    get windowSignageScroll09(){return $("(//h2)[6]")}
    get windowSignageScroll10(){return $("(//p)[14]")}
    get windowSignageScroll11(){return $("(//div)[850]")}
//=========================================In-store Signage======================================
    get instoreSignageScroll6(){return $("//img[@title='digital menuboard analytics']")}
//=============================================Enterprise ============================================
    get enterpriseScroll2(){return $("(//p)[4]")}
    get enterpriseScroll3(){return $("(//p)[13]")}
    get enterpriseScroll4(){return $("(//p)[17]")}
    get enterpriseScroll5(){return $("(//div)[143]")}
    get enterpriseScroll6(){return $("(//div)[172]")}
    get enterpriseScroll7(){return $("(//div)[203]")}
    get enterpriseScroll8(){return $("(//p)[31]")}
    get enterpriseScroll9(){return $("(//div)[285]")}
    get enterpriseScroll10(){return $("(//div)[321]")}
    get enterpriseScroll11(){return $("(//img)[51]")}
    get enterpriseScroll12(){return $("(//div)[346]")}
    get enterpriseScroll13(){return $("//input[@value='Talk to Us']")}
    get enterpriseScroll14(){return $("(//p)[37]")}
//=======================================templates page =============================================
    get tempScroll2(){return $("(//div)[131]")}
    get tempScroll3(){return $("(//div)[352]")}
    get tempScroll4(){return $("(//div)[592]")}
    get tempScroll5(){return $("(//div)[813]")}
    get tempScroll6(){return $("(//div)[1053]")}
    get tempScroll7(){return $("(//div)[1274]")}
    get tempScroll8(){return $("(//div)[1514]")}
    get tempScroll9(){return $("(//div)[1735]")}
    get tempScroll10(){return $("(//div)[1975]")}
    get tempScroll11(){return $("(//div)[2196]")}
    get tempScroll12(){return $("(//div)[2436]")}
    get tempScroll13(){return $("(//span[contains(text(),'Portrait')])[6]")}
    get tempScroll14(){return $("//span[normalize-space()='Retail']")}
    get tempScroll15(){return $("(//span[contains(text(),'Portrait')])[7]")}
    get tempScroll16(){return $("(//span[normalize-space()='Real Estate'])[1]")}
    get tempScroll17(){return $("(//span[contains(text(),'Portrait')])[8]")}
    get tempScroll18(){return $("(//p[contains(text(),'Create beautiful digitals signs and display them i')])[1]")}
 //=======================================templates category page- Hospitality =============================================
    get tempHospScroll2(){return $("(//h2)[1]")}  
    get tempHospScroll3(){return $("(//h3)[2]")}
    get tempHospScroll4(){return $("(//h2)[2]")}
    get tempHospScroll5(){return $("(//h3)[4]")}  
    get tempHospScroll6(){return $("(//h2)[3]")} 
    get tempHospScroll7(){return $("(//h3)[6]")}  
    get tempHospScroll8(){return $("(//h2)[4]")}  
    get tempHospScroll9(){return $("(//h3)[8]")}
    get tempHospScroll10(){return $("(//h2)[5]")}  
    get tempHospScroll11(){return $("(//h3)[10]")}
    get tempHospScroll12(){return $("(//h2)[6]")}  
    get tempHospScroll13(){return $("(//p)[3]")}
      //=======================================templates category page- Freshfood =============================================
    get tempFreshfoodScroll2(){return $("(//h2)[1]")}  
    get tempFreshfoodScroll3(){return $("(//h3)[2]")}
    get tempFreshfoodScroll4(){return $("(//h2)[2]")}
    get tempFreshfoodScroll5(){return $("(//h3)[4]")}  
    get tempFreshfoodScroll6(){return $("(//h2)[3]")} 
    get tempFreshfoodScroll7(){return $("(//h3)[6]")}  
    get tempFreshfoodScroll8(){return $("(//h2)[4]")}  
    get tempFreshfoodScroll9(){return $("(//h3)[8]")}
    get tempFreshfoodScroll10(){return $("(//h2)[5]")}  
    get tempFreshfoodScroll11(){return $("(//h3)[10]")}
    get tempFreshfoodScroll12(){return $("(//h2)[6]")}  
    get tempFreshfoodScroll13(){return $("(//p)[3]")}

    //=======================================templates category page- fitness =============================================
    get tempfitnessScroll2(){return $("(//h2)[1]")}  
    get tempfitnessScroll3(){return $("(//h3)[2]")}
    get tempfitnessScroll4(){return $("(//h2)[2]")}
    get tempfitnessScroll5(){return $("(//h3)[4]")}  
    get tempfitnessScroll6(){return $("(//h2)[3]")} 
    get tempfitnessScroll7(){return $("(//h3)[6]")}  
    get tempfitnessScroll8(){return $("(//h2)[4]")}  
    get tempfitnessScroll9(){return $("(//h3)[8]")}
    get tempfitnessScroll10(){return $("(//h2)[5]")}  
    get tempfitnessScroll11(){return $("(//h3)[10]")}
    get tempfitnessScroll12(){return $("(//h2)[6]")}  
    get tempfitnessScroll13(){return $("(//p)[3]")}
    //=======================================templates category page- health =============================================
    get temphealthScroll2(){return $("(//h2)[1]")}  
    get temphealthScroll3(){return $("(//h3)[2]")}
    get temphealthScroll4(){return $("(//h2)[2]")}
    get temphealthScroll5(){return $("(//h3)[4]")}  
    get temphealthScroll6(){return $("(//h2)[3]")} 
    get temphealthScroll7(){return $("(//h3)[6]")}  
    get temphealthScroll8(){return $("(//h2)[4]")}  
    get temphealthScroll9(){return $("(//h3)[8]")}
    get temphealthScroll10(){return $("(//h2)[5]")}     
    get temphealthScroll11(){return $("(//h2)[6]")}  

 //=======================================templates category page- medical =============================================
    get tempmedicalScroll2(){return $("(//h2)[1]")}  
    get tempmedicalScroll3(){return $("(//h3)[2]")}
    get tempmedicalScroll4(){return $("(//h2)[2]")}
    get tempmedicalScroll5(){return $("(//h3)[4]")}  
    get tempmedicalScroll6(){return $("(//h2)[3]")} 
    get tempmedicalScroll7(){return $("(//h3)[6]")}  
    get tempmedicalScroll8(){return $("(//h2)[4]")}  
    get tempmedicalScroll9(){return $("(//h3)[8]")}
    get tempmedicalScroll10(){return $("(//h2)[5]")}     
    get tempmedicalScroll11(){return $("//img[@title='Mandoe makes digital Signage Simple']")} 

     //=======================================templates category page- Financial =============================================
    get tempFinancialScroll2(){return $("(//h2)[1]")}  
    get tempFinancialScroll3(){return $("(//h3)[2]")}
    get tempFinancialScroll4(){return $("(//h2)[2]")}
    get tempFinancialScroll5(){return $("//img[@title='Mandoe makes digital Signage Simple']")} 

     //====================================== page- swimartBlog =============================================
    get swimartBlogScroll2(){return $("//img[@alt='Installed at over 70 sites']")}  
    get swimartBlogScroll3(){return $("(//p)[5]")}
    get swimartBlogScroll4(){return $("(//h2)[3]")}
    get swimartBlogScroll5(){return $("(//p)[13]")} 
    get swimartBlogScroll6(){return $("//img[@alt='Swimart quote 1']")} 

    get swimartBlogScroll7(){return $("(//p)[14]")}
    get swimartBlogScroll8(){return $("(//p)[19]")}
    get swimartBlogScroll9(){return $("(//p)[20]")}
    get swimartBlogScroll10(){return $("//img[@alt='Swimart quote 2']")} 
    get swimartBlogScroll11(){return $("(//img[@alt='Swimart chooses Mandoe for digital signage'])[3]")}
    get swimartBlogScroll12(){return $("(//div)[127]")}
    get swimartBlogScroll13(){return $("(//div)[193]")}
    get footerScroll(){return $("//img[@title='Mandoe makes digital Signage Simple']")}
      //====================================== page- foodBlog =============================================
    get foodBlogScroll2(){return $("(//p)[5]")}  
    get foodBlogScroll3(){return $("(//p)[6]")}
    get foodBlogScroll4(){return $("(//p)[7]")}
    get foodBlogScroll5(){return $("(//p)[8]")} 
    get foodBlogScroll6(){return $("(//p)[9]")} 

    get foodBlogScroll7(){return $("(//div)[173]")}
    get foodBlogScroll8(){return $("(//div)[250]")}
     //====================================== page- Blog- How to increase your foot traffic and boost your sales =============================================
    get TrafficBlogScroll2(){return $("(//p)[5]")}  
    get TrafficBlogScroll3(){return $("(//p)[6]")}
    get TrafficBlogScroll4(){return $("(//img[@alt='How to increase foot traffic to your store and boost sales'])[1]")}
    get TrafficBlogScroll5(){return $("(//h3)[2]")} 
    get TrafficBlogScroll6(){return $("(//h3)[4]")} 

    get TrafficBlogScroll7(){return $("(//h3)[5]")}
    get TrafficBlogScroll8(){return $("(//div)[110]")}
    get TrafficBlogScroll9(){return $("(//h2)[2]")}
    get TrafficBlogScroll10(){return $("//a[@title='Modern cafe design ideas']")}
    get TrafficBlogScroll11(){return $("(//div)[296]")}
    get TrafficBlogScroll12(){return $("(//div)[327]")}
      //=======================================templates category page- Liquor promotional template =============================================
    get tempLiquorScroll2(){return $("(//div)[113]")}  
    get tempLiquorScroll3(){return $("(//h3)[1]")}
    get tempLiquorScroll4(){return $("(//h3)[2]")}
    get tempLiquorScroll5(){return $("(//h2)[3]")}  
    get tempLiquorScroll6(){return $("(//p)[16]")}  

 //=======================================templates category page- Real-estate =============================================
    get tempRealestateScroll2(){return $("(//h2)[1]")}  
    get tempRealestateScroll3(){return $("(//h3)[2]")}
    get tempRealestateScroll4(){return $("(//h2)[2]")}
    get tempRealestateScroll5(){return $("(//h3)[4]")}  
    get tempRealestateScroll6(){return $("(//h2)[3]")}
    get tempRealestateScroll7(){return $("//img[@title='Mandoe makes digital Signage Simple']")}   
     //=======================================templates category page-Hair and  beauty =============================================
     get tempbeautyScroll2(){return $("(//h2)[1]")}  
     get tempbeautyScroll3(){return $("(//h3)[2]")}
     get tempbeautyScroll4(){return $("(//h2)[2]")}
     get tempbeautyScroll5(){return $("(//h3)[4]")}  
     get tempbeautyScroll6(){return $("(//h2)[3]")} 
     get tempbeautyScroll7(){return $("(//h3)[6]")}  
     get tempbeautyScroll8(){return $("(//h2)[4]")}  
     get tempbeautyScroll9(){return $("(//h3)[8]")}
     get tempbeautyScroll10(){return $("(//h2)[5]")}  
     get tempbeautyScroll11(){return $("(//h3)[10]")}
     get tempbeautyScroll12(){return $("(//h2)[6]")}
     get tempbeautyScroll13(){return $("(//h3)[12]")} 
     get tempbeautyScroll14(){return $("(//h2)[7]")}   
     get tempbeautyScroll15(){return $("(//p)[3]")}
      //=======================================templates category page Retail =============================================
     get tempRetailScroll2(){return $("(//h2)[1]")}  
     get tempRetailScroll3(){return $("(//h3)[2]")}
     get tempRetailScroll4(){return $("(//h2)[2]")}
     get tempRetailScroll5(){return $("(//h3)[4]")}  
     get tempRetailScroll6(){return $("(//h2)[3]")} 
     get tempRetailScroll7(){return $("(//h3)[6]")}  
     get tempRetailScroll8(){return $("(//h2)[4]")}  
     get tempRetailScroll9(){return $("(//h3)[8]")}
     get tempRetailScroll10(){return $("(//h2)[5]")}  
     get tempRetailScroll11(){return $("(//h3)[10]")}
     get tempRetailScroll12(){return $("(//h2)[6]")}
     get tempRetailScroll13(){return $("(//h3)[12]")} 
     get tempRetailScroll14(){return $("(//h2)[7]")}    
     get tempRetailScroll15(){return $("(//h3)[14]")}  
     get tempRetailScroll16(){return $("(//h2)[8]")}  
     get tempRetailScroll17(){return $("(//h3)[16]")}  
     get tempRetailScroll18(){return $("(//h2)[9]")} 
     get tempRetailScroll19(){return $("(//h3)[18]")}  
     get tempRetailScroll20(){return $("(//h2)[10]")}    
     get tempRetailScroll21(){return $("(//p)[3]")}

//========================================Pricing page ==============================================================================================================

    get pricingScroll2(){return $("(//div)[161]")}
    get pricingScroll3(){return $("(//div)[173]")}
    get pricingScroll4(){return $("(//div)[198]")}
//========================================About us  page ==============================================================================================================

    get aboutScroll2(){return $("(//div)[79]")}
    get aboutScroll3(){return $("(//div)[104]")}
    get aboutScroll4(){return $("(//h2)[2]")}

    get aboutScroll5(){return $("(//h2)[3]")}
    get aboutScroll6(){return $("//img[@title='life-at-mandoe']")}
    get aboutScroll7(){return $("(//div)[154]")}

    get aboutScroll8(){return $("(//div)[184]")}

//-================================ Blog page ============================================================================================================
    get blogScroll2(){return $("(//h2)[1]")}    
    get blogScroll3(){return $("(//h2)[2]")} 
    get blogScroll4(){return $("(//h2)[14]")} 
    get blogScroll5(){return $("//a[@title='Case Studies']//span")}        
    get blogScroll6(){return $("//a[@title='News and Updates']//span")}        
    get blogScroll7(){return $("//a[@title='Design Inspiration']//span")}   
    get blogScroll8(){return $("//p[contains(text(),'Create beautiful digitals signs and display them i')]")}  
    //-================================ Case Studies ============================================================================================================
    get caseStudiesScroll2(){return $("(//div)[103]")}    
    get caseStudiesScroll3(){return $("(//div)[203]")} 
    get caseStudiesScroll4(){return $("(//div)[269]")} 
    get caseStudiesScroll5(){return $("(//p)[7]")}        

 //===================================Customers=================================================================================   
    get customersScroll2(){return $("(//div)[82]")}    
    get customersScroll3(){return $("(//div)[159]")}    
    get customersScroll4(){return $("(//div)[269]")}  

    get customersScroll5(){return $("(//div)[339]")}     
//===================================== Safety Warranty regulatory guide =============================================================
    get safetyWarrantyScroll2(){return $("(//p)[2]")} 
    get safetyWarrantyScroll3(){return $("(//p)[23]")} 
    get safetyWarrantyScroll4(){return $("(//strong)[6]")} 
    get safetyWarrantyScroll5(){return $("(//p)[43]")} 
    get safetyWarrantyScroll6(){return $("(//strong)[11]")} 
    get safetyWarrantyScroll7(){return $("(//strong)[12]")} 
    get safetyWarrantyScroll8(){return $("(//p)[66]")} 
//==============================================Contact/Sales page ========================================================================
    get contactSalesScroll2(){return $("//p[contains(text(),'Enter your details below and a member of our team ')]")} 
    get contactSalesScroll3(){return $("//label[@for='input_4_16']")} 
    get contactSalesScroll4(){return $("//input[@value='TALK TO US']")} 
//==========================================================Partner-Program==========================================================
    get partnerProgramScroll2(){return $("(//div)[88]")} 
    get partnerProgramScroll3(){return $("(//div)[112]")} 
    get partnerProgramScroll4(){return $("(//div)[136]")} 
    get partnerProgramScroll5(){return $("(//li)[36]")} 
    get partnerProgramScroll6(){return $("//label[@for='input_19_3']")} 
    get partnerProgramScroll7(){return $("//input[@value='Talk to Us']")} 
    get partnerProgramScroll8(){return $("(//div)[197]")} 
//=====================================================Terms of use ===================================================================

     get termsOfuseScroll2(){return $("(//h3)[1]")} 
     get termsOfuseScroll3(){return $("(//h3)[5]")} 
     get termsOfuseScroll4(){return $("(//h3)[7]")} 
     get termsOfuseScroll5(){return $("(//h3)[10]")} 
     get termsOfuseScroll6(){return $("(//p)[68]")} 
     get termsOfuseScroll7(){return $("(//li)[33]")} 
     get termsOfuseScroll8(){return $("(//h3)[15]")}
     get termsOfuseScroll9(){return $("(//p)[102]")} 
     get termsOfuseScroll10(){return $("(//li)[46]")} 
     get termsOfuseScroll11(){return $("(//a[@href='#next'])[4]")}  
     get termsOfuseScroll12(){return $("(//div)[139]")} 
//=====================================================Locations  ===================================================================

     get locationsScroll2(){return $("(//div)[96]")}
     get locationsScroll3(){return $("(//div)[138]")}   
     get locationsScroll4(){return $("(//div)[180]")} 
     get locationsScroll5(){return $("(//div)[222]")} 
     get locationsScroll6(){return $("(//div)[264]")} 
     get locationsScroll7(){return $("(//div)[306]")} 
     get locationsScroll8(){return $("(//div)[348]")} 
     get locationsScroll9(){return $("(//h3)[43]")} 
     get locationsScroll10(){return $("(//h3)[49]")} 
     get locationsScroll11(){return $("(//h3)[55]")} 
     get locationsScroll12(){return $("(//h3)[61]")} 
     get locationsScroll13(){return $("(//h3)[67]")} 
     get locationsScroll14(){return $("(//h3)[73]")} 
     get locationsScroll15(){return $("(//h3)[79]")} 
     get locationsScroll16(){return $("(//h3)[85]")} 
     get locationsScroll17(){return $("(//h3)[91]")}
     get locationsScroll18(){return $("(//h3)[97]")}  
     get locationsScroll19(){return $("(//h3)[103]")}  
     get locationsScroll20(){return $("(//h3)[109]")} 
     get locationsScroll21(){return $("(//h3)[117]")}
     get locationsScroll22(){return $("(//h3)[123]")}
     get locationsScroll23(){return $("(//h3)[129]")}
     get locationsScroll24(){return $("(//h3)[135]")}
     get locationsScroll25(){return $("(//h3)[141]")}
     get locationsScroll26(){return $("(//h3)[147]")}
     get locationsScroll27(){return $("(//h3)[153]")}
     get locationsScroll28(){return $("(//h3)[159]")}
     get locationsScroll29(){return $("(//h3)[165]")}
     get locationsScroll30(){return $("(//h3)[171]")}

     get locationClick1(){return $("//a[normalize-space()='Norwich']")}
     get locationClick2(){return $("//a[normalize-space()='Preston']")}

//=====================================================Privacy Policy ===================================================================

    get privacyPolicyScroll2(){return $("(//h3)[1]")} 
    get privacyPolicyScroll3(){return $("(//p)[26]")} 
    get privacyPolicyScroll4(){return $("(//p)[34]")} 
    get privacyPolicyScroll5(){return $("(//p)[42]")} 
    get privacyPolicyScroll6(){return $("(//h3)[6]")} 
    get privacyPolicyScroll7(){return $("(//p)[58]")} 
    get privacyPolicyScroll8(){return $("(//p)[76]")} 
    get privacyPolicyScroll9(){return $("(//h3)[14]")} 
    get privacyPolicyScroll10(){return $("(//div)[154]")} 
//=====================================================Info ===================================================================

    get infoScroll2(){return $("(//div)[94]")} 
    get infoScroll3(){return $("(//div)[103]")} 
//=========================================================Support================================================================
get supportScroll2(){return $("//p[contains(text(),'Enter your details below and a member of our team ')]")} 
    get supportScroll3(){return $("//label[@for='input_17_13']")} 

    get supportScroll4(){return $("(//div)[123]")} 
//=================================================== legal ==================================================================
    get legalScroll2(){return $("(//p)[6]")} 
//=================================================== Thanks ==================================================================
    get thanksScroll2(){return $("(//div)[101]")} 
    get thanksScroll3(){return $("//img[@title='Mandoe makes digital Signage Simple']")} 
//=====================================================trialForm ===================================================================

    get trialFormScroll2(){return $("(//h1)[1]")}
//=====================================================Reseller Program ===================================================================

    get resellerProgramScroll2(){return $("//a[@href='#join']")}
    get resellerProgramScroll3(){return $("//label[@for='input_21_10']")}
    get resellerProgramScroll4(){return $("(//select)[1]")}
    get resellerProgramScroll5(){return $("//input[@value='Register your interest']")}

    get hospitalityLnk(){return $("//a[@href='/industries/hospitality/']")}
    get talkSalesBtn(){return $("(//a[@role='button'])[4]")}
    get retailLnk(){return $("//a[@href='/industries/gift-store/']")}
    get hairnBeautyLnk(){return $("//a[@href='/industries/hair-salon/']")}
    get medicalLnk(){return $("//a[@href='/industries/pharmacy/']")}
    get fitnessLnk(){return $("//a[@href='/industries/gym/']")}
    get moreLnk(){return $("//a[normalize-space()='More']")}
    get digMenuBoardsLnk(){return $("//a[normalize-space()='Digital Menu Boards']")}
    get digMenuBoardTxt(){return $("(//span[contains(text(),'Talk to Sales')])[2]")}
    get windowSignageLnk(){return $("//a[normalize-space()='Window Signage']")}
    get instoreSignageLnk(){return $("//a[normalize-space()='In-Store Signage']")}
    get enterpriseLnk(){return $("//a[@href='/enterprise/']")}
    get customersLnk(){return $("//a[@href='/customers/']")}
    get partnerProgramLnk(){return $("//a[@href='/partner-program/']")}
    get partnerProgramTxt(){return $("//span[normalize-space()='Join the Partner Program']")}
//============================================Resources Page ===========================================================
    get blogLnk(){return $("//a[@href='/blog/']")}
    get sliderSvg(){return $("(//*[name()='svg'][@role='img'])[1]")}
    get caseStudiesLnk(){return $("//a[@href='/blog/topic/case-studies/']")}
    get caseStudiesTxt(){return $("//a[@class='case-studies']")}
    get helpCentreLnk(){return $("(//a[@href='https://help.mandoemedia.com'])[1]")}
    get aboutLnk(){return $("//a[normalize-space()='About']")}
    get contactLnk(){return $("//a[normalize-space()='Contact']")}
    get supportLnk(){return $("//a[normalize-space()='Support']")}

//============================================Help Centre ===========================================================
    get helpCentreScroll2(){return $("(//h3)[1]")}

   //===============================================Buttons-home===================================================

   get topNavStartFreeTrialBtn(){return $("(//a[@role='button'])[3]")}
   get homeSFT02(){return $("(//a[@role='button'][normalize-space()='Start Free Trial'])[3]")}

   get AUhomeSFT02(){return $("(//a[contains(text(),'Talk to a Specialist')])[1]")}

   get scrollToSvg(){return $("(//h2)[3]")}
   get homeSFT03(){return $("(//a[@role='button'][normalize-space()='Start Free Trial'])[4]")}
   get AUhomeSFT03(){return $("//a[normalize-space()='Speak to a Specialist']")}
   get homeMVF01(){return $("(//a[@role='button'])[5]")}
   get homeMVF02(){return $("(//a[@role='button'])[7]")}
 //==========features
   get featuresSFT01(){return $("(//a[@role='button'])[4]")}
   get featuresMVF01(){return $("(//a[@role='button'])[5]")}
   get featuresMVF02(){return $("(//a[@role='button'])[7]")}
   get scrollfeaturesfooter(){return $("//span[normalize-space()='Get Started Today!']")}
   get howItworksGetSFF01(){return $("(//a[@role='button'])[4]")}

   get scrollsignupandcreate(){return $("(//div)[143]")}
   get howItworksSignupFF01(){return $("(//a[@role='button'])[5]")}
   get scrollconnectyrdisplay(){return $("(//div)[189]")}
   get howItworksSignupFF02(){return $("(//a[@role='button'])[6]")}
   get scrollGetSFFtxt(){return $("(//h2)[5]")}
   get howItworksFooterGetSF(){return $("(//a[@role='button'])[7]")}

//===============Template================================================
   get scrolltempfooterGetSFFtxt(){return $("(//h2)[9]")} 
   get templatesFooterGetSF(){return $("(//a[@href='https://sandbox.mandoemedia.com/sandbox-wizard'])[1]")}

   //========template category Hospitality================
   get hospStartY14DFT(){return $("(//a[@role='button'])[4]")}

   //==========================Industries - 1 button on the footwe=========================================
   get scrollindustriesfooterGetSFFtxt(){return $("(//h2)[10]")} 
   get templatesFooterGetSF(){return $("(//a[@href='https://sandbox.mandoemedia.com/sandbox-wizard'])[1]")}
   //============================Player Hardware/ coonecting the player- 3 buttons  =========================================

   get buyMediaPlayerBtn(){return $("(//span[normalize-space()='Buy Media Player'])[1]")}
   get activatePlayerBtn(){return $("(//a[@role='button'])[5]")}
   get scrollpHwfootGetSFFtxt(){return $("(//div)[233]")} 

   get playerHWGSFBtn(){return $("(//a[@role='button'])[6]")}

   //=======================Player software / download player 02 buttons on the footer==============================

   get scrollpSwfootGetStodaytxt(){return $("(//h2)[1]")} 
   get PlayerSWStartFTBtn(){return $("(//a[@role='button'])[7]")}
   get PlayerSWMVFBtn(){return $("(//a[@href='https://sandbox.mandoemedia.com/sandbox-wizard'])[1]")}

   //=====================Soultions- Hospitality

   get HospitalitySFTBtn(){return $("(//a[@role='button'])[4]")}
   get HospitalityMakeaDigSign(){return $("(//a[@role='button'])[5]")}
   //=====portrait templates div to get the middle image bar
   get scrollHospGSTdiv(){return $("(//div)[466]")}
   get HospitalitySFTBtn02(){return $("(//a[@role='button'])[6]")}
   get scrollHospFooterGSTtxt(){return $("(//h2)[15]")}
   get HospitalitySFTBtn03(){return $("(//a[@role='button'])[7]")}
   get HospitalityfooterMVIF(){return $("(//a[@role='button'])[8]")}

   //================================== Use cases - Digital menuboard

   get DigMBSFTBtn01(){return $("(//a[@role='button'])[4]")}
   get DigMBmakeaDM(){return $("(//a[@role='button'])[5]")}
   get scrollDigMBimg(){return $("(//div)[246]")}

   get DigMBSFTBtn02(){return $("(//a[@role='button'])[6]")}
   get scrollDigMBFooterGSTtxt(){return $("(//h2)[7]")}
   get DigMBSFTBtn03(){return $("(//a[@role='button'])[7]")}
   get DigMBfooterMVIF(){return $("(//a[@role='button'])[8]")}

//===============================Solutions Enterprise
   get EntConOurTeam(){return $("(//a[@role='button'])[4]")}
   get scrollEntFooterSTOT(){return $("(//h2[normalize-space()='Speak to our team today'])[1]")}
   get EntConUs(){return $("(//a[@role='button'])[5]")}

//===============================Solutions Customers
   get CustomerSFT01(){return $("(//div)[86]")}
   get CustomerMVIF01(){return $("(//a[@role='button'])[5]")}
   get scrollCusFooterGST(){return $("(//h2)[1]")}
   get CustomerSFT02(){return $("(//a[@role='button'])[6]")}
   get CustomerMVIF02(){return $("(//a[@role='button'])[7]")}

//==========================Blog
   get scrollBlogSFT01(){return $("(//div)[464]")}
   get BlogSFT01(){return $("(//a[@role='button'])[4]")}
   get scrollBlogfooterGSFF(){return $("(//h2)[19]")}
   get BlogfooterGSF(){return $("(//a[@href='https://sandbox.mandoemedia.com/sandbox-wizard'])[1]")}

//=========Food sustainability
get BlogFoodMVIF(){return $("(//a[@role='button'])[4]")}
get scrollBlogFoodGS(){return $("(//div)[118]")}
get BlogFoodGS(){return $("(//a[@role='button'])[5]")}
get scrollBlogFoodGSF(){return $("(//h2)[6]")}
get BlogFoodGSF(){return $("(//a[@role='button'])[6]")}
//============Case studies
get CStudiesGS(){return $("(//a[@role='button'])[4]")}
get scrollCStudiesGSF(){return $("(//h2)[3]")}
get CStudiesGSF(){return $("(//a[@role='button'])[5]")}

//==============Soft ware only pricing
get scrollSWOPS14DFT(){return $("//p[contains(text(),'Good for businesses with basic requirements who on')]")}
get SWOP14DFTleft(){return $("(//a[@role='button'])[5]")}
get SWOP14DFTright(){return $("(//a[@role='button'])[7]")}
get scrollSWOPfooterGSF(){return $("(//h2)[1]")}
get SWOPGSF(){return $("(//a[@role='button'])[8]")}

//=============about
get scrollAboutfooter(){return $("(//h2)[4]")}
get aboutSFT(){return $("(//a[@role='button'])[4]")}
get aboutMVIF(){return $("(//a[@href='https://sandbox.mandoemedia.com/sandbox-wizard'])[1]")}

    open () {
        return super.open('/');
    }
}

module.exports = new HomePage();

/pageobjects/page.js:

/**
* main page object containing all methods, selectors and functionality
* that is shared across all page objects
*/
module.exports = class Page {
    /**
    * Opens a sub page of the page
    * @param path path of the sub page (e.g. /path/to/page.html)
    */
    open (path) {
        return browser.url(path)
    }
}
wswebcreation commented 1 year ago

lol, I was just looking for a git project with package.json and so on πŸ˜† . Is that something you can do?

sdoigmm commented 1 year ago

Woops!

New to git/github. Here it is: https://github.com/sdoigmm/mandoe-visual-testing-02/

sdoigmm commented 1 year ago

You will need to be on a USA VPN when you run the current test.

(& UK or AUS VPN when commenting out the US test specs/uncommenting out the UK or AUS test specs in the config file)

wswebcreation commented 1 year ago

image

sdoigmm commented 1 year ago

Hmmm, try now

sdoigmm commented 1 year ago

Sorry to bother you, just following up

sdoigmm commented 1 year ago

@wswebcreation the repo is now non-empty

wswebcreation commented 1 year ago

@sdoigmm

I've cloned the project and installed it on my

And I'm not getting any issues

[chrome 112.0.5615.137 mac os x #0-0] Running: chrome (v112.0.5615.137) on mac os x
[chrome 112.0.5615.137 mac os x #0-0] Session ID: 3f311eb02851c08e9f35a5ac73c0e90e
[chrome 112.0.5615.137 mac os x #0-0]
[chrome 112.0.5615.137 mac os x #0-0] Β» /test/specs/US-products.spec.js
[chrome 112.0.5615.137 mac os x #0-0] Products page
[chrome 112.0.5615.137 mac os x #0-0]    βœ“ should save Products-Features page screenshotsscreenshots
[chrome 112.0.5615.137 mac os x #0-0]    βœ“ should compare Products-Features page screenshots
[chrome 112.0.5615.137 mac os x #0-0]    βœ“ should save Products-Templates page screenshots
[chrome 112.0.5615.137 mac os x #0-0]    βœ“ should compare Products-Templates page screenshots
[chrome 112.0.5615.137 mac os x #0-0]    βœ“ should save Products-how-it-works page screenshots
[chrome 112.0.5615.137 mac os x #0-0]    βœ“ should compare Products-how-it-works page screenshots
[chrome 112.0.5615.137 mac os x #0-0]    βœ“ should save Products-industries2 page screenshots
[chrome 112.0.5615.137 mac os x #0-0]    βœ“ should compare Products-industries2 page screenshots
[chrome 112.0.5615.137 mac os x #0-0]    βœ“ should save Products-ids-getting-started-guide page screenshots
[chrome 112.0.5615.137 mac os x #0-0]    βœ“ should compare Products-ids-getting-started-guide page screenshots
[chrome 112.0.5615.137 mac os x #0-0]    βœ“ should save Products-download-player page screenshots
[chrome 112.0.5615.137 mac os x #0-0]    βœ“ should compare Products-download-player page screenshots
[chrome 112.0.5615.137 mac os x #0-0]
[chrome 112.0.5615.137 mac os x #0-0] 12 passing (4m 47.8s)

Will close this issue for now