From 1d9e77be4821d34c7c69516c85c32679ead6d059 Mon Sep 17 00:00:00 2001 From: Lore Date: Wed, 8 Nov 2023 16:48:24 -0300 Subject: [PATCH] chore(#8159): Run our e2e standard test on minimum browser requirements (#8663) * Fix standard config specs to run on chrome 90 * Add changes after npm install * Revert unwanted changes * Add suggested feedback * Fix chrome_version env variable setup * Add chrome version to test name * Update binary not to use my local chrome * install chromedriver 90 * Revert deletion of chromedriver 90 dependency * Delete chromedriver dependency * Fix spaces in run * Change where to set CHROME_VERSION env * Add no-sandbox to prevent session not created chromedriver error * Revert change in the test names * Merge Install Chrome and Chromedriver version 90 in one step Co-authored-by: Gareth Bowen * Change name in step and, simplify chrome args * Fix name calculation * Fix eslint * Fix >> character * Add await browser.url('/'); before login * Add await browser.url('/'); before logout * Change roleField selector to work also on Chrome90 * Fix eslint * Use browserVersion to choose the method to get text from a span element * Fix eslint * Delete browser.url('/'); after logout * Delete no-sandbox option * Delete unnecessary waits * expose a common function to validate if the browser version is the minimum * Fix eslint * Create standard enketo wdio page to have common enketo forms definitions * Fix eslint * Delete BrowserVersion as is not neccesary if setting binary * Set undefined browserVersion when is not minimum * Delete chromedriver dependencies * Add chromedriver binary path * Add disable-dev-shm-usage arg * Fix eslint * Fix misspelled * Check chromedriver version * Get chromedriver version * Use node modules chromedriver * Fix driver version output * Add no-sandbox to make the test pass, and print browser and driver versions * Fix eslint * Add no-sandbox argument only when running tests with chrome90 * Implement feedback --------- Co-authored-by: Maria Lorena Rodriguez Viruel Co-authored-by: Gareth Bowen --- .github/workflows/build.yml | 24 +- package-lock.json | 211 +++++++++++++++++- package.json | 1 + .../contacts/contact-summary.wdio-spec.js | 8 +- .../e2e/standard/enketo/delivery.wdio-spec.js | 7 +- .../standard/enketo/pregnancy.wdio-spec.js | 1 + tests/e2e/wdio.conf.js | 36 ++- .../default/contacts/contacts.wdio.page.js | 4 +- .../default/login/login.wdio.page.js | 1 + .../standard/enketo/delivery.wdio.page.js | 25 ++- .../standard/enketo/enketo.wdio.page.js | 15 ++ .../enketo/immunization-visit.wdio.page.js | 6 +- .../enketo/pregnancy-visit.wdio.page.js | 10 +- .../standard/enketo/pregnancy.wdio.page.js | 17 +- tests/utils/index.js | 11 +- 15 files changed, 334 insertions(+), 43 deletions(-) create mode 100644 tests/page-objects/standard/enketo/enketo.wdio.page.js diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f619d853228..f74f1778d4a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -88,15 +88,17 @@ jobs: tests: needs: build - name: ${{ matrix.cmd }}-${{ matrix.suite || '' }} + name: ${{ matrix.cmd }}-${{ matrix.suite || '' }}${{ matrix.chrome-version == '90' && '-minimum-browser' || '' }} runs-on: ubuntu-22.04 env: NODE: 16.x + CHROME_VERSION: ${{ matrix.chrome-version }} strategy: fail-fast: false matrix: cmd: ['ci-webdriver-standard', 'ci-e2e-integration', 'ci-webdriver-default-mobile'] + chrome-version: ['90', 'latest'] suite: [all] include: - cmd: ci-webdriver-default @@ -109,7 +111,13 @@ jobs: suite: lowLevel - cmd: ci-webdriver-default suite: workflows - + exclude: # temporary until all suites run on Chrome 90 + - cmd: ci-e2e-integration + chrome-version: 90 + - cmd: ci-webdriver-default-mobile + chrome-version: 90 + - cmd: ci-webdriver-default + chrome-version: 90 steps: - name: Login to Docker Hub uses: docker/login-action@v2 @@ -150,7 +158,7 @@ jobs: if: ${{ !env.INTERNAL_CONTRIBUTOR }} - name: Set ENV - run: | + run: | echo "HORTI_BUILDS_SERVER=$MARKET_URL_READ/$BUILDS_SERVER" >> $GITHUB_ENV - name: Create logs directory run: mkdir tests/logs @@ -169,9 +177,15 @@ jobs: run: | mkdir -p allure-results/history cp -r build-history-data/cht-core/allure/${{ matrix.cmd }}-${{ matrix.suite }}/allure-report/history allure-results | true - - name: Run tests ${{ matrix.cmd }}-${{ matrix.suite }} + - name: Install Chrome 90 + if: ${{matrix.chrome-version=='90'}} + run: | + wget -O "google-chrome-stable_current_amd64.deb" https://www.slimjet.com/chrome/download-chrome.php?file=files/90.0.4430.72/google-chrome-stable_current_amd64.deb + sudo dpkg -i "google-chrome-stable_current_amd64.deb" + npm install chromedriver@^90.0.1 + - name: Run tests ${{ matrix.cmd }}-${{ matrix.suite }} on Chrome ${{ matrix.chrome-version }} run: npm run ${{ matrix.cmd }} -- --suite=${{ matrix.suite }} - + - name: Fetch allure history if: always() uses: actions/checkout@v3 diff --git a/package-lock.json b/package-lock.json index e68e7c9d0de..60f42ed4649 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,9 +12,6 @@ "workspaces": [ "./shared-libs/*" ], - "dependencies": { - "google-libphonenumber": "^3.2.31" - }, "devDependencies": { "@angular-builders/custom-webpack": "^16.0.1", "@angular-devkit/build-angular": "^16.2.1", @@ -116,6 +113,7 @@ "typescript": "^5.1.6", "uglify-js": "^3.17.4", "uuid": "^9.0.1", + "wdio-chromedriver-service": "^8.1.1", "webpack-bundle-analyzer": "^4.9.1", "zone.js": "^0.13.3" }, @@ -20008,6 +20006,15 @@ "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", "dev": true }, + "node_modules/ip-regex": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/ipaddr.js": { "version": "1.9.1", "dev": true, @@ -20533,6 +20540,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", + "dev": true + }, "node_modules/is-utf8": { "version": "0.2.1", "dev": true, @@ -20589,6 +20602,20 @@ "dev": true, "license": "MIT" }, + "node_modules/is2": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.9.tgz", + "integrity": "sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "ip-regex": "^4.1.0", + "is-url": "^1.2.4" + }, + "engines": { + "node": ">=v0.10.0" + } + }, "node_modules/isarray": { "version": "1.0.0", "dev": true, @@ -31807,6 +31834,33 @@ "node": ">=10" } }, + "node_modules/tcp-port-used": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.2.tgz", + "integrity": "sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==", + "dev": true, + "dependencies": { + "debug": "4.3.1", + "is2": "^2.0.6" + } + }, + "node_modules/tcp-port-used/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/term-size": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", @@ -33519,6 +33573,72 @@ "defaults": "^1.0.3" } }, + "node_modules/wdio-chromedriver-service": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/wdio-chromedriver-service/-/wdio-chromedriver-service-8.1.1.tgz", + "integrity": "sha512-pN3GiOkTIMnalfq4PJAHdX95pDp1orHnTY8W1fIbd6ok81ba97UjerTgS7lUDRUh1p0MAm35Ww0uc0/9wzB7SA==", + "dev": true, + "dependencies": { + "@wdio/logger": "^8.1.0", + "fs-extra": "^11.1.0", + "split2": "^4.1.0", + "tcp-port-used": "^1.0.2" + }, + "engines": { + "node": "^16.13 || >=18" + }, + "peerDependencies": { + "@wdio/types": "^7.0.0 || ^8.0.0-alpha.219", + "chromedriver": "*", + "webdriverio": "^7.0.0 || ^8.0.0-alpha.219" + }, + "peerDependenciesMeta": { + "@wdio/types": { + "optional": true + }, + "chromedriver": { + "optional": true + }, + "webdriverio": { + "optional": false + } + } + }, + "node_modules/wdio-chromedriver-service/node_modules/fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/wdio-chromedriver-service/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/wdio-chromedriver-service/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/web-streams-polyfill": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", @@ -50531,6 +50651,12 @@ "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", "dev": true }, + "ip-regex": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", + "dev": true + }, "ipaddr.js": { "version": "1.9.1", "dev": true @@ -50849,6 +50975,12 @@ "version": "0.1.0", "dev": true }, + "is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", + "dev": true + }, "is-utf8": { "version": "0.2.1", "dev": true @@ -50888,6 +51020,17 @@ "version": "0.3.0", "dev": true }, + "is2": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.9.tgz", + "integrity": "sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "ip-regex": "^4.1.0", + "is-url": "^1.2.4" + } + }, "isarray": { "version": "1.0.0", "dev": true @@ -59260,6 +59403,27 @@ } } }, + "tcp-port-used": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.2.tgz", + "integrity": "sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==", + "dev": true, + "requires": { + "debug": "4.3.1", + "is2": "^2.0.6" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } + } + }, "term-size": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", @@ -60435,6 +60599,47 @@ "defaults": "^1.0.3" } }, + "wdio-chromedriver-service": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/wdio-chromedriver-service/-/wdio-chromedriver-service-8.1.1.tgz", + "integrity": "sha512-pN3GiOkTIMnalfq4PJAHdX95pDp1orHnTY8W1fIbd6ok81ba97UjerTgS7lUDRUh1p0MAm35Ww0uc0/9wzB7SA==", + "dev": true, + "requires": { + "@wdio/logger": "^8.1.0", + "fs-extra": "^11.1.0", + "split2": "^4.1.0", + "tcp-port-used": "^1.0.2" + }, + "dependencies": { + "fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + } + } + }, "web-streams-polyfill": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", diff --git a/package.json b/package.json index 24b0c2610a6..a012fc0b3f7 100755 --- a/package.json +++ b/package.json @@ -156,6 +156,7 @@ "typescript": "^5.1.6", "uglify-js": "^3.17.4", "uuid": "^9.0.1", + "wdio-chromedriver-service": "^8.1.1", "webpack-bundle-analyzer": "^4.9.1", "zone.js": "^0.13.3" }, diff --git a/tests/e2e/standard/contacts/contact-summary.wdio-spec.js b/tests/e2e/standard/contacts/contact-summary.wdio-spec.js index a4ad30c0008..6a0c649df1c 100644 --- a/tests/e2e/standard/contacts/contact-summary.wdio-spec.js +++ b/tests/e2e/standard/contacts/contact-summary.wdio-spec.js @@ -166,7 +166,7 @@ describe('Contact summary info', () => { }, ); - const docs = [ patientAlice, placeBobClinic, patientCarol, patientDavid, carolPregnancy, davidVisit, carolVisit ]; + const docs = [patientAlice, placeBobClinic, patientCarol, patientDavid, carolPregnancy, davidVisit, carolVisit]; const settings = { uhc: { @@ -190,7 +190,7 @@ describe('Contact summary info', () => { before(async () => { await utils.saveDocs(docs); - await utils.createUsers([ districtAdminUser ]); + await utils.createUsers([districtAdminUser]); }); afterEach(async () => { @@ -200,7 +200,7 @@ describe('Contact summary info', () => { }); after(async () => { - await utils.deleteUsers([ districtAdminUser ]); + await utils.deleteUsers([districtAdminUser]); await utils.revertDb([/^form:/], true); }); @@ -234,6 +234,7 @@ describe('Contact summary info', () => { }); it('should display UHC Stats in contact summary, if contact counts visits and user has permission', async () => { + await browser.url('/'); await loginPage.login({ username: districtAdminUser.username, password: districtAdminUser.password }); await commonElements.waitForPageLoaded(); const originalSettings = await utils.getSettings(); @@ -256,6 +257,7 @@ describe('Contact summary info', () => { }); it('should have access to the "cht" global api variable', async () => { + await browser.url('/'); await loginPage.login({ username: districtAdminUser.username, password: districtAdminUser.password }); await commonElements.waitForPageLoaded(); const originalSettings = await utils.getSettings(); diff --git a/tests/e2e/standard/enketo/delivery.wdio-spec.js b/tests/e2e/standard/enketo/delivery.wdio-spec.js index 3a56eb7993b..5797d853b98 100644 --- a/tests/e2e/standard/enketo/delivery.wdio-spec.js +++ b/tests/e2e/standard/enketo/delivery.wdio-spec.js @@ -30,7 +30,8 @@ describe('Delivery', () => { //Create Woman1 await contactPage.contactPageDefault.addPerson({ name: pregnantWoman1, - dob: moment().subtract(25, 'years').format('YYYY-MM-DD') }); + dob: moment().subtract(25, 'years').format('YYYY-MM-DD') + }); // Submit new pregnancy for Woman1 await pregnancyForm.submitPregnancy(); @@ -46,7 +47,8 @@ describe('Delivery', () => { await commonPage.goToPeople(healthCenter._id); await contactPage.contactPageDefault.addPerson({ name: pregnantWoman2, - dob: moment().subtract(25, 'years').format('YYYY-MM-DD') }); + dob: moment().subtract(25, 'years').format('YYYY-MM-DD') + }); // Submit new pregnancy for Woman2 @@ -137,6 +139,7 @@ describe('Delivery', () => { }); it('Verify the targets page', async () => { + await browser.url('/'); await commonPage.logout(); await loginPage.login(user); await commonPage.waitForPageLoaded(); diff --git a/tests/e2e/standard/enketo/pregnancy.wdio-spec.js b/tests/e2e/standard/enketo/pregnancy.wdio-spec.js index 9d08584e5cd..41c46dcd076 100644 --- a/tests/e2e/standard/enketo/pregnancy.wdio-spec.js +++ b/tests/e2e/standard/enketo/pregnancy.wdio-spec.js @@ -127,6 +127,7 @@ describe('New pregnancy', () => { }); it('Verify the targets page', async () => { + await browser.url('/'); await commonPage.logout(); await loginPage.login(user); await commonPage.waitForPageLoaded(); diff --git a/tests/e2e/wdio.conf.js b/tests/e2e/wdio.conf.js index 2f3cc9e0eb0..cae302108fd 100644 --- a/tests/e2e/wdio.conf.js +++ b/tests/e2e/wdio.conf.js @@ -17,6 +17,22 @@ let testTile; const DEBUG = process.env.DEBUG; const DEFAULT_TIMEOUT = 2 * 60 * 1000; const DEBUG_TIMEOUT = 10 * 60 * 1000; //timeout in debug mode, allows more interaction with browser after test +const CHROME_VERSION = process.env.CHROME_VERSION; +const CHROME_OPTIONS_ARGS_DEBUG = utils.isMinimumChromeVersion() + ? [ + 'disable-gpu', + 'deny-permission-prompts', + 'ignore-certificate-errors', + 'no-sandbox', + 'window-size=1200,900' + ] + : [ + 'disable-gpu', + 'deny-permission-prompts', + 'ignore-certificate-errors', + 'window-size=1200,900' + ]; +const CHROME_OPTIONS_ARGS = CHROME_OPTIONS_ARGS_DEBUG.concat(['headless']); const baseConfig = { // @@ -81,12 +97,17 @@ const baseConfig = { maxInstances: 1, // browserName: 'chrome', + browserVersion: utils.isMinimumChromeVersion() ? CHROME_VERSION : undefined, acceptInsecureCerts: true, 'goog:chromeOptions': { - args: DEBUG ? ['disable-gpu', 'deny-permission-prompts', 'ignore-certificate-errors']: - ['headless', 'disable-gpu', 'deny-permission-prompts', 'ignore-certificate-errors'] + args: DEBUG ? CHROME_OPTIONS_ARGS_DEBUG : CHROME_OPTIONS_ARGS, + binary: utils.isMinimumChromeVersion() ? '/usr/bin/google-chrome-stable' : undefined + }, + 'wdio:chromedriverOptions': { + binary: utils.isMinimumChromeVersion() + ? '/node_modules/chromedriver/bin/chromedriver' + : undefined } - // 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 @@ -139,7 +160,10 @@ const baseConfig = { // 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: ['devtools'], + services: utils.isMinimumChromeVersion() + ? ['chromedriver'] + : ['devtools'], + // Framework you want to run your specs with. // The following are supported: Mocha, Jasmine, and Cucumber @@ -236,7 +260,9 @@ const baseConfig = { */ before: async function () { global.expect = chai.expect; - await browserLogsUtils.saveBrowserLogs(logLevels, browserLogPath); + if (!utils.isMinimumChromeVersion()) { + await browserLogsUtils.saveBrowserLogs(logLevels, browserLogPath); + } }, /** * Runs before a WebdriverIO command gets executed. diff --git a/tests/page-objects/default/contacts/contacts.wdio.page.js b/tests/page-objects/default/contacts/contacts.wdio.page.js index f2712821add..72b5ed53abc 100644 --- a/tests/page-objects/default/contacts/contacts.wdio.page.js +++ b/tests/page-objects/default/contacts/contacts.wdio.page.js @@ -24,7 +24,7 @@ const newPrimaryContactName = () => $('[name="/data/contact/name"]'); const newPrimaryContactButton = () => $('[name="/data/init/create_new_person"][value="new_person"]'); const dateOfBirthField = () => $('[placeholder="yyyy-mm-dd"]'); const sexField = (type, value) => $(`[data-name="/data/${type}/sex"][value="${value}"]`); -const roleField = (type, role) => $(`span[data-itext-id="/data/${type}/role/${role}:label"].active`); +const roleField = (type, role) => $(`[data-name="/data/${type}/role"][value="${role}"]`); const phoneField = () => $('input.ignore[type="tel"]'); const personName = () => $('[name="/data/person/name"]'); const topContact = () => $('#contacts-list > ul > li:nth-child(1) > a > div.content > div > h4 > span'); @@ -132,7 +132,7 @@ const waitForContactUnloaded = async () => { }; const submitForm = async (waitForLoad = true) => { - await (await genericForm.submitButton()).waitForDisplayed(); + await (await genericForm.submitButton()).waitForClickable(); await (await genericForm.submitButton()).click(); waitForLoad && await waitForContactLoaded(); }; diff --git a/tests/page-objects/default/login/login.wdio.page.js b/tests/page-objects/default/login/login.wdio.page.js index 53075292abe..a8e53717c72 100644 --- a/tests/page-objects/default/login/login.wdio.page.js +++ b/tests/page-objects/default/login/login.wdio.page.js @@ -51,6 +51,7 @@ const cookieLogin = async (options = {}) => { const resp = await utils.request(opts); const cookieArray = utils.parseCookieResponse(resp.headers['set-cookie']); + await browser.url('/'); await browser.setCookies(cookieArray); if (createUser) { await utils.setupUserDoc(username); diff --git a/tests/page-objects/standard/enketo/delivery.wdio.page.js b/tests/page-objects/standard/enketo/delivery.wdio.page.js index 0581a07bc7c..f562f493e01 100644 --- a/tests/page-objects/standard/enketo/delivery.wdio.page.js +++ b/tests/page-objects/standard/enketo/delivery.wdio.page.js @@ -1,7 +1,10 @@ -const OUTCOME = {liveBirth: 'healthy', stillBirth: 'still_birth', miscarriage: 'miscarriage'}; -const LOCATION = {facility: 'f', homeAttendant: 's', homeNoAttendant: 'ns'}; +const utils = require('@utils'); +const enketoCommonPage = require('@page-objects/standard/enketo/enketo.wdio.page.js'); -const FORM = 'form[data-form-id="delivery"]'; +const OUTCOME = { liveBirth: 'healthy', stillBirth: 'still_birth', miscarriage: 'miscarriage' }; +const LOCATION = { facility: 'f', homeAttendant: 's', homeNoAttendant: 'ns' }; + +const FORM = enketoCommonPage.form('delivery'); const pregnancyOutcome = (value) => $(`${FORM} ` + `input[name="/delivery/group_delivery_summary/g_pregnancy_outcome"][value="${value}"`); const pregnancyOutcomeLabel = (value) => $(`${FORM} ` + @@ -9,13 +12,14 @@ const pregnancyOutcomeLabel = (value) => $(`${FORM} ` + const deliveryLocation = (value) => $(`${FORM} ` + `input[name="/delivery/group_delivery_summary/g_delivery_code"][value="${value}"`); const deliveryLocationLabel = (value) => $(`${FORM} ` + - `span[data-itext-id="/delivery/group_delivery_summary/g_delivery_code/${value}:label"]`); + `span[data-itext-id="/delivery/group_delivery_summary/g_delivery_code/${value}:label"]` + + `${enketoCommonPage.ACTIVE_OPTION_LABEL}`); const deliveryDate = () => $(`${FORM} div.widget.date input`); -const smsNote = () => $(`${FORM} textarea[name="/delivery/group_note/g_chw_sms"]`); -const outcomeSummary = () => $(`${FORM} ` + +const smsNote = () => $(`${FORM} ${enketoCommonPage.smsNote('delivery')}`); +const outcomeSummary = () => $(`${FORM} ` + `span[data-value=" /delivery/group_delivery_summary/display_delivery_outcome "]`); const locationSummary = () => $(`${FORM} span[data-value=" /delivery/group_summary/r_delivery_location "]`); -const followUpSMS = () => $(`${FORM} span[data-value=" /delivery/chw_sms "]`); +const followUpSMS = () => $(`${FORM} ${enketoCommonPage.followUpSms('delivery')}`); const selectPregnancyOutcome = async (value = OUTCOME.liveBirth) => { const outcome = await pregnancyOutcome(value); @@ -28,10 +32,13 @@ const selectDeliveryLocation = async (value = LOCATION.facility) => { const location = await deliveryLocation(value); await location.waitForDisplayed(); await location.click(); - return await deliveryLocationLabel(value).getText(); + const locationLabel = utils.isMinimumChromeVersion() + ? await (await deliveryLocationLabel(value)).getAttribute('innerHTML') + : await (await deliveryLocationLabel(value)).getText(); + return locationLabel; }; -const setDeliveryDate = async (value) => { +const setDeliveryDate = async (value) => { const date = await deliveryDate(); await date.waitForDisplayed(); await date.setValue(value); diff --git a/tests/page-objects/standard/enketo/enketo.wdio.page.js b/tests/page-objects/standard/enketo/enketo.wdio.page.js new file mode 100644 index 00000000000..8a4d0b0010e --- /dev/null +++ b/tests/page-objects/standard/enketo/enketo.wdio.page.js @@ -0,0 +1,15 @@ +const form = (formId) => `form[data-form-id="${formId}"]`; +const ACTIVE = '.active'; +const ACTIVE_SPAN = 'span' + ACTIVE; +const ACTIVE_OPTION_LABEL = '.option-label' + ACTIVE; +const smsNote = (formId) => `textarea[name="/${formId}/group_note/g_chw_sms"]`; +const followUpSms = (formId) => `span[data-value=" /${formId}/chw_sms "]`; + +module.exports = { + form, + ACTIVE, + ACTIVE_SPAN, + ACTIVE_OPTION_LABEL, + smsNote, + followUpSms, +}; diff --git a/tests/page-objects/standard/enketo/immunization-visit.wdio.page.js b/tests/page-objects/standard/enketo/immunization-visit.wdio.page.js index 2d612782ea3..25941df9ab7 100644 --- a/tests/page-objects/standard/enketo/immunization-visit.wdio.page.js +++ b/tests/page-objects/standard/enketo/immunization-visit.wdio.page.js @@ -1,3 +1,5 @@ +const enketoCommonPage = require('@page-objects/standard/enketo/enketo.wdio.page.js'); + const BCG_VACCINE = 'input[name="/immunization_visit/group_bcg/g_bcg"]'; const CHOLERA_VACCINE = 'input[name="/immunization_visit/group_cholera/g_cholera"]'; const HEPATITIS_A_VACCINE = 'input[name="/immunization_visit/group_hep_a/g_hep_a"]'; @@ -17,7 +19,7 @@ const TYPHOID_VACCINE = 'input[name="/immunization_visit/group_typhoid/g_typhoid const VITAMIN_A_VACCINE = 'input[name="/immunization_visit/group_vitamin_a/g_vitamin_a"]'; const YELLOW_FEVER_VACCINE = 'input[name="/immunization_visit/group_yellow_fever/g_yellow_fever"]'; -const notes = () => $('textarea[name="/immunization_visit/group_note/g_chw_sms"]'); +const notes = () => $(`${enketoCommonPage.smsNote('immunization_visit')}`); const vaccines = () => $$('input[name="/immunization_visit/group_select_vaccines/g_vaccines"]'); const patientNameSummary = () => $('.current span[data-value=" /immunization_visit/patient_name "]'); // Excluding the 'last-child' because it represents the follow-up message from the summary page form @@ -25,7 +27,7 @@ const vaccinesAvailableSummary = () => $$('label.question.readonly.or-branch.non-select.or-appearance-li:not(:last-child)'); const vaccinesDisableSummary = () => $$('label.question.readonly.or-branch.non-select.or-appearance-li.disabled'); -const followUpSMS = () => $('.current span[data-value=" /immunization_visit/chw_sms "]'); +const followUpSMS = () => $(`.current ${enketoCommonPage.followUpSms('immunization_visit')}`); const selectAppliedVaccines = async (selector, option = 'no') => { const vaccinesSelector = await $$(`${selector}[value*="${option}"]`); diff --git a/tests/page-objects/standard/enketo/pregnancy-visit.wdio.page.js b/tests/page-objects/standard/enketo/pregnancy-visit.wdio.page.js index bd91744229f..38c8b981992 100644 --- a/tests/page-objects/standard/enketo/pregnancy-visit.wdio.page.js +++ b/tests/page-objects/standard/enketo/pregnancy-visit.wdio.page.js @@ -1,11 +1,13 @@ const genericForm = require('@page-objects/default/enketo/generic-form.wdio.page'); const commonPage = require('@page-objects/default/common/common.wdio.page'); +const enketoCommonPage = require('@page-objects/standard/enketo/enketo.wdio.page.js'); -const FORM = 'form[data-form-id="pregnancy_visit"]'; +const FORM = enketoCommonPage.form('pregnancy_visit'); const dangerSig = () => $$(`${FORM} input[name="/pregnancy_visit/group_danger_signs/g_danger_signs"]`); -const smsNote = () => $(`${FORM} textarea[name="/pregnancy_visit/group_note/g_chw_sms"]`); -const dangerSignSummary = () => $$(`${FORM} span[data-itext-id*="/pregnancy_visit/group_review/r_danger_sign"].active`); -const followUpSMS = () => $(`${FORM} span[data-value=" /pregnancy_visit/chw_sms "]`); +const smsNote = () => $(`${FORM} ${enketoCommonPage.smsNote('pregnancy_visit')}`); +const dangerSignSummary = () => $$(`${FORM} span[data-itext-id*="/pregnancy_visit/group_review/r_danger_sign"]` + + `${enketoCommonPage.ACTIVE}`); +const followUpSMS = () => $(`${FORM} ${enketoCommonPage.followUpSms('pregnancy_visit')}`); const selectAllDangerSigns = async () => { const dangerSigns = await dangerSig(); diff --git a/tests/page-objects/standard/enketo/pregnancy.wdio.page.js b/tests/page-objects/standard/enketo/pregnancy.wdio.page.js index 99d99d4378e..3a25bcee515 100644 --- a/tests/page-objects/standard/enketo/pregnancy.wdio.page.js +++ b/tests/page-objects/standard/enketo/pregnancy.wdio.page.js @@ -1,19 +1,22 @@ const genericForm = require('@page-objects/default/enketo/generic-form.wdio.page'); const commonPage = require('@page-objects/default/common/common.wdio.page'); +const enketoCommonPage = require('@page-objects/standard/enketo/enketo.wdio.page.js'); -const APROX_LMP = {up2Months: 61, up3Months: 91, up4Months: 122, b5To6Months: 183, b7To8Months: 244}; +const APROX_LMP = { up2Months: 61, up3Months: 91, up4Months: 122, b5To6Months: 183, b7To8Months: 244 }; -const form = 'form[data-form-id="pregnancy"]'; +const form = enketoCommonPage.form('pregnancy'); const knowLMP = (value) => $(`${form} input[name="/pregnancy/group_lmp/g_lmp_method"][value="${value}"]`); const aproxLMP = (value) => $(`${form} input[name="/pregnancy/group_lmp/g_lmp_approx"][value="${value}"]`); -const getEstDeliveryDate = () => $(`${form} span[data-itext-id="/pregnancy/group_lmp/g_display_edd:label"].active`); +const getEstDeliveryDate = () => $(`${form} span[data-itext-id="/pregnancy/group_lmp/g_display_edd:label"]` + + `${enketoCommonPage.ACTIVE}`); const risksFac = () => $$(`${form} [name="/pregnancy/group_risk_factors"] label:not(:first-child) > [type="checkbox"]`); const dangerSigns = () => $$(`${form} input[name="/pregnancy/group_danger_signs/g_danger_signs"]`); -const smsNote = () => $(`${form} textarea[name="/pregnancy/group_note/g_chw_sms"]`); +const smsNote = () => $(`${form} ${enketoCommonPage.smsNote('pregnancy')}`); const riskFactorsSummary = () => $$(`${form} :not(label.disabled):not(label.or-appearance-yellow) > ` + - `span[data-itext-id*="/pregnancy/group_review/r_risk_factor"].active`); -const dangerSignsSummary = () => $$(`${form} span[data-itext-id*="/pregnancy/group_review/r_danger_sign"].active`); -const followUpSMS = () => $(`${form} [data-value=" /pregnancy/chw_sms "]`); + `span[data-itext-id*="/pregnancy/group_review/r_risk_factor"]${enketoCommonPage.ACTIVE}`); +const dangerSignsSummary = () => $$(`${form} span[data-itext-id*="/pregnancy/group_review/r_danger_sign"]` + + `${enketoCommonPage.ACTIVE}`); +const followUpSMS = () => $(`${form} ${enketoCommonPage.followUpSms('pregnancy')}`); const selectKnowLMP = async (value = 'approx') => { const lmpOption = await knowLMP(value); diff --git a/tests/utils/index.js b/tests/utils/index.js index 5dff3a4b0b6..2eb0fb534df 100644 --- a/tests/utils/index.js +++ b/tests/utils/index.js @@ -53,6 +53,7 @@ const sentinelDb = new PouchDB(`${constants.BASE_URL}/${constants.DB_NAME}-senti const usersDb = new PouchDB(`${constants.BASE_URL}/_users`, { auth }); const logsDb = new PouchDB(`${constants.BASE_URL}/${constants.DB_NAME}-logs`, { auth }); const existingFeedbackDocIds = []; +const MINIMUM_BROWSER_VERSION = '90'; const makeTempDir = (prefix) => fs.mkdtempSync(path.join(path.join(os.tmpdir(), prefix || 'ci-'))); const env = { @@ -458,7 +459,7 @@ const updateCustomSettings = updates => { const waitForSettingsUpdateLogs = (type) => { if (type === 'sentinel') { - return waitForSentinelLogs( /Reminder messages allowed between/); + return waitForSentinelLogs(/Reminder messages allowed between/); } return waitForApiLogs(/Settings updated/); }; @@ -1250,6 +1251,13 @@ const logFeedbackDocs = async (test) => { return true; }; +const isMinimumChromeVersion = () => { + if (process.env.CHROME_VERSION === MINIMUM_BROWSER_VERSION) { + return true; + } + return false; +}; + module.exports = { db, sentinelDb, @@ -1320,4 +1328,5 @@ module.exports = { formDocProcessing, getSentinelDate, logFeedbackDocs, + isMinimumChromeVersion, };