diff --git a/conf/wdio.conf.js b/conf/wdio.conf.js new file mode 100644 index 0000000..b3af8b2 --- /dev/null +++ b/conf/wdio.conf.js @@ -0,0 +1,69 @@ +const browser = (process.argv[5] || 'Chrome'); +// const WdioCaptureIt = require('lambdatest-test-case-analytics').default; +let date = new Date(); + +// convert to IST +let istDate = new Date(date.toLocaleString('en-US', {timeZone: 'Asia/Kolkata'})); + +let year = istDate.getFullYear(); +let month = ('0' + (istDate.getMonth()+1)).slice(-2); // months are zero indexed +let day = ('0' + istDate.getDate()).slice(-2); +let hours = ('0' + istDate.getHours()).slice(-2); +let minutes = ('0' + istDate.getMinutes()).slice(-2); +let seconds = ('0' + istDate.getSeconds()).slice(-2); + +let timestamp = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; + +exports.config = { + services: [ + ['lambdatest-test-case-analytics', {}], + // [WdioCaptureIt, {}], + [ + "lambdatest", + { + tunnel: false, + lambdatestOpts: { + logFile: "tunnel.log" + } + } + ] + ], + user: process.env.LT_USERNAME, + key: process.env.LT_ACCESS_KEY, + buildName: process.env.LT_BUILD_NAME, + specs: ["../tests/specs/ATXtest.js"], + exclude: [], + + capabilities: [ + { + "LT:Options": { + browserName: browser, + version: 116, + name: "TestCase Insights test", + // build: "Test Case Insights ATX n=1, 3 testcases try5", + // build: "Test Case Insights ATX n=2, 6 testcases try11", + build: `TestCase_Insights_build_${timestamp}`, + // build: "Test Case Insights ATX n=20, 60 testcases try2", + visual: true, + tags: ["ATX-testCaseInsights"], + console: true, + network: true, + platformName: process.env.HYPEREXECUTE_PLATFORM || 'windows 10' + // platformName: process.env.HYPEREXECUTE_PLATFORM || 'MacOS Catalina' + } + }], + logLevel: "info", + coloredLogs: true, + screenshotPath: "./errorShots/", + waitforTimeout: 100000, + connectionRetryTimeout: 90000, + connectionRetryCount: 1, + path: "/wd/hub", + hostname: "hub.lambdatest.com", + port: 80, + framework: "mocha", + mochaOpts: { + ui: "bdd", + timeout: 12000000 + } +}; diff --git a/package.json b/package.json new file mode 100644 index 0000000..c8ae08c --- /dev/null +++ b/package.json @@ -0,0 +1,41 @@ +{ + "name": "webdriverio-lambdatest", + "version": "0.1.0", + "readme": "WendriverIO Integration with [LambdaTest](https://www.lambdatest.com)", + "description": "Selenium examples for WebdriverIO and LambdaTest Selenium Grid", + "scripts": { + "test": "npm run single && npm run parallel && npm run multiple", + "single": "./node_modules/.bin/wdio conf/single.conf.js", + "parallel": "./node_modules/.bin/wdio conf/parallel.conf.js", + "multiple": "./node_modules/.bin/wdio conf/multiple.conf.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/lambdatest/webdriverio-selenium-sample.git" + }, + "keywords": [ + "webdriverio", + "lambdatest", + "automation", + "selenium", + "tests" + ], + "bugs": { + "url": "https://github.com/lambdatest/webdriverio-selenium-sample/issues" + }, + "homepage": "https://github.com/lambdatest/webdriverio-selenium-sample#readme", + "dependencies": { + "wdio-lambdatest-test-case-analytics-service": "*", + "chai": "*", + "mocha": "*", + "webdriverio": "*", + "axios":"*" + }, + "devDependencies": { + "@wdio/cli": "*", + "@wdio/local-runner": "*", + "@wdio/mocha-framework": "*", + "@wdio/sync": "*", + "wdio-lambdatest-service": "*" + } +} diff --git a/rename.ps1 b/rename.ps1 new file mode 100644 index 0000000..e142f41 --- /dev/null +++ b/rename.ps1 @@ -0,0 +1 @@ +(Get-Content node_modules\wdio-lambdatest-service\build\constants.js) | Foreach-Object {$_ -replace 'https://api.lambdatest.com/automation/api/', 'https://stage-api.lambdatestinternal.com/automation/api/'} | Set-Content node_modules\wdio-lambdatest-service\build\constants.js \ No newline at end of file diff --git a/replace.sh b/replace.sh new file mode 100644 index 0000000..d7fb0b1 --- /dev/null +++ b/replace.sh @@ -0,0 +1 @@ +sed -i '' 's|https://api.lambdatest.com/automation/api/|https://stage-api.lambdatestinternal.com/automation/api/|g' node_modules/wdio-lambdatest-service/build/constants.js diff --git a/requirements.txt b/requirements.txt index 7ee856b..b22a4c1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,2 @@ -selenium==3.14 -pytest-selenium -flake8 -autopep8 -pytest-order -pytest-html +selenium==4.8.0 +pytz \ No newline at end of file diff --git a/test.txt b/test.txt new file mode 100644 index 0000000..2ea0450 --- /dev/null +++ b/test.txt @@ -0,0 +1,834 @@ +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js +tests/specs/ATXtest.js \ No newline at end of file diff --git a/tests/generateNflakyBuilds.py b/tests/generateNflakyBuilds.py new file mode 100644 index 0000000..444a182 --- /dev/null +++ b/tests/generateNflakyBuilds.py @@ -0,0 +1,386 @@ +import unittest +import json +import random +import time +import os +from os import environ +import logging +import argparse +from datetime import datetime +import pytz +from selenium import webdriver +from selenium.webdriver.common.by import By +from datetime import datetime, timedelta +from selenium.common.exceptions import WebDriverException +from concurrent.futures import ThreadPoolExecutor +from selenium.common.exceptions import TimeoutException +from selenium.webdriver.support import expected_conditions as EC +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.common.action_chains import ActionChains +# Options for different browsers +from selenium.webdriver.chrome.options import Options as ChromeOptions +from selenium.webdriver.firefox.options import Options as FirefoxOptions +from selenium.webdriver.edge.options import Options as EdgeOptions +from selenium.webdriver.safari.options import Options as SafariOptions + +# Set up logging +logging.basicConfig(filename='test_errors.log', level=logging.ERROR, format='%(asctime)s %(levelname)s %(name)s %(message)s') +logger = logging.getLogger(__name__) + +ist = pytz.timezone('Asia/Kolkata') +current_time = datetime.now(ist) + timedelta(minutes=15) +formatted_current_time = current_time.strftime("%Y-%m-%d %H:%M:%S") + +# Parse command line arguments +parser = argparse.ArgumentParser(description='Run selenium tests.') +parser.add_argument('--builds', type=int, default=1, help='The number of builds to run.') +parser.add_argument('--parallel', type=int, default=1, help='The maximum number of worker threads.') +# parser.add_argument('--test_name', type=str, default="Automation_test", help='The base name of the test.') +# parser.add_argument('--build_name', type=str, default="Automation_build", help='The base name of the build.') +parser.add_argument('--test_name', type=str, default=f"HE_Flaky_test_{current_time}", help='The base name of the test.') +parser.add_argument('--build_name', type=str, default=f"HE_Flaky_Build_{current_time}", help='The base name of the build.') +# parser.add_argument('--username', type=str, required=True, help='The username to use for the selenium tests.') +# parser.add_argument('--access_key', type=str, required=True, help='The access key to use for the selenium tests.') +parser.add_argument('--username', type=str, default= os.environ.get("LT_USERNAME") , help='The username to use for the selenium tests.') +parser.add_argument('--access_key', type=str, default = os.environ.get("LT_ACCESS_KEY"), help='The access key to use for the selenium tests.') +parser.add_argument('--env', type=str, default="prod", choices=["stage", "prod"], help='The environment to run the tests in. Default is stage.') +parser.add_argument('--hub_url', type=str, default="hub", help='The hub url to use for the selenium tests.') +parser.add_argument('--command_count', type=int, default=0, help='To increase command count in the test by factor of 8') +parser.add_argument('--error_commands', type=int, default=0, help='To include error commands in the test, maximum value that can be passed is 15') +parser.add_argument('--error_repeat', type=int, default=1, help='To run the chosen error n number of times') +parser.add_argument('--build_tags', type=str, default="", help='Build tags to include in the test. Comma separated.') +parser.add_argument('--test_tags', type=str, default="", help='Test tags to include in the test. Comma separated.') + + +args = parser.parse_args() + +# convert comma-separated strings into lists +args.build_tags = [tag.strip() for tag in args.build_tags.split(',')] if args.build_tags else [] +args.test_tags = [tag.strip() for tag in args.test_tags.split(',')] if args.test_tags else [] + +class FirstSampleTest(unittest.TestCase): + + # with open('caps.json') as json_file: + # CAPS = json.load(json_file) + CAPS = [ + { + "browserName": "Chrome", + "browserVersion": "latest", + "console": "true", + "network": "true", + "selenium_version": "4.8.0", + "platformName": "win10" + }, + { + "browserName": "Firefox", + "browserVersion": "latest", + "console": "true", + "network": "true", + "selenium_version": "4.8.0", + "platformName": "win10" + }, + { + "browserName": "chrome", + "browserVersion": "latest", + "console": "true", + "network": "true", + "selenium_version": "4.8.0", + "platformName": "win10" + }, + { + "browserName": "chrome", + "browserVersion": "latest-1", + "console": "true", + "network": "true", + "selenium_version": "4.8.0", + "platformName": "win10" + }, + { + "browserName": "edge", + "browserVersion": "latest", + "console": "true", + "network": "true", + "selenium_version": "4.8.0", + "platformName": "win10" + }, + { + "browserName": "edge", + "browserVersion": "latest-2", + "console": "true", + "network": "true", + "selenium_version": "4.8.0", + "platformName": "win10" + }, + { + "browserName": "firefox", + "browserVersion": "latest-2", + "console": "true", + "network": "true", + "selenium_version": "4.8.0", + "platformName": "win10" + } + ] + + def run_demo_site_test(self, build_num, test_id, capabilities, command_count, error_commands, error_repeat): + try: + lt_options = { + "username": args.username, + "accessKey": args.access_key, + "network": capabilities.get('network'), + "build": f"{args.build_name}_{build_num}", + "name": f"{args.test_name}_{build_num}", + "console": capabilities.get('console'), + "w3c": True, + "plugin": "python-python", + "platform" : capabilities.get('platformName'), + "buildTags": args.build_tags, + "tags": args.test_tags, + } + + # Construct hub url + base_url = f"{args.hub_url}.lambdatest.com" if args.env == "prod" else f"stage-{args.hub_url}.lambdatestinternal.com" + + # Decide which browser to use based on the browserName in desired capabilities + browserName = capabilities.get('browserName').lower() + if browserName == 'chrome': + options = ChromeOptions() + elif browserName == 'firefox': + options = FirefoxOptions() + elif browserName == 'edge': + options = EdgeOptions() + elif browserName == 'safari': + options = SafariOptions() + else: + raise ValueError('Unsupported browser: ' + browserName) + + options.browser_version = capabilities.get('browserVersion') + # options.platform_name = capabilities.get('platformName') + + options.set_capability('LT:Options', lt_options) + + driver = webdriver.Remote( + command_executor=f"http://{args.username}:{args.access_key}@{base_url}/wd/hub", + options=options) + + driver.set_page_load_timeout(30) + driver.set_window_size(1920, 1080) + + logger.debug(f'Running test {test_id} for build {build_num}') + driver.get("https://stage-lambda-devops-use-only.lambdatestinternal.com/To-do-app/index.html") + + time.sleep(500) + + if command_count>0: + for i in range(command_count): + driver.find_element(By.NAME, "li1").click() + driver.find_element(By.NAME, "li2").click() + + for i in range(command_count): + driver.find_element(By.ID, "sampletodotext").send_keys(f"LambdaTest {i}") + add_button = driver.find_element(By.ID, "addbutton") + add_button.click() + + errorFunctions = [ + lambda: ( driver.get('http://www.google.com'),driver.get('http://www.youtube.com'), driver.get('http://www.google.com'), driver.get('http://www.lambdatest.com'), driver.set_page_load_timeout(1), driver.get('http://www.youtube.com')), + lambda: (driver.get('http://www.google.com'),driver.get('http://www.youtube.com'),driver.set_page_load_timeout(30), driver.get('http://www.google.com'), driver.find_element(By.NAME, 'btnK').click()),#element not interactable + # lambda: (driver.get('http://www.google.com'), driver.find_element(By.NAME, 'noSuchElement').click()), + lambda: (driver.get('http://www.google.com'),driver.get('http://www.youtube.com'), driver.get('http://www.google.com'), driver.get('http://www.lambdatest.com'),ActionChains(driver).move_to_element_with_offset(driver.find_element(By.TAG_NAME, 'body'), 9999999, 9999999).perform()), + # lambda: (driver.get('http://www.google.com'),driver.get('http://www.youtube.com'),driver.set_page_load_timeout(30), driver.get('http://www.google.com'), search_field := driver.find_element(By.CLASS_NAME,'gLFyf'), driver.execute_script("argument[0].value='LambdaTest';", search_field)),#JSError + lambda: (driver.set_page_load_timeout(30), driver.get('http://www.google.com'),driver.find_element(By.CLASS_NAME,'gLFyf').send_keys('LambdaTest'), driver.find_element(By.XPATH,"(//input[@name='btnK'])[2]").click()),#ElementClickIntercepted + lambda: (driver.get('http://www.google.com'),driver.get('http://www.youtube.com'), driver.get('http://www.google.com'), driver.get('http://www.lambdatest.com'), driver.get('http://www.google.com'),driver.find_element(By.CLASS_NAME, 123)),#InvalidSelector + lambda: (driver.get('http://www.google.com'),driver.get('http://www.youtube.com'), driver.get('http://www.google.com'), driver.get('http://www.lambdatest.com'), driver.get('http://www.google.com'),driver.add_cookie({"name" : "cookie_name", "value" : "cookie_value", "domain" : "wrong.domain.com"})),#InvalidCookieDomain + lambda: (driver.get('http://www.google.com'),driver.get('http://www.youtube.com'),driver.set_page_load_timeout(30), driver.get('http://www.google.com'), driver.find_element(By.NAME, 'btnI').clear()),#InvalidElementState + lambda: (driver.get('http://www.google.com'),driver.get('http://www.youtube.com'), driver.get('http://www.google.com'), driver.get('http://www.lambdatest.com'), driver.get('http://www.google.com'),driver.switch_to.alert),#noSuchAlert + lambda: driver.switch_to.window('non_existent_window'),#noSuchWindow + lambda: (driver.get('http://www.google.com'),driver.get('http://www.youtube.com'), driver.get('http://www.google.com'), driver.get('http://www.lambdatest.com'), driver.get('http://www.google.com'),driver.switch_to.frame(1)),#noSuchFrame + # lambda: (driver.get('http://www.google.com'),driver.set_page_load_timeout(30), driver.get('http://www.google.com'), old_page:= driver.find_element(By.NAME, 'q'), driver.refresh(), old_page.click()),#StaleElementReference + lambda: (driver.get('http://www.google.com'),driver.get('http://www.youtube.com'), driver.get('http://www.google.com'),driver.get('http://www.google.com'),driver.set_page_load_timeout(30), driver.get('http://www.google.com'), driver.get_cookie('abd'), driver.add_cookie({"name": "foo", "value": "bar"}), driver.get_cookie('foo') ),#NoSuchCookie + lambda: (driver.get('http://www.google.com'),driver.get('http://www.youtube.com'), driver.get('http://www.google.com'),driver.set_page_load_timeout(30), driver.get('http://www.google.com'), driver.add_cookie({"name" : "", "value" : ""})),#UnabletoSetCookie + lambda: (driver.get('http://www.google.com'),driver.get('http://www.youtube.com'), driver.get('http://www.google.com'),driver.set_page_load_timeout(30), driver.execute_script("alert('Hello from Selenium!');"),driver.get('http://www.google.com')),#UnexpectedAlertOpen + ] + + if error_commands>0: + chosen_error_commands = random.sample(errorFunctions, error_commands) + + for command in chosen_error_commands: + for i in range(error_repeat): + try: + command() + except Exception as e: + logger.error(f"An error occurred: {e}") + + # errorFunctions2 = [ + # # lambda: ( driver.get('http://www.google.com'),driver.get('http://www.youtube.com'), driver.get('http://www.google.com'), driver.get('http://www.lambdatest.com'), driver.set_page_load_timeout(1), driver.get('http://www.youtube.com')), + # # lambda: (driver.get('http://www.google.com'),driver.get('http://www.youtube.com'),driver.set_page_load_timeout(30), driver.get('http://www.google.com'), driver.find_element(By.NAME, 'btnK').click()),#element not interactable + # # lambda: (driver.get('http://www.google.com'), driver.find_element(By.NAME, 'noSuchElement').click()), + # # lambda: (driver.get('http://www.google.com'),driver.get('http://www.youtube.com'), driver.get('http://www.google.com'), driver.get('http://www.lambdatest.com'),ActionChains(driver).move_to_element_with_offset(driver.find_element(By.TAG_NAME, 'body'), 9999999, 9999999).perform()), + # # lambda: (driver.get('http://www.google.com'),driver.get('http://www.youtube.com'),driver.set_page_load_timeout(30), driver.get('http://www.google.com'), search_field := driver.find_element(By.CLASS_NAME,'gLFyf'), driver.execute_script("argument[0].value='LambdaTest';", search_field)),#JSError + # # lambda: (driver.set_page_load_timeout(30), driver.get('http://www.google.com'),driver.find_element(By.CLASS_NAME,'gLFyf').send_keys('LambdaTest'), driver.find_element(By.XPATH,"(//input[@name='btnK'])[2]").click()),#ElementClickIntercepted + # # lambda: (driver.get('http://www.google.com'),driver.get('http://www.youtube.com'), driver.get('http://www.google.com'), driver.get('http://www.lambdatest.com'), driver.get('http://www.google.com'),driver.find_element(By.CLASS_NAME, 123)),#InvalidSelector + # # lambda: (driver.get('http://www.google.com'),driver.get('http://www.youtube.com'), driver.get('http://www.google.com'), driver.get('http://www.lambdatest.com'), driver.get('http://www.google.com'),driver.add_cookie({"name" : "cookie_name", "value" : "cookie_value", "domain" : "wrong.domain.com"})),#InvalidCookieDomain + # # lambda: (driver.get('http://www.google.com'),driver.get('http://www.youtube.com'),driver.set_page_load_timeout(30), driver.get('http://www.google.com'), driver.find_element(By.NAME, 'btnI').clear()),#InvalidElementState + # # lambda: (driver.get('http://www.google.com'),driver.get('http://www.youtube.com'), driver.get('http://www.google.com'), driver.get('http://www.lambdatest.com'), driver.get('http://www.google.com'),driver.switch_to.alert),#noSuchAlert + # lambda: driver.switch_to.window('non_existent_window'),#noSuchWindow + # # lambda: (driver.get('http://www.google.com'),driver.get('http://www.youtube.com'), driver.get('http://www.google.com'), driver.get('http://www.lambdatest.com'), driver.get('http://www.google.com'),driver.switch_to.frame(1)),#noSuchFrame + # # lambda: (driver.get('http://www.google.com'),driver.set_page_load_timeout(30), driver.get('http://www.google.com'), old_page:= driver.find_element(By.NAME, 'q'), driver.refresh(), old_page.click()),#StaleElementReference + # # lambda: (driver.get('http://www.google.com'),driver.get('http://www.youtube.com'), driver.get('http://www.google.com'),driver.get('http://www.google.com'),driver.set_page_load_timeout(30), driver.get('http://www.google.com'), driver.get_cookie('abd'), driver.add_cookie({"name": "foo", "value": "bar"}), driver.get_cookie('foo') ),#NoSuchCookie + # # lambda: (driver.get('http://www.google.com'),driver.get('http://www.youtube.com'), driver.get('http://www.google.com'),driver.set_page_load_timeout(30), driver.get('http://www.google.com'), driver.add_cookie({"name" : "", "value" : ""})),#UnabletoSetCookie + # # lambda: (driver.get('http://www.google.com'),driver.get('http://www.youtube.com'), driver.get('http://www.google.com'),driver.set_page_load_timeout(30), driver.execute_script("alert('Hello from Selenium!');"),driver.get('http://www.google.com')),#UnexpectedAlertOpen + # ] + # for command in errorFunctions2: + # # for i in range(error_repeat): + # try: + # command() + # except Exception as e: + # logger.error(f"An error occurred: {e}") + + driver.get("https://stage-lambda-devops-use-only.lambdatestinternal.com/To-do-app/index.html") + + driver.find_element(By.NAME, "li1").click() + driver.find_element(By.NAME, "li2").click() + logger.debug("Clicked on the second element") + + driver.find_element(By.ID, "sampletodotext").send_keys("LambdaTest") + add_button = driver.find_element(By.ID, "addbutton") + + attempts = 2 + for attempt in range(attempts): + try: + add_button.click() + driver.find_element(By.ID, "addbutton") + logger.info("Added LambdaTest checkbox") + break + except WebDriverException as e: + logger.error(f"Attempt {attempt + 1} failed. Retrying...") + if attempt == attempts - 1: + logger.error(e, exc_info=True) + + search = driver.find_element(By.CSS_SELECTOR, ".container h2") + assert search.is_displayed(), "heading is not displayed" + search.click() + driver.implicitly_wait(3) + + heading = driver.find_element(By.CSS_SELECTOR, ".container h2") + + #New Statuses + + # if heading.is_displayed(): + # heading.click() + # if test_id < 2: + # driver.execute_script("window.alert('Passing command before idle timeout')") + # # driver.execute_script("lambda-status=failed") + # driver.execute_script("lambda-status=skipped") + # logger.info("Test marked as passed.") + # elif 2 <= test_id < 4: + # try: + # driver.find_element(By.ID, "non_existent_element") + # except WebDriverException: + # logger.error("Failing command executed.") + # # driver.execute_script("lambda-status=failed") + # driver.execute_script("lambda-status=unknown") + # logger.info("Test marked as failed.") + # elif 4 <= test_id < 6: + # try: + # driver.find_element(By.ID, "addbutton") + # # driver.find_element(By.ID, "addbutton2") + # # driver.execute_script("lambda-status=failed") + # driver.execute_script("lambda-status=ignored") + # except WebDriverException: + # logger.error("Element not found, moving on to quit the browser.") # This command will fail, making the test flaky + # else: + # driver.implicitly_wait(2) + # try: + # # driver.find_element(By.ID, "addbutton2") + # # driver.execute_script("lambda-status=failed") + # driver.execute_script("lambda-status=error") + # logger.info("Test marked as completed.") + # except WebDriverException: + # logger.error("Element not found, moving on to quit the browser.") + # finally: + # driver.quit() + + #Passed Build + if heading.is_displayed(): + heading.click() + if test_id < 2: + driver.execute_script("window.alert('Passing command before idle timeout')") + # driver.execute_script("lambda-status=failed") + driver.execute_script("lambda-status=passed") + logger.info("Test marked as passed.") + elif 2 <= test_id < 4: + try: + driver.find_element(By.ID, "non_existent_element") + except WebDriverException: + logger.error("Failing command executed.") + # driver.execute_script("lambda-status=failed") + driver.execute_script("lambda-status=passed") + logger.info("Test marked as failed.") + elif 4 <= test_id < 6: + try: + # driver.find_element(By.ID, "addbutton") + # driver.execute_script("lambda-status=failed") + driver.execute_script("lambda-status=passed") + driver.find_element(By.ID, "addbutton2") + except WebDriverException: + logger.error("Element not found, moving on to quit the browser.") # This command will fail, making the test flaky + else: + # driver.implicitly_wait(2) + try: + # driver.find_element(By.ID, "addbutton2") + # driver.execute_script("lambda-status=failed") + driver.execute_script("lambda-status=passed") + driver.find_element(By.ID, "addbutton2") + logger.info("Test marked as completed.") + except WebDriverException: + logger.error("Element not found, moving on to quit the browser.") + finally: + driver.quit() + +# #Old Statuses +# if heading.is_displayed(): +# heading.click() +# if test_id < 2: +# driver.execute_script("window.alert('Passing command before idle timeout')") +# driver.execute_script("lambda-status=passed") +# logger.info("Test marked as passed.") +# elif 2 <= test_id < 4: +# try: +# driver.find_element(By.ID, "non_existent_element") +# except WebDriverException: +# logger.error("Failing command executed.") +# driver.execute_script("lambda-status=failed") +# logger.info("Test marked as failed.") +# elif 4 <= test_id < 6: +# try: +# driver.find_element(By.ID, "addbutton") +# driver.find_element(By.ID, "addbutton2") +# except WebDriverException: +# logger.error("Element not found, moving on to quit the browser.") # This command will fail, making the test flaky +# else: +# driver.implicitly_wait(2) +# try: +# driver.find_element(By.ID, "addbutton2") +# logger.info("Test marked as completed.") +# except WebDriverException: +# logger.error("Element not found, moving on to quit the browser.") +# finally: +# driver.quit() + + def _test_single_build(self, build_num): + for test_id, capabilities in enumerate(self.CAPS): + command_count = args.command_count + error_commands = args.error_commands + error_repeat = args.error_repeat + self.run_demo_site_test(build_num, test_id, capabilities, command_count, error_commands,error_repeat) + + + def test_demo_site(self): + build_count = args.builds # Change this to the number of builds you want to run + parallel_count = args.parallel # Increase this value to increase the number of worker threads + executor = ThreadPoolExecutor(max_workers=parallel_count) + executor.map(self._test_single_build, range(1, build_count + 1)) + executor.shutdown(wait=True) + + +if __name__ == "__main__": + unittest.main(argv=['']) \ No newline at end of file diff --git a/tests/lt_sample_todo.py b/tests/lt_sample_todo.py deleted file mode 100644 index 2b02caf..0000000 --- a/tests/lt_sample_todo.py +++ /dev/null @@ -1,28 +0,0 @@ -import pytest -import sys -from selenium.webdriver.common.action_chains import ActionChains -from selenium.webdriver.common.by import By -from selenium.webdriver.support.ui import WebDriverWait -from selenium.webdriver.support import expected_conditions as EC - -@pytest.mark.usefixtures('driver') -class TestLink: - def test_title(self, driver): - driver.get('https://lambdatest.github.io/sample-todo-app/') - driver.find_element_by_name("li1").click() - driver.find_element_by_name("li2").click() - - title = "Sample page - lambdatest.com" - assert title == driver.title - - - def test_item(self, driver): - driver.get('https://lambdatest.github.io/sample-todo-app/') - sample_text = "Happy Testing at LambdaTest" - email_text_field = driver.find_element_by_id("sampletodotext") - email_text_field.send_keys(sample_text) - - driver.find_element_by_id("addbutton").click() - - li6 = driver.find_element_by_name("li6") - sys.stderr.write('li6') \ No newline at end of file diff --git a/tests/lt_selenium_playground.py b/tests/lt_selenium_playground.py deleted file mode 100644 index 0e59e4e..0000000 --- a/tests/lt_selenium_playground.py +++ /dev/null @@ -1,91 +0,0 @@ -import pytest -from selenium import webdriver -import sys -from selenium.webdriver.chrome.options import Options -from selenium.webdriver.common.keys import Keys -from time import sleep -from selenium.webdriver.common.action_chains import ActionChains -from selenium.webdriver.common.by import By -from selenium.webdriver.support.ui import WebDriverWait -from selenium.webdriver.support import expected_conditions as EC -import os -import time -from selenium.webdriver.support.ui import Select - -@pytest.mark.usefixtures('driver') -class TestLink: - - @pytest.mark.order(1) - def test_input_forms(self, driver): - action = ActionChains(driver) - wait = WebDriverWait(driver, 5) - driver.get('https://www.lambdatest.com/selenium-playground/') - - element = driver.find_element(By.XPATH, "//a[.='Input Form Submit']") - element.click() - - URL = driver.current_url - # Print the current URL, assert if required - print("Current URL" + URL) - - name = driver.find_element(By.XPATH, "//input[@id='name']") - name.send_keys("Testing") - - email_address = driver.find_element(By.XPATH, "//input[@id='inputEmail4']") - email_address.send_keys("testing@testing.com") - - password = driver.find_element(By.XPATH, "//input[@id='inputPassword4']") - password.send_keys("password") - - company = driver.find_element(By.CSS_SELECTOR, "#company") - company.send_keys("LambdaTest") - - website = driver.find_element(By.CSS_SELECTOR, "#websitename") - website.send_keys("https://wwww.lambdatest.com") - - country_dropdown = Select(driver.find_element(By.XPATH, "//select[@name='country']")) - country_dropdown.select_by_visible_text("United States") - - city = driver.find_element(By.XPATH, "//input[@id='inputCity']") - city.send_keys("San Jose") - - address1 = driver.find_element(By.CSS_SELECTOR, "[placeholder='Address 1']") - address1.send_keys("Googleplex, 1600 Amphitheatre Pkwy") - - address2 = driver.find_element(By.CSS_SELECTOR, "[placeholder='Address 2']") - address2.send_keys(" Mountain View, CA 94043") - - state = driver.find_element(By.CSS_SELECTOR, "#inputState") - state.send_keys("California") - - zipcode = driver.find_element(By.CSS_SELECTOR, "#inputZip") - zipcode.send_keys("94088") - - # Click on the Submit button - submit_button = driver.find_element(By.CSS_SELECTOR, ".btn") - submit_button.click() - - # Assert if the page contains a certain text - assert driver.page_source.find("Thanks for contacting us, we will get back to you shortly") - - print("Input Form Demo complete") - - print(driver.find_element(By.TAG_NAME,'title').is_displayed()) - - @pytest.mark.order(2) - def test_progress_bars(self, driver): - action = ActionChains(driver) - # A wait of 5 seconds is added later in case the WebElements are loaded dynamically - wait = WebDriverWait(driver, 5) - - driver.get('https://www.lambdatest.com/selenium-playground/input-form-demo') - - element = driver.find_element(By.XPATH, "//p[contains(.,'Progress Bar & Sliders')]") - element.click() - # wait.until(EC.element_to_be_clickable(element)).click() - - # Click on the Drag & Drop Sliders - drag_drop = driver.find_element(By.XPATH, "//a[.='Drag & Drop Sliders']") - drag_drop.click() - time.sleep(10) - print("Progress Bar Test Complete") diff --git a/tests/specs/ATXtest.js b/tests/specs/ATXtest.js new file mode 100644 index 0000000..89469ee --- /dev/null +++ b/tests/specs/ATXtest.js @@ -0,0 +1,137 @@ +describe('Test Case Insights Test', () => { + const n = 2; // change this to the number of test cases you want + let anyTestFailed = false; + + beforeEach(() => { + browser.setTimeout({ 'implicit': 10000 }); // Set the implicit wait timeout to 10 seconds + }); + + afterEach(function() { + if (this.currentTest.state === 'failed') { + anyTestFailed = true; + } + }); + + after(async function() { + if (anyTestFailed) { + await browser.execute('lambda-status=failed'); + } else { + await browser.execute('lambda-status=passed'); + } + }); + function delay(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); + } + + for (let i = 1; i <= n; i++) { + let date = new Date(); + let timestamp = `${date.getHours()}:${date.getMinutes()}:${date.getDate()} ${date.getSeconds()}:${date.getMonth() + 1}:${date.getFullYear()}`; + + // it(`should login to LambdaTest #testCase${i}_${timestamp}`, async () => { + it(`should login to LambdaTest #testCase`, async () => { + await browser.url('https://stage-accounts.lambdatestinternal.com/login'); + const emailField = await $('#email'); + await emailField.setValue('18_apr@ltqa.lambdatestautomation.com'); + // await emailField.setValue('19_apr@ltqa.lambdatestautomation.com'); + // await emailField.setValue('24_apr@ltqa.lambdatestautomation.com'); + // await emailField.setValue('27_mar@ltqa.lambdatestautomation.com'); + // await emailField.setValue('28_apr@ltqa.lambdatestautomation.com'); + await delay(2000); + // await emailField.setValue('abc@xyz.com'); + // await passwordField.setValue('123'); + const passwordField = await $('#password'); + await passwordField.setValue('12345678'); + await delay(2000); + const loginButton = await $('#login-button'); + await loginButton.click(); + await delay(2000); + await browser.url('https://stage-accounts.lambdatestinternal.com/dashboard'); + const insightLink = await $("[class*='item__insights']"); + await insightLink.click(); + await delay(2000); + }); + + // it(`should perform search and open first dashboard #testCase${i}_${timestamp}`, async () => { + it(`should perform search and open first dashboard #testCase`, async () => { + const searchField = await $('#search'); + await searchField.setValue('Sanity'); + await delay(3000); + const textData = await $("[class*='divide-y divide-gray-200']>:nth-child(1)"); + await delay(2000); + await textData.click(); + await delay(2000); + }); + + it(`should logout from LT and open youtube #testCase`, async () => { + // await browser.execute('window.scrollTo(0,document.body.scrollHeight)'); + await delay(2000); + const accountButton = await $('#profile__dropdown__parent'); + await accountButton.click(); + const logout = await $('#app__logout'); + await logout.click(); + await delay(2000); + await browser.url('https://www.youtube.com/'); + // await browser.execute(`smartui.takeFullPageScreenshot,{"screenshotName":"LT-ATX","smartScroll":false}`); + }); + + it(`Todo Test #testCase`, async () => { + await browser.url("https://lambdatest.github.io/sample-todo-app/"); + + // Click on the first 5 items + for(let i=1; i<=5; i++) { + const item = $(`[class="list-unstyled"]>:nth-child(${i})>input`); + await item.click(); + + } + + // Add n number of items and click on them + const n = 5; // The number of items you want to add + for(let i=1; i<=n; i++) { + const addvalue = $('#sampletodotext'); + await addvalue.setValue(`Item ${i+5}`); // Added to existing 5 items + const addButton = $('#addbutton'); + await addButton.click(); + + // Click on the added item + const newItem = $(`[class="list-unstyled"]>:nth-child(${i+5})>input`); + await newItem.click(); + } + }); + + + it(`Google Search #testCase`, async () => { + await browser.url("https://www.google.com"); + const searchBox = $('[class="gLFyf"]'); + await searchBox.click(); + await searchBox.setValue('Lambdatest'); + await browser.keys("\uE007"); // "\uE007" is the Unicode value for the "Enter" key + }); + + + it(`Demo steps #testCase`, async () => { + await browser.url('https://www.lambdatest.com/automation-demos/'); + + const username = $('#username'); + await username.setValue('lambda'); + const password = $('#password'); + await password.setValue('lambda123'); + await browser.keys("\uE007"); // "\uE007" is the Unicode value for the "Enter" key + await delay(2000); + const displayPage = $('#developer-name'); + // await displayPage.isDisplayed(); + await displayPage.setValue('demo@lambdatest.com'); + const random = $('[class="radio-button pb-20"]>:nth-child(5)'); + await random.click(); + const other = $('#others'); + await other.click(); + const checkbox = $('#tried-ecom'); + await checkbox.click(); + const textArea = $('#comments'); + await textArea.setValue('Hi This is LambdaTest automation Demo'); + const submit= $('[id="submit-button"]'); + await submit.click(); + }); + + + } +}); diff --git a/tests/v3.py b/tests/v3.py new file mode 100644 index 0000000..a772abe --- /dev/null +++ b/tests/v3.py @@ -0,0 +1,279 @@ +import unittest +import json +import random +import logging +import os +import time +from os import environ +import argparse +import pytz +from datetime import datetime, timedelta +from selenium import webdriver +from selenium.webdriver.common.by import By +from selenium.common.exceptions import WebDriverException +from concurrent.futures import ThreadPoolExecutor +import concurrent.futures +from selenium.common.exceptions import TimeoutException +from selenium.webdriver.support import expected_conditions as EC +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.common.action_chains import ActionChains +# Options for different browsers +from selenium.webdriver.chrome.options import Options as ChromeOptions +from selenium.webdriver.firefox.options import Options as FirefoxOptions +from selenium.webdriver.edge.options import Options as EdgeOptions +from selenium.webdriver.safari.options import Options as SafariOptions + +# Set up logging +logging.basicConfig(filename='test_errors.log', level=logging.ERROR, format='%(asctime)s %(levelname)s %(name)s %(message)s') +logger = logging.getLogger(__name__) + +# Add a StreamHandler to print to console +console_handler = logging.StreamHandler() +console_handler.setLevel(logging.ERROR) +formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') +console_handler.setFormatter(formatter) +logger.addHandler(console_handler) + +# Assuming 'ist' is a timezone object you have defined or imported +ist = pytz.timezone('Asia/Kolkata') +current_time = datetime.now(ist) + timedelta(minutes=15) +formatted_current_time = current_time.strftime("%Y-%m-%d %H:%M:%S") + +# Parse command line arguments +parser = argparse.ArgumentParser(description='Run selenium tests.') +parser.add_argument('--builds', type=int, default=1, help='The number of builds to run.') +parser.add_argument('--parallel', type=int, default=1, help='The maximum number of worker threads.') +parser.add_argument('--test_name', type=str, default=f"atxHYE_flakyTest_{formatted_current_time}", help='The base name of the test.') +parser.add_argument('--build_name', type=str, default=f"atxHYE_flakyBuild_{formatted_current_time}", help='The base name of the build.') +parser.add_argument('--username', type=str, default= os.environ.get("LT_USERNAME") , help='The username to use for the selenium tests.') +parser.add_argument('--access_key', type=str, default = os.environ.get("LT_ACCESS_KEY"), help='The access key to use for the selenium tests.') +parser.add_argument('--env', type=str, default="prod", choices=["stage", "prod"], help='The environment to run the tests in. Default is stage.') +parser.add_argument('--hub_url', type=str, default="hub", help='The hub url to use for the selenium tests.') + +parser.add_argument('--command_count', type=int, default=0, help='To increase command count in the test by factor of 8') +parser.add_argument('--error_commands', type=int, default=0, help='To include error commands in the test, maximum value that can be passed is 15') +parser.add_argument('--error_repeat', type=int, default=1, help='To run the chosen error n number of times') +parser.add_argument('--build_tags', type=str, default="", help='Build tags to include in the test. Comma separated.') +parser.add_argument('--test_tags', type=str, default="", help='Test tags to include in the test. Comma separated.') +parser.add_argument('--caps_json', type=str, default='capsV3.json', help='Path to the caps json file.') +parser.add_argument('--project', type=str, default='ATXproject', help='The project name for the selenium tests.') + + +args = parser.parse_args() + +# convert comma-separated strings into lists +args.username = [user.strip() for user in args.username.split(',')] +args.access_key = [key.strip() for key in args.access_key.split(',')] +args.build_tags = [tag.strip() for tag in args.build_tags.split(',')] if args.build_tags else [] +args.test_tags = [tag.strip() for tag in args.test_tags.split(',')] if args.test_tags else [] + +class FirstSampleTest(unittest.TestCase): + + # with open('capsV3.json') as json_file: + # CAPS = json.load(json_file) + with open(args.caps_json) as json_file: + CAPS = json.load(json_file) + + + + def run_demo_site_test(self, build_num, test_id, capabilities, command_count, error_commands, error_repeat, username, access_key): + try: + lt_options = { + # "username": args.username, + # "accessKey": args.access_key, + "username": username, + "accessKey": access_key, + "network": capabilities.get('network'), + "build": f"{args.build_name}_{build_num}", + "name": f"{args.test_name}",#_{build_num}", + "console": capabilities.get('console'), + "w3c": True, + "plugin": "python-python", + "platform" : capabilities.get('platformName'), + "buildTags": args.build_tags, + "tags": args.test_tags, + "resolution": capabilities.get('resolution'), + "project": args.project + } + + # Construct hub url + base_url = f"{args.hub_url}.lambdatest.com" if args.env == "prod" else f"stage-{args.hub_url}.lambdatestinternal.com" + + # Decide which browser to use based on the browserName in desired capabilities + browserName = capabilities.get('browserName').lower() + if browserName == 'chrome': + options = ChromeOptions() + elif browserName == 'firefox': + options = FirefoxOptions() + elif browserName == 'edge': + options = EdgeOptions() + elif browserName == 'safari': + options = SafariOptions() + else: + raise ValueError('Unsupported browser: ' + browserName) + + options.browser_version = capabilities.get('browserVersion') + # options.platform_name = capabilities.get('platformName') + + options.set_capability('LT:Options', lt_options) + # print(f'"http://{username}:{access_key}@{base_url}/wd/hub') + driver = webdriver.Remote( + command_executor=f"http://{username}:{access_key}@{base_url}/wd/hub", + options=options) + + driver.set_page_load_timeout(30) + driver.set_window_size(1920, 1080) + + logger.debug(f'Running test {test_id} for build {build_num}') + driver.get("https://stage-lambda-devops-use-only.lambdatestinternal.com/To-do-app/index.html") + + if command_count>0: + for i in range(command_count): + driver.find_element(By.NAME, "li1").click() + driver.find_element(By.NAME, "li2").click() + + for i in range(command_count): + driver.find_element(By.ID, "sampletodotext").send_keys(f"LambdaTest {i}") + add_button = driver.find_element(By.ID, "addbutton") + add_button.click() + + errorFunctions = [ + lambda: ( driver.get('http://www.google.com'),driver.get('http://www.youtube.com'), driver.get('http://www.google.com'), driver.get('http://www.lambdatest.com'), driver.set_page_load_timeout(1), driver.get('http://www.youtube.com')), + lambda: (driver.get('http://www.google.com'),driver.get('http://www.youtube.com'),driver.set_page_load_timeout(30), driver.get('http://www.google.com'), driver.find_element(By.NAME, 'btnK').click()),#element not interactable + # lambda: (driver.get('http://www.google.com'), driver.find_element(By.NAME, 'noSuchElement').click()), + lambda: (driver.get('http://www.google.com'),driver.get('http://www.youtube.com'), driver.get('http://www.google.com'), driver.get('http://www.lambdatest.com'),ActionChains(driver).move_to_element_with_offset(driver.find_element(By.TAG_NAME, 'body'), 9999999, 9999999).perform()), + # lambda: (driver.get('http://www.google.com'),driver.get('http://www.youtube.com'),driver.set_page_load_timeout(30), driver.get('http://www.google.com'), search_field := driver.find_element(By.CLASS_NAME,'gLFyf'), driver.execute_script("argument[0].value='LambdaTest';", search_field)),#JSError + lambda: (driver.set_page_load_timeout(30), driver.get('http://www.google.com'),driver.find_element(By.CLASS_NAME,'gLFyf').send_keys('LambdaTest'), driver.find_element(By.XPATH,"(//input[@name='btnK'])[2]").click()),#ElementClickIntercepted + lambda: (driver.get('http://www.google.com'),driver.get('http://www.youtube.com'), driver.get('http://www.google.com'), driver.get('http://www.lambdatest.com'), driver.get('http://www.google.com'),driver.find_element(By.CLASS_NAME, 123)),#InvalidSelector + lambda: (driver.get('http://www.google.com'),driver.get('http://www.youtube.com'), driver.get('http://www.google.com'), driver.get('http://www.lambdatest.com'), driver.get('http://www.google.com'),driver.add_cookie({"name" : "cookie_name", "value" : "cookie_value", "domain" : "wrong.domain.com"})),#InvalidCookieDomain + lambda: (driver.get('http://www.google.com'),driver.get('http://www.youtube.com'),driver.set_page_load_timeout(30), driver.get('http://www.google.com'), driver.find_element(By.NAME, 'btnI').clear()),#InvalidElementState + lambda: (driver.get('http://www.google.com'),driver.get('http://www.youtube.com'), driver.get('http://www.google.com'), driver.get('http://www.lambdatest.com'), driver.get('http://www.google.com'),driver.switch_to.alert),#noSuchAlert + lambda: driver.switch_to.window('non_existent_window'),#noSuchWindow + lambda: (driver.get('http://www.google.com'),driver.get('http://www.youtube.com'), driver.get('http://www.google.com'), driver.get('http://www.lambdatest.com'), driver.get('http://www.google.com'),driver.switch_to.frame(1)),#noSuchFrame + # lambda: (driver.get('http://www.google.com'),driver.set_page_load_timeout(30), driver.get('http://www.google.com'), old_page:= driver.find_element(By.NAME, 'q'), driver.refresh(), old_page.click()),#StaleElementReference + lambda: (driver.get('http://www.google.com'),driver.get('http://www.youtube.com'), driver.get('http://www.google.com'),driver.get('http://www.google.com'),driver.set_page_load_timeout(30), driver.get('http://www.google.com'), driver.get_cookie('abd'), driver.add_cookie({"name": "foo", "value": "bar"}), driver.get_cookie('foo') ),#NoSuchCookie + lambda: (driver.get('http://www.google.com'),driver.get('http://www.youtube.com'), driver.get('http://www.google.com'),driver.set_page_load_timeout(30), driver.get('http://www.google.com'), driver.add_cookie({"name" : "", "value" : ""})),#UnabletoSetCookie + lambda: (driver.get('http://www.google.com'),driver.get('http://www.youtube.com'), driver.get('http://www.google.com'),driver.set_page_load_timeout(30), driver.execute_script("alert('Hello from Selenium!');"),driver.get('http://www.google.com')),#UnexpectedAlertOpen + ] + + if error_commands>0: + chosen_error_commands = random.sample(errorFunctions, error_commands) + + for command in chosen_error_commands: + for i in range(error_repeat): + try: + driver.get('http://www.google.com') + driver.get('http://www.youtube.com') + command() + except Exception as e: + logger.error(f"An error occurred: {e}") + + driver.get("https://stage-lambda-devops-use-only.lambdatestinternal.com/To-do-app/index.html") + + driver.find_element(By.NAME, "li1").click() + driver.find_element(By.NAME, "li2").click() + logger.debug("Clicked on the second element") + + driver.find_element(By.ID, "sampletodotext").send_keys("LambdaTest") + add_button = driver.find_element(By.ID, "addbutton") + + attempts = 2 + for attempt in range(attempts): + try: + add_button.click() + driver.find_element(By.ID, "addbutton") + logger.info("Added LambdaTest checkbox") + break + except WebDriverException as e: + logger.error(f"Attempt {attempt + 1} failed. Retrying...") + if attempt == attempts - 1: + logger.error(e, exc_info=True) + + search = driver.find_element(By.CSS_SELECTOR, ".container h2") + assert search.is_displayed(), "heading is not displayed" + search.click() + driver.implicitly_wait(3) + + heading = driver.find_element(By.CSS_SELECTOR, ".container h2") + + # Passed Build + if heading.is_displayed(): + heading.click() + if test_id <2: + # driver.execute_script("window.alert('Passing command before idle timeout')") + driver.find_element(By.ID, "addbutton") + driver.execute_script("lambda-status=passed") + # driver.execute_script("lambda-status=passed") + logger.info("Test marked as passed.") + elif 2 <= test_id < 4: + try: + driver.find_element(By.ID, "non_existent_element") + except WebDriverException: + logger.error("Failing command executed.") + driver.execute_script("lambda-status=failed") + # driver.execute_script("lambda-status=passed") + logger.info("Test marked as failed.") + elif 4 <= test_id < 6: + try: + driver.find_element(By.ID, "addbutton") + # driver.execute_script("lambda-status=failed") + driver.execute_script("lambda-status=passed") + # driver.find_element(By.ID, "addbutton2") + except WebDriverException: + logger.error("Element not found, moving on to quit the browser.") # This command will fail, making the test flaky + elif 6 <= test_id < 8: + try: + driver.find_element(By.ID, "addbutton2") + # driver.execute_script("lambda-status=passed") + # driver.find_element(By.ID, "addbutton2") + except WebDriverException: + logger.error("Element not found, moving on to quit the browser.") # This command will fail, making the test flaky + driver.execute_script("lambda-status=failed") + elif 8 <= test_id < 10: + try: + driver.find_element(By.ID, "addbutton") + # driver.execute_script("lambda-status=failed") + driver.execute_script("lambda-status=passed") + # driver.find_element(By.ID, "addbutton2") + except WebDriverException: + logger.error("Element not found, moving on to quit the browser.") # This command will fail, making the test flaky + elif 10 <= test_id < 12: + try: + driver.find_element(By.ID, "addbutton2") + # driver.execute_script("lambda-status=passed") + # driver.find_element(By.ID, "addbutton2") + except WebDriverException: + logger.error("Element not found, moving on to quit the browser.") # This command will fail, making the test flaky + driver.execute_script("lambda-status=failed") + + else: + # driver.implicitly_wait(2) + try: + driver.find_element(By.ID, "addbutton") + # driver.execute_script("lambda-status=failed") + driver.execute_script("lambda-status=passed") + # driver.find_element(By.ID, "addbutton2") + logger.info("Test marked as completed.") + except WebDriverException: + logger.error("Element not found, moving on to quit the browser.") + finally: + driver.quit() + + + def _test_single_build(self, build_num, username, access_key): + command_count = args.command_count + error_commands = args.error_commands + error_repeat = args.error_repeat + for test_id, capabilities in enumerate(self.CAPS): + self.run_demo_site_test(build_num, test_id, capabilities, command_count, error_commands, error_repeat, username, access_key) + + def test_demo_site(self): + build_count = args.builds # Change this to the number of builds you want to run + with concurrent.futures.ThreadPoolExecutor(max_workers=len(args.username)) as executor: + for username, access_key in zip(args.username, args.access_key): + for build_num in range(1, build_count + 1): + executor.submit(self._test_single_build, build_num, username, access_key) + + +if __name__ == "__main__": + unittest.main(argv=['']) \ No newline at end of file diff --git a/yaml/win/atxTest.yaml b/yaml/win/atxTest.yaml new file mode 100644 index 0000000..096bd52 --- /dev/null +++ b/yaml/win/atxTest.yaml @@ -0,0 +1,29 @@ +--- +version: 0.1 +globalTimeout: 90 +testSuiteTimeout: 90 +testSuiteStep: 90 + +runson: win + +autosplit: true +retryOnFailure: true + +maxRetries: 1 +concurrency: 1 + +mergeArtifacts: true +jobLabel: [ '${DATE} - ${DAY}', 'HE-ATX-ALL'] + +cacheKey: '{{ checksum "requirements.txt" }}' +cacheDirectories: + - CacheDir +pre: + - pip3 install -r requirements.txt --cache-dir CacheDir + +testDiscovery: + type: raw + mode: dynamic + command: grep -nri 'class' tests -ir --include='v*.py' | sed 's/:.*//' | uniq + +testRunnerCommand: python3 $test --caps_json 'tests/capsV3.json' \ No newline at end of file diff --git a/yaml/win/pytest_hyperexecute_autosplit_sample.yaml b/yaml/win/pytest_hyperexecute_autosplit_sample.yaml index b9628f3..aec2a1a 100644 --- a/yaml/win/pytest_hyperexecute_autosplit_sample.yaml +++ b/yaml/win/pytest_hyperexecute_autosplit_sample.yaml @@ -10,30 +10,20 @@ autosplit: true retryOnFailure: true maxRetries: 1 -concurrency: 2 +concurrency: 1 mergeArtifacts: true - -env: -# PAT: ${{ .secrets.testKey }} - TARGET_OS: Windows 10 +jobLabel: [ '${DATE} - ${DAY}', 'HE-ATX'] cacheKey: '{{ checksum "requirements.txt" }}' cacheDirectories: - CacheDir pre: - pip3 install -r requirements.txt --cache-dir CacheDir -post: - - cat yaml/win/pytest_hyperexecute_autosplit_sample.yaml - -uploadArtefacts: - - name: TestReports - path: - - reports/** testDiscovery: type: raw mode: dynamic - command: grep -nri 'class' tests -ir --include=\*.py | sed 's/:.*//' + command: grep -nri 'class' tests -ir --include=\*.py | sed 's/:.*//' | uniq -testRunnerCommand: pytest -s --verbose --html=reports/report.html $test +testRunnerCommand: python3 $test \ No newline at end of file diff --git a/yaml/win/stage_testCaseInsights.yaml b/yaml/win/stage_testCaseInsights.yaml new file mode 100644 index 0000000..6e78c56 --- /dev/null +++ b/yaml/win/stage_testCaseInsights.yaml @@ -0,0 +1,38 @@ +version: 0.1 +globalTimeout: 90 +testSuiteTimeout: 90 +testSuiteStep: 90 +# runson: mac +runson: win + +autosplit: true +concurrency: 1 +tunnel: false +cacheKey: '{{ checksum "package.json" }}' +cacheDirectories: + - node_modules +jobLabel: [ '${DATE}','ATX-testCaseInsights','stage'] +runtime: + language: node + version: "18" +preDirectives: + shell: powershell + # shell: bash + commands: + - npm install + - cat node_modules\wdio-lambdatest-service\build\constants.js + - ls + - powershell ./rename.ps1 + - cat node_modules\wdio-lambdatest-service\build\constants.js + # - cat node_modules/wdio-lambdatest-service/build/constants.js + # - ls + # - chmod +x replace.sh + # - ./replace.sh + # - cat node_modules/wdio-lambdatest-service/build/constants.js +testDiscovery: + type: raw + mode: dynamic + command: grep -lr 'describe' tests/specs/ATXtest.js + # command: cat test.txt +testRunnerCommand: npx wdio conf\wdio.conf.js --spec ..\tests\specs\ATXtest.js +# testRunnerCommand: npx wdio conf/wdio.conf.js --spec tests/specs/ATXtest.js \ No newline at end of file diff --git a/yaml/win/stage_testCaseInsights_mac.yaml b/yaml/win/stage_testCaseInsights_mac.yaml new file mode 100644 index 0000000..a9f2c00 --- /dev/null +++ b/yaml/win/stage_testCaseInsights_mac.yaml @@ -0,0 +1,38 @@ +version: 0.1 +globalTimeout: 90 +testSuiteTimeout: 90 +testSuiteStep: 90 +runson: mac +# runson: win + +autosplit: true +concurrency: 1 +tunnel: false +cacheKey: '{{ checksum "package.json" }}' +cacheDirectories: + - node_modules +jobLabel: [ '${DATE}','ATX-testCaseInsights'] +runtime: + language: node + version: "18" +preDirectives: + shell: powershell + # shell: bash + commands: + - npm install + # - cat node_modules\wdio-lambdatest-service\build\constants.js + # - ls + # - powershell ./rename.ps1 + # - cat node_modules\wdio-lambdatest-service\build\constants.js + - cat node_modules/wdio-lambdatest-service/build/constants.js + - ls + - chmod +x replace.sh + - ./replace.sh + - cat node_modules/wdio-lambdatest-service/build/constants.js +testDiscovery: + type: raw + mode: dynamic + command: grep -lr 'describe' tests/specs/ATXtest.js + # command: cat test.txt +# testRunnerCommand: npx wdio conf\wdio.conf.js --spec tests\specs\ATXtest.js +testRunnerCommand: npx wdio conf/wdio.conf.js --spec tests/specs/ATXtest.js \ No newline at end of file diff --git a/yaml/win/testCaseInsights.yaml b/yaml/win/testCaseInsights.yaml new file mode 100644 index 0000000..dd145b3 --- /dev/null +++ b/yaml/win/testCaseInsights.yaml @@ -0,0 +1,30 @@ +version: 0.1 +globalTimeout: 90 +testSuiteTimeout: 90 +testSuiteStep: 90 +# runson: mac +# debug: true +runson: win + +autosplit: true +concurrency: 1 +tunnel: false +cacheKey: '{{ checksum "package.json" }}' +cacheDirectories: + - node_modules +jobLabel: [ '${DATE}','ATX-testCaseInsights'] +runtime: + language: node + version: "18" +preDirectives: + shell: powershell + commands: + - npm install + - cat node_modules\wdio-lambdatest-service\build\constants.js +testDiscovery: + type: raw + mode: dynamic + command: grep -lr 'describe' tests/specs/ATXtest.js + # command: cat test.txt +testRunnerCommand: npx wdio conf\wdio.conf.js --spec tests\specs\ATXtest.js +# testRunnerCommand: npx wdio conf/wdio.conf.js --spec tests/specs/ATXtest.js \ No newline at end of file