From 6be3157ec787c1dfe13cb8af669a72bccc94cc91 Mon Sep 17 00:00:00 2001 From: Abizer Singaporewala Date: Wed, 20 Jul 2022 12:35:10 +0530 Subject: [PATCH 01/13] Initial commit --- .gitignore | 9 ++++++ README.md | 52 +++++++++++++++++++++++++++++-- config/KeywordsFile.robot | 56 ++++++++++++++++++++++++++++++++++ config/LocalCaps.robot | 2 ++ config/ParallelCaps.robot | 4 +++ config/SingleCaps.robot | 2 ++ config/manage-local-testing.py | 19 ++++++++++++ config/mark-test-status.py | 9 ++++++ requirements.txt | 5 +++ tests/LocalTest.robot | 14 +++++++++ tests/SingleTest.robot | 17 +++++++++++ tests/parallel/Suite01.robot | 20 ++++++++++++ tests/parallel/Suite02.robot | 20 ++++++++++++ tests/parallel/Suite03.robot | 20 ++++++++++++ tests/testcases.robot | 25 +++++++++++++++ 15 files changed, 272 insertions(+), 2 deletions(-) create mode 100644 .gitignore create mode 100644 config/KeywordsFile.robot create mode 100644 config/LocalCaps.robot create mode 100644 config/ParallelCaps.robot create mode 100644 config/SingleCaps.robot create mode 100644 config/manage-local-testing.py create mode 100644 config/mark-test-status.py create mode 100644 requirements.txt create mode 100644 tests/LocalTest.robot create mode 100644 tests/SingleTest.robot create mode 100644 tests/parallel/Suite01.robot create mode 100644 tests/parallel/Suite02.robot create mode 100644 tests/parallel/Suite03.robot create mode 100644 tests/testcases.robot diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2927d7a --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +__pycache__/ +report.html +output.xml +*.log +log.html +pabot_results/ +.pabotsuitenames +.DS_Store +*.png \ No newline at end of file diff --git a/README.md b/README.md index 4206cd2..1bcfd61 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,50 @@ -# robot-browserstack -Code samples for robot tests on browserstack +# BrowserStack Integration with Robot Framework Selenium (Python) + +![BrowserStack Logo](https://d98b8t1nnulk5.cloudfront.net/production/images/layout/logo-header.png?1469004780) + +## Setup +* Clone the repo +* Install dependencies `pip install -r requirements.txt` + +## Set BrowserStack Credentials +* Export the BrowserStack username and access key as environment variables + +#### For Linux/MacOS + ``` + export BROWSERSTACK_USERNAME= + export BROWSERSTACK_ACCESS_KEY= + ``` +#### For Windows + ``` + setx BROWSERSTACK_USERNAME= + setx BROWSERSTACK_ACCESS_KEY= + ``` + +## Running tests + +* To run single test, run `robot tests/SingleTest.robot` +* To run local test, run `robot tests/LocalTest.robot` +* To run parallel tests we will be using the [Pabot](https://pabot.org/) library: + 1. To run test suites in parallel (Testcases within respective test suites will be sequential) + * Run - `pabot --processes tests/parallel/*.robot` + * Alternate method: `pabot --processes ` +
Eg: `pabot --processes 2 tests/parallel/Suite01.robot tests/parallel/Suite02.robot` + 2. To run all test cases within a test suite in parallel + * Run - `pabot --testlevelsplit ` +
Eg: `pabot --testlevelsplit tests/parallel/Suite01.robot` + 3. Run all testcases across all Test Suites in parallel + * Run - `pabot --testlevelsplit --processes tests/parallel/*.robot` +
**Note: If the process count exceeds the parallel threads available on BrowserStack, the sessions will automatically get queued.** + +Understand how many parallel sessions you need by using our [Parallel Test Calculator](https://www.browserstack.com/automate/parallel-calculator?ref=github) + +## Notes +* This repository only works for Selenium 3 as of now. Desired Capabilities do not get honoured for Selenium 4. The open issue on SeleniumLibrary can be found [here](https://github.com/robotframework/SeleniumLibrary/issues/1774). +* You can view your test results on the [BrowserStack Automate dashboard](https://www.browserstack.com/automate) +* To test on a different set of browsers, check out our [platform configurator](https://www.browserstack.com/automate/capabilities) + +## Additional Resources +* [Documentation for writing Automate test scripts in Python](https://www.browserstack.com/automate/python) +* [Customizing your tests on BrowserStack](https://www.browserstack.com/automate/capabilities) +* [Browsers & mobile devices for selenium testing on BrowserStack](https://www.browserstack.com/list-of-browsers-and-platforms?product=automate) +* [Using REST API to access information about your tests via the command-line interface](https://www.browserstack.com/automate/rest-api) diff --git a/config/KeywordsFile.robot b/config/KeywordsFile.robot new file mode 100644 index 0000000..ff3232a --- /dev/null +++ b/config/KeywordsFile.robot @@ -0,0 +1,56 @@ +*** Settings *** +Library SeleniumLibrary +Library mark-test-status.py +Library manage-local-testing.py + +*** Variables *** +${USERNAME}= %{BROWSERSTACK_USERNAME} +${ACCESSKEY}= %{BROWSERSTACK_ACCESS_KEY} +${REMOTE_URL}= https://${USERNAME}:${ACCESSKEY}@hub-cloud.browserstack.com/wd/hub + +*** Keywords *** +Open Session + [Arguments] ${capabilities} ${website_url} + open browser remote_url=${REMOTE_URL} desired_capabilities=${capabilities} url=${website_url} + +Close Session + close browser + +Add Implicit Wait + set selenium implicit wait 5 + +Mark Test Status + [Arguments] ${status} ${reason} + TEST STATUS ${status} ${reason} + +Setup for local test + START LOCAL + Open Session ${LOCAL_CAPS} ${WEBSITE_URL} + +Teardown for local test + Close Session + STOP LOCAL + +Click on Sign In + click element id=signin + +Enter Credentials + [Arguments] ${username} ${password} + input text css=#username input ${username} \n + input text css=#password input ${password} \n + +Click on Login + click element id=login-btn + +Verify username + [Arguments] ${assert_username} + ${retrived_username}= get text css=.username + run keyword if "${retrived_username}" == "${assert_username}" mark test status passed Username validated! + run keyword if "${retrived_username}" != "${assert_username}" mark test status failed Username validation failed! + element should contain css=.username ${assert_username} + +Verify site content + ${site_content}= get text css=body + run keyword if "${site_content}" == "Up and running" mark test status passed Site Content validated! + run keyword if "${site_content}" != "Up and running" mark test status failed Site Content validation failed! + element should contain css=body Up and running \ No newline at end of file diff --git a/config/LocalCaps.robot b/config/LocalCaps.robot new file mode 100644 index 0000000..2cd6f3b --- /dev/null +++ b/config/LocalCaps.robot @@ -0,0 +1,2 @@ +*** Variables *** +&{LOCAL_CAPS} name=local test build=browserstack-robot-framework browser=Edge browser_version=latest os=Windows os_version=10 browserstack.local=true \ No newline at end of file diff --git a/config/ParallelCaps.robot b/config/ParallelCaps.robot new file mode 100644 index 0000000..34dac4f --- /dev/null +++ b/config/ParallelCaps.robot @@ -0,0 +1,4 @@ +*** Variables *** +&{PARALLEL_CAPS_1} name=parallel test build=browserstack-robot-framework browser=Chrome browser_version=latest os=Windows os_version=10 +&{PARALLEL_CAPS_2} name=parallel test build=browserstack-robot-framework browser=Safari browser_version=latest os=OS X os_version=Big Sur +&{PARALLEL_CAPS_3} name=parallel test build=browserstack-robot-framework device=Samsung Galaxy S22 os_version=12 real_mobile=true \ No newline at end of file diff --git a/config/SingleCaps.robot b/config/SingleCaps.robot new file mode 100644 index 0000000..f6bdeba --- /dev/null +++ b/config/SingleCaps.robot @@ -0,0 +1,2 @@ +*** Variables *** +&{SINGLE_CAPS} name=single test build=browserstack-robot-framework browser=Edge browser_version=latest os=Windows os_version=10 \ No newline at end of file diff --git a/config/manage-local-testing.py b/config/manage-local-testing.py new file mode 100644 index 0000000..3b91f45 --- /dev/null +++ b/config/manage-local-testing.py @@ -0,0 +1,19 @@ +import os +from robot.libraries.BuiltIn import BuiltIn +from robot.libraries.BuiltIn import _Misc +import robot.api.logger as logger +from robot.api.deco import keyword +from browserstack.local import Local + +access_key = os.getenv("BROWSERSTACK_ACCESS_KEY") +bs_local = Local() + +@keyword("START LOCAL") +def startLocal(): + bs_local_args = {"key": access_key} + bs_local.start(**bs_local_args) + print(bs_local.isRunning()) + +@keyword("STOP LOCAL") +def stopLocal(): + bs_local.stop() \ No newline at end of file diff --git a/config/mark-test-status.py b/config/mark-test-status.py new file mode 100644 index 0000000..7746670 --- /dev/null +++ b/config/mark-test-status.py @@ -0,0 +1,9 @@ +from robot.libraries.BuiltIn import BuiltIn +from robot.libraries.BuiltIn import _Misc +import robot.api.logger as logger +from robot.api.deco import keyword + +@keyword("TEST STATUS") +def testStatus(status, reason): + driver = BuiltIn().get_library_instance('SeleniumLibrary').driver + driver.execute_script('browserstack_executor: {"action": "setSessionStatus", "arguments": {"status":"'+status+'", "reason": "'+reason+'"}}') \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..ee7359c --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +robotframework +robotframework-seleniumlibrary==5.1.3 +robotframework-pabot +browserstack-local +selenium==3.141.0 \ No newline at end of file diff --git a/tests/LocalTest.robot b/tests/LocalTest.robot new file mode 100644 index 0000000..64b28c4 --- /dev/null +++ b/tests/LocalTest.robot @@ -0,0 +1,14 @@ +*** Settings *** +Library SeleniumLibrary +Resource ../config/KeywordsFile.robot +Resource ../config/LocalCaps.robot +Test Setup Setup for local test +Test Teardown Teardown for local test + +*** Variables *** +${WEBSITE_URL}= http://bs-local.com:45691/check + +*** Test Cases *** +Local Website + Add Implicit Wait + Verify site content diff --git a/tests/SingleTest.robot b/tests/SingleTest.robot new file mode 100644 index 0000000..19d7cb8 --- /dev/null +++ b/tests/SingleTest.robot @@ -0,0 +1,17 @@ +*** Settings *** +Library SeleniumLibrary +Resource ../config/KeywordsFile.robot +Resource ../config/SingleCaps.robot +Test Setup Open Session ${SINGLE_CAPS} ${WEBSITE_URL} +Test Teardown Close Session + +*** Variables *** +${WEBSITE_URL}= https://bstackdemo.com + +*** Test Cases *** +Bstack Website Login + Add Implicit Wait + Click on Sign In + Enter Credentials demouser testingisfun99 + Click on Login + Verify username demouser \ No newline at end of file diff --git a/tests/parallel/Suite01.robot b/tests/parallel/Suite01.robot new file mode 100644 index 0000000..dd25f14 --- /dev/null +++ b/tests/parallel/Suite01.robot @@ -0,0 +1,20 @@ +*** Settings *** +Library SeleniumLibrary +Resource ../../config/KeywordsFile.robot +Resource ../../config/ParallelCaps.robot +Resource ../testcases.robot +Test Setup Open Session ${PARALLEL_CAPS_1} ${WEBSITE_URL} +Test Teardown Close Session + +*** Variables *** +${WEBSITE_URL}= https://bstackdemo.com + +*** Test Cases *** +Demouser test + Demouser + +Favuser test + Favuser + +Image not loading user test + Image not loading user \ No newline at end of file diff --git a/tests/parallel/Suite02.robot b/tests/parallel/Suite02.robot new file mode 100644 index 0000000..c646625 --- /dev/null +++ b/tests/parallel/Suite02.robot @@ -0,0 +1,20 @@ +*** Settings *** +Library SeleniumLibrary +Resource ../../config/KeywordsFile.robot +Resource ../../config/ParallelCaps.robot +Resource ../testcases.robot +Test Setup Open Session ${PARALLEL_CAPS_2} ${WEBSITE_URL} +Test Teardown Close Session + +*** Variables *** +${WEBSITE_URL}= https://bstackdemo.com + +*** Test Cases *** +Demouser test + Demouser + +Favuser test + Favuser + +Image not loading user test + Image not loading user diff --git a/tests/parallel/Suite03.robot b/tests/parallel/Suite03.robot new file mode 100644 index 0000000..c46bdbd --- /dev/null +++ b/tests/parallel/Suite03.robot @@ -0,0 +1,20 @@ +*** Settings *** +Library SeleniumLibrary +Resource ../../config/KeywordsFile.robot +Resource ../../config/ParallelCaps.robot +Resource ../testcases.robot +Test Setup Open Session ${PARALLEL_CAPS_3} ${WEBSITE_URL} +Test Teardown Close Session + +*** Variables *** +${WEBSITE_URL}= https://bstackdemo.com + +*** Test Cases *** +Demouser test + Demouser + +Favuser test + Favuser + +Image not loading user test + Image not loading user diff --git a/tests/testcases.robot b/tests/testcases.robot new file mode 100644 index 0000000..4a3f38c --- /dev/null +++ b/tests/testcases.robot @@ -0,0 +1,25 @@ +*** Settings *** +Library SeleniumLibrary +Resource ../config/KeywordsFile.robot + +*** Keywords *** +Demouser + Add Implicit Wait + Click on Sign In + Enter Credentials demouser testingisfun99 + Click on Login + Verify username demouser + +Favuser + Add Implicit Wait + Click on Sign In + Enter Credentials fav_user testingisfun99 + Click on Login + Verify username fav_user + +Image not loading user + Add Implicit Wait + Click on Sign In + Enter Credentials image_not_loading_user testingisfun99 + Click on Login + Verify username image_not_loading_user \ No newline at end of file From 65004840e188fd438707b9310a2f2427e99e9f3d Mon Sep 17 00:00:00 2001 From: abizer14 <65510743+abizer14@users.noreply.github.com> Date: Mon, 25 Jul 2022 12:55:22 +0530 Subject: [PATCH 02/13] Modified Hub URL Co-authored-by: Ankit Singh <51696887+Ankit098@users.noreply.github.com> --- config/KeywordsFile.robot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/KeywordsFile.robot b/config/KeywordsFile.robot index ff3232a..cf9fa17 100644 --- a/config/KeywordsFile.robot +++ b/config/KeywordsFile.robot @@ -6,7 +6,7 @@ Library manage-local-testing.py *** Variables *** ${USERNAME}= %{BROWSERSTACK_USERNAME} ${ACCESSKEY}= %{BROWSERSTACK_ACCESS_KEY} -${REMOTE_URL}= https://${USERNAME}:${ACCESSKEY}@hub-cloud.browserstack.com/wd/hub +${REMOTE_URL}= https://${USERNAME}:${ACCESSKEY}@hub.browserstack.com/wd/hub *** Keywords *** Open Session From 0ef375b397444a3ff7954aa48346886f02465980 Mon Sep 17 00:00:00 2001 From: Abizer Singaporewala Date: Mon, 25 Jul 2022 15:40:09 +0530 Subject: [PATCH 03/13] EOF fixes --- .gitignore | 2 +- config/KeywordsFile.robot | 3 ++- config/LocalCaps.robot | 2 +- config/ParallelCaps.robot | 2 +- config/SingleCaps.robot | 2 +- config/manage-local-testing.py | 3 ++- config/mark-test-status.py | 3 ++- requirements.txt | 2 +- tests/SingleTest.robot | 3 ++- tests/parallel/Suite01.robot | 3 ++- tests/testcases.robot | 3 ++- 11 files changed, 17 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index 2927d7a..b7ba3e9 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,4 @@ log.html pabot_results/ .pabotsuitenames .DS_Store -*.png \ No newline at end of file +*.png diff --git a/config/KeywordsFile.robot b/config/KeywordsFile.robot index cf9fa17..ab81663 100644 --- a/config/KeywordsFile.robot +++ b/config/KeywordsFile.robot @@ -53,4 +53,5 @@ Verify site content ${site_content}= get text css=body run keyword if "${site_content}" == "Up and running" mark test status passed Site Content validated! run keyword if "${site_content}" != "Up and running" mark test status failed Site Content validation failed! - element should contain css=body Up and running \ No newline at end of file + element should contain css=body Up and running + \ No newline at end of file diff --git a/config/LocalCaps.robot b/config/LocalCaps.robot index 2cd6f3b..ac85468 100644 --- a/config/LocalCaps.robot +++ b/config/LocalCaps.robot @@ -1,2 +1,2 @@ *** Variables *** -&{LOCAL_CAPS} name=local test build=browserstack-robot-framework browser=Edge browser_version=latest os=Windows os_version=10 browserstack.local=true \ No newline at end of file +&{LOCAL_CAPS} name=local test build=browserstack-robot-framework browser=Edge browser_version=latest os=Windows os_version=10 browserstack.local=true diff --git a/config/ParallelCaps.robot b/config/ParallelCaps.robot index 34dac4f..1f6c102 100644 --- a/config/ParallelCaps.robot +++ b/config/ParallelCaps.robot @@ -1,4 +1,4 @@ *** Variables *** &{PARALLEL_CAPS_1} name=parallel test build=browserstack-robot-framework browser=Chrome browser_version=latest os=Windows os_version=10 &{PARALLEL_CAPS_2} name=parallel test build=browserstack-robot-framework browser=Safari browser_version=latest os=OS X os_version=Big Sur -&{PARALLEL_CAPS_3} name=parallel test build=browserstack-robot-framework device=Samsung Galaxy S22 os_version=12 real_mobile=true \ No newline at end of file +&{PARALLEL_CAPS_3} name=parallel test build=browserstack-robot-framework device=Samsung Galaxy S22 os_version=12 real_mobile=true diff --git a/config/SingleCaps.robot b/config/SingleCaps.robot index f6bdeba..2b8e555 100644 --- a/config/SingleCaps.robot +++ b/config/SingleCaps.robot @@ -1,2 +1,2 @@ *** Variables *** -&{SINGLE_CAPS} name=single test build=browserstack-robot-framework browser=Edge browser_version=latest os=Windows os_version=10 \ No newline at end of file +&{SINGLE_CAPS} name=single test build=browserstack-robot-framework browser=Edge browser_version=latest os=Windows os_version=10 diff --git a/config/manage-local-testing.py b/config/manage-local-testing.py index 3b91f45..56fb1da 100644 --- a/config/manage-local-testing.py +++ b/config/manage-local-testing.py @@ -16,4 +16,5 @@ def startLocal(): @keyword("STOP LOCAL") def stopLocal(): - bs_local.stop() \ No newline at end of file + bs_local.stop() + \ No newline at end of file diff --git a/config/mark-test-status.py b/config/mark-test-status.py index 7746670..3a4d14f 100644 --- a/config/mark-test-status.py +++ b/config/mark-test-status.py @@ -6,4 +6,5 @@ @keyword("TEST STATUS") def testStatus(status, reason): driver = BuiltIn().get_library_instance('SeleniumLibrary').driver - driver.execute_script('browserstack_executor: {"action": "setSessionStatus", "arguments": {"status":"'+status+'", "reason": "'+reason+'"}}') \ No newline at end of file + driver.execute_script('browserstack_executor: {"action": "setSessionStatus", "arguments": {"status":"'+status+'", "reason": "'+reason+'"}}') + \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index ee7359c..bf195a4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,4 +2,4 @@ robotframework robotframework-seleniumlibrary==5.1.3 robotframework-pabot browserstack-local -selenium==3.141.0 \ No newline at end of file +selenium==3.141.0 diff --git a/tests/SingleTest.robot b/tests/SingleTest.robot index 19d7cb8..7345559 100644 --- a/tests/SingleTest.robot +++ b/tests/SingleTest.robot @@ -14,4 +14,5 @@ Bstack Website Login Click on Sign In Enter Credentials demouser testingisfun99 Click on Login - Verify username demouser \ No newline at end of file + Verify username demouser + \ No newline at end of file diff --git a/tests/parallel/Suite01.robot b/tests/parallel/Suite01.robot index dd25f14..6c42706 100644 --- a/tests/parallel/Suite01.robot +++ b/tests/parallel/Suite01.robot @@ -17,4 +17,5 @@ Favuser test Favuser Image not loading user test - Image not loading user \ No newline at end of file + Image not loading user + \ No newline at end of file diff --git a/tests/testcases.robot b/tests/testcases.robot index 4a3f38c..999ea3a 100644 --- a/tests/testcases.robot +++ b/tests/testcases.robot @@ -22,4 +22,5 @@ Image not loading user Click on Sign In Enter Credentials image_not_loading_user testingisfun99 Click on Login - Verify username image_not_loading_user \ No newline at end of file + Verify username image_not_loading_user + \ No newline at end of file From ecc30fbcb8f46a91f46ee21e8262c59793ed4e69 Mon Sep 17 00:00:00 2001 From: Abizer Singaporewala Date: Mon, 25 Jul 2022 17:44:38 +0530 Subject: [PATCH 04/13] SingleTest fix for Firefox --- config/KeywordsFile.robot | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/config/KeywordsFile.robot b/config/KeywordsFile.robot index ab81663..5ff05f4 100644 --- a/config/KeywordsFile.robot +++ b/config/KeywordsFile.robot @@ -36,8 +36,10 @@ Click on Sign In Enter Credentials [Arguments] ${username} ${password} - input text css=#username input ${username} \n - input text css=#password input ${password} \n + input text css=#username input ${username} + click element css= .css-1n7v3ny-option + input text css=#password input ${password} + click element css= .css-1n7v3ny-option Click on Login click element id=login-btn From da231388133e9a65e54023ae9d56dbefaf500daf Mon Sep 17 00:00:00 2001 From: Abizer Singaporewala Date: Mon, 25 Jul 2022 17:49:05 +0530 Subject: [PATCH 05/13] Changed build name --- config/LocalCaps.robot | 2 +- config/ParallelCaps.robot | 6 +++--- config/SingleCaps.robot | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/config/LocalCaps.robot b/config/LocalCaps.robot index ac85468..643f98f 100644 --- a/config/LocalCaps.robot +++ b/config/LocalCaps.robot @@ -1,2 +1,2 @@ *** Variables *** -&{LOCAL_CAPS} name=local test build=browserstack-robot-framework browser=Edge browser_version=latest os=Windows os_version=10 browserstack.local=true +&{LOCAL_CAPS} name=local test build=browserstack-build-1 browser=Edge browser_version=latest os=Windows os_version=10 browserstack.local=true diff --git a/config/ParallelCaps.robot b/config/ParallelCaps.robot index 1f6c102..295dfd8 100644 --- a/config/ParallelCaps.robot +++ b/config/ParallelCaps.robot @@ -1,4 +1,4 @@ *** Variables *** -&{PARALLEL_CAPS_1} name=parallel test build=browserstack-robot-framework browser=Chrome browser_version=latest os=Windows os_version=10 -&{PARALLEL_CAPS_2} name=parallel test build=browserstack-robot-framework browser=Safari browser_version=latest os=OS X os_version=Big Sur -&{PARALLEL_CAPS_3} name=parallel test build=browserstack-robot-framework device=Samsung Galaxy S22 os_version=12 real_mobile=true +&{PARALLEL_CAPS_1} name=parallel test build=browserstack-build-1 browser=Chrome browser_version=latest os=Windows os_version=10 +&{PARALLEL_CAPS_2} name=parallel test build=browserstack-build-1 browser=Safari browser_version=latest os=OS X os_version=Big Sur +&{PARALLEL_CAPS_3} name=parallel test build=browserstack-build-1 device=Samsung Galaxy S22 os_version=12 real_mobile=true diff --git a/config/SingleCaps.robot b/config/SingleCaps.robot index 2b8e555..f6830cf 100644 --- a/config/SingleCaps.robot +++ b/config/SingleCaps.robot @@ -1,2 +1,2 @@ *** Variables *** -&{SINGLE_CAPS} name=single test build=browserstack-robot-framework browser=Edge browser_version=latest os=Windows os_version=10 +&{SINGLE_CAPS} name=single test build=browserstack-build-1 browser=Edge browser_version=latest os=Windows os_version=10 From a2da1fdd2acf4b06f3fcf97b1840e0fea5ecb9c3 Mon Sep 17 00:00:00 2001 From: Abizer Singaporewala Date: Wed, 27 Jul 2022 16:39:17 +0530 Subject: [PATCH 06/13] Removed SingleTest config + additional EOF files --- config/KeywordsFile.robot | 1 - config/SingleCaps.robot | 2 -- config/manage-local-testing.py | 1 - config/mark-test-status.py | 1 - tests/SingleTest.robot | 18 ------------------ tests/parallel/Suite01.robot | 1 - tests/testcases.robot | 1 - 7 files changed, 25 deletions(-) delete mode 100644 config/SingleCaps.robot delete mode 100644 tests/SingleTest.robot diff --git a/config/KeywordsFile.robot b/config/KeywordsFile.robot index 5ff05f4..58115b2 100644 --- a/config/KeywordsFile.robot +++ b/config/KeywordsFile.robot @@ -56,4 +56,3 @@ Verify site content run keyword if "${site_content}" == "Up and running" mark test status passed Site Content validated! run keyword if "${site_content}" != "Up and running" mark test status failed Site Content validation failed! element should contain css=body Up and running - \ No newline at end of file diff --git a/config/SingleCaps.robot b/config/SingleCaps.robot deleted file mode 100644 index f6830cf..0000000 --- a/config/SingleCaps.robot +++ /dev/null @@ -1,2 +0,0 @@ -*** Variables *** -&{SINGLE_CAPS} name=single test build=browserstack-build-1 browser=Edge browser_version=latest os=Windows os_version=10 diff --git a/config/manage-local-testing.py b/config/manage-local-testing.py index 56fb1da..95f6cc6 100644 --- a/config/manage-local-testing.py +++ b/config/manage-local-testing.py @@ -17,4 +17,3 @@ def startLocal(): @keyword("STOP LOCAL") def stopLocal(): bs_local.stop() - \ No newline at end of file diff --git a/config/mark-test-status.py b/config/mark-test-status.py index 3a4d14f..34469c6 100644 --- a/config/mark-test-status.py +++ b/config/mark-test-status.py @@ -7,4 +7,3 @@ def testStatus(status, reason): driver = BuiltIn().get_library_instance('SeleniumLibrary').driver driver.execute_script('browserstack_executor: {"action": "setSessionStatus", "arguments": {"status":"'+status+'", "reason": "'+reason+'"}}') - \ No newline at end of file diff --git a/tests/SingleTest.robot b/tests/SingleTest.robot deleted file mode 100644 index 7345559..0000000 --- a/tests/SingleTest.robot +++ /dev/null @@ -1,18 +0,0 @@ -*** Settings *** -Library SeleniumLibrary -Resource ../config/KeywordsFile.robot -Resource ../config/SingleCaps.robot -Test Setup Open Session ${SINGLE_CAPS} ${WEBSITE_URL} -Test Teardown Close Session - -*** Variables *** -${WEBSITE_URL}= https://bstackdemo.com - -*** Test Cases *** -Bstack Website Login - Add Implicit Wait - Click on Sign In - Enter Credentials demouser testingisfun99 - Click on Login - Verify username demouser - \ No newline at end of file diff --git a/tests/parallel/Suite01.robot b/tests/parallel/Suite01.robot index 6c42706..b64854f 100644 --- a/tests/parallel/Suite01.robot +++ b/tests/parallel/Suite01.robot @@ -18,4 +18,3 @@ Favuser test Image not loading user test Image not loading user - \ No newline at end of file diff --git a/tests/testcases.robot b/tests/testcases.robot index 999ea3a..a3bc54a 100644 --- a/tests/testcases.robot +++ b/tests/testcases.robot @@ -23,4 +23,3 @@ Image not loading user Enter Credentials image_not_loading_user testingisfun99 Click on Login Verify username image_not_loading_user - \ No newline at end of file From 1be186494a4552849e68ea4a33532a52b2c16760 Mon Sep 17 00:00:00 2001 From: abizer14 <65510743+abizer14@users.noreply.github.com> Date: Wed, 27 Jul 2022 16:47:44 +0530 Subject: [PATCH 07/13] Updated README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 1bcfd61..32bd691 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,6 @@ ## Running tests -* To run single test, run `robot tests/SingleTest.robot` * To run local test, run `robot tests/LocalTest.robot` * To run parallel tests we will be using the [Pabot](https://pabot.org/) library: 1. To run test suites in parallel (Testcases within respective test suites will be sequential) From e78598b8e80187a5b92caba4d436168e92056667 Mon Sep 17 00:00:00 2001 From: Abizer Singaporewala Date: Fri, 5 Aug 2022 05:12:56 +0530 Subject: [PATCH 08/13] Code refactor --- config/Config.py | 38 ++++++++++++++++++++++++++++++++++++ config/KeywordsFile.robot | 28 ++++++++++++++------------ config/LocalCaps.robot | 2 -- config/ParallelCaps.robot | 4 ---- tests/LocalTest.robot | 19 +++++++++++++++--- tests/parallel/Suite01.robot | 25 ++++++++++++++---------- tests/parallel/Suite02.robot | 25 ++++++++++++++---------- tests/parallel/Suite03.robot | 25 ++++++++++++++---------- tests/testcases.robot | 19 ++++++------------ 9 files changed, 120 insertions(+), 65 deletions(-) create mode 100644 config/Config.py delete mode 100644 config/LocalCaps.robot delete mode 100644 config/ParallelCaps.robot diff --git a/config/Config.py b/config/Config.py new file mode 100644 index 0000000..1937c4f --- /dev/null +++ b/config/Config.py @@ -0,0 +1,38 @@ +import os + +common_caps = { + "browserstack.user" : "BROWSERSTACK_USERNAME", + "browserstack.key" : "BROWSERSTACK_ACCESS_KEY", + "build" : "browserstack-build-1", + "browserstack.debug" : "true" +} + +envs = [{ + "os" : "Windows", + "os_version" : "10", + "browser" : "Chrome", + "browser_version" : "latest" +}, +{ + "os" : "OS X", + "os_version" : "Big Sur", + "browser" : "Safari", + "browser_version" : "latest" +}, +{ + "device" : "Samsung Galaxy S22", + "os_version" : "12", + "real_mobile" : "true" +}] + +def combine_caps(i): + + username = os.environ.get("BROWSERSTACK_USERNAME") + accesskey = os.environ.get("BROWSERSTACK_ACCESS_KEY") + if username != None and accesskey != None: + common_caps["browserstack.user"] = username + common_caps["browserstack.key"] = accesskey + + x = int(i) + envs[x].update(common_caps) + return envs[x] diff --git a/config/KeywordsFile.robot b/config/KeywordsFile.robot index 58115b2..ded1323 100644 --- a/config/KeywordsFile.robot +++ b/config/KeywordsFile.robot @@ -1,17 +1,14 @@ *** Settings *** Library SeleniumLibrary Library mark-test-status.py -Library manage-local-testing.py *** Variables *** -${USERNAME}= %{BROWSERSTACK_USERNAME} -${ACCESSKEY}= %{BROWSERSTACK_ACCESS_KEY} -${REMOTE_URL}= https://${USERNAME}:${ACCESSKEY}@hub.browserstack.com/wd/hub +${remote_url}= https://hub.browserstack.com/wd/hub *** Keywords *** Open Session - [Arguments] ${capabilities} ${website_url} - open browser remote_url=${REMOTE_URL} desired_capabilities=${capabilities} url=${website_url} + [Arguments] ${capabilities} ${test_url} + open browser remote_url=${remote_url} desired_capabilities=${capabilities} url=${test_url} Close Session close browser @@ -23,13 +20,8 @@ Mark Test Status [Arguments] ${status} ${reason} TEST STATUS ${status} ${reason} -Setup for local test - START LOCAL - Open Session ${LOCAL_CAPS} ${WEBSITE_URL} - -Teardown for local test - Close Session - STOP LOCAL +Get the page title + get title Click on Sign In click element id=signin @@ -56,3 +48,13 @@ Verify site content run keyword if "${site_content}" == "Up and running" mark test status passed Site Content validated! run keyword if "${site_content}" != "Up and running" mark test status failed Site Content validation failed! element should contain css=body Up and running + +Add first product to cart + click element xpath=//*[@id="1"]/div[4] + +Verify product is added to cart + ${product_name} get text xpath=//*[@id="1"]/p + ${product_incart} get text css=p.title + run keyword if "${product_name}" == "${product_incart}" mark test status passed Correct product added! + run keyword if "${product_name}" != "${product_incart}" mark test status failed Something went wrong! + element should contain css=p.title ${product_name} diff --git a/config/LocalCaps.robot b/config/LocalCaps.robot deleted file mode 100644 index 643f98f..0000000 --- a/config/LocalCaps.robot +++ /dev/null @@ -1,2 +0,0 @@ -*** Variables *** -&{LOCAL_CAPS} name=local test build=browserstack-build-1 browser=Edge browser_version=latest os=Windows os_version=10 browserstack.local=true diff --git a/config/ParallelCaps.robot b/config/ParallelCaps.robot deleted file mode 100644 index 295dfd8..0000000 --- a/config/ParallelCaps.robot +++ /dev/null @@ -1,4 +0,0 @@ -*** Variables *** -&{PARALLEL_CAPS_1} name=parallel test build=browserstack-build-1 browser=Chrome browser_version=latest os=Windows os_version=10 -&{PARALLEL_CAPS_2} name=parallel test build=browserstack-build-1 browser=Safari browser_version=latest os=OS X os_version=Big Sur -&{PARALLEL_CAPS_3} name=parallel test build=browserstack-build-1 device=Samsung Galaxy S22 os_version=12 real_mobile=true diff --git a/tests/LocalTest.robot b/tests/LocalTest.robot index 64b28c4..1f8427b 100644 --- a/tests/LocalTest.robot +++ b/tests/LocalTest.robot @@ -1,14 +1,27 @@ *** Settings *** Library SeleniumLibrary +Library Collections +Library ../config/manage-local-testing.py +Library ../config/Config.py Resource ../config/KeywordsFile.robot -Resource ../config/LocalCaps.robot Test Setup Setup for local test Test Teardown Teardown for local test *** Variables *** -${WEBSITE_URL}= http://bs-local.com:45691/check +${local_url}= http://bs-local.com:45691/check + +*** Keywords *** +Setup for local test + START LOCAL + ${final_caps}= combine caps 0 + Set to Dictionary ${final_caps} name=BStack Demo - ${TEST NAME} browserstack.local=true + Open Session ${final_caps} ${local_url} + +Teardown for local test + Close Session + STOP LOCAL *** Test Cases *** -Local Website +Local Test Add Implicit Wait Verify site content diff --git a/tests/parallel/Suite01.robot b/tests/parallel/Suite01.robot index b64854f..8137bef 100644 --- a/tests/parallel/Suite01.robot +++ b/tests/parallel/Suite01.robot @@ -1,20 +1,25 @@ *** Settings *** Library SeleniumLibrary +Library Collections +Library ../../config/Config.py Resource ../../config/KeywordsFile.robot -Resource ../../config/ParallelCaps.robot Resource ../testcases.robot -Test Setup Open Session ${PARALLEL_CAPS_1} ${WEBSITE_URL} +Test Setup Execute test Test Teardown Close Session *** Variables *** -${WEBSITE_URL}= https://bstackdemo.com +${website_url}= https://bstackdemo.com + +*** Keywords *** +Execute test + ${final_caps}= combine caps 0 + Set to Dictionary ${final_caps} name=BStack Demo - ${TEST NAME} + Open Session ${final_caps} ${website_url} -*** Test Cases *** -Demouser test - Demouser -Favuser test - Favuser +*** Test Cases *** +Login Test + Login -Image not loading user test - Image not loading user +Add to Cart Test + Add to Cart diff --git a/tests/parallel/Suite02.robot b/tests/parallel/Suite02.robot index c646625..ed3d211 100644 --- a/tests/parallel/Suite02.robot +++ b/tests/parallel/Suite02.robot @@ -1,20 +1,25 @@ *** Settings *** Library SeleniumLibrary +Library Collections +Library ../../config/Config.py Resource ../../config/KeywordsFile.robot -Resource ../../config/ParallelCaps.robot Resource ../testcases.robot -Test Setup Open Session ${PARALLEL_CAPS_2} ${WEBSITE_URL} +Test Setup Execute test Test Teardown Close Session *** Variables *** -${WEBSITE_URL}= https://bstackdemo.com +${website_url}= https://bstackdemo.com + +*** Keywords *** +Execute test + ${final_caps}= combine caps 1 + Set to Dictionary ${final_caps} name=BStack Demo - ${TEST NAME} + Open Session ${final_caps} ${website_url} -*** Test Cases *** -Demouser test - Demouser -Favuser test - Favuser +*** Test Cases *** +Login Test + Login -Image not loading user test - Image not loading user +Add to Cart Test + Add to Cart diff --git a/tests/parallel/Suite03.robot b/tests/parallel/Suite03.robot index c46bdbd..c730ffb 100644 --- a/tests/parallel/Suite03.robot +++ b/tests/parallel/Suite03.robot @@ -1,20 +1,25 @@ *** Settings *** Library SeleniumLibrary +Library Collections +Library ../../config/Config.py Resource ../../config/KeywordsFile.robot -Resource ../../config/ParallelCaps.robot Resource ../testcases.robot -Test Setup Open Session ${PARALLEL_CAPS_3} ${WEBSITE_URL} +Test Setup Execute test Test Teardown Close Session *** Variables *** -${WEBSITE_URL}= https://bstackdemo.com +${website_url}= https://bstackdemo.com + +*** Keywords *** +Execute test + ${final_caps}= combine caps 2 + Set to Dictionary ${final_caps} name=BStack Demo - ${TEST NAME} + Open Session ${final_caps} ${website_url} -*** Test Cases *** -Demouser test - Demouser -Favuser test - Favuser +*** Test Cases *** +Login Test + Login -Image not loading user test - Image not loading user +Add to Cart Test + Add to Cart diff --git a/tests/testcases.robot b/tests/testcases.robot index a3bc54a..9d966ed 100644 --- a/tests/testcases.robot +++ b/tests/testcases.robot @@ -3,23 +3,16 @@ Library SeleniumLibrary Resource ../config/KeywordsFile.robot *** Keywords *** -Demouser +Login Add Implicit Wait + Get the page title Click on Sign In Enter Credentials demouser testingisfun99 Click on Login Verify username demouser -Favuser +Add to Cart Add Implicit Wait - Click on Sign In - Enter Credentials fav_user testingisfun99 - Click on Login - Verify username fav_user - -Image not loading user - Add Implicit Wait - Click on Sign In - Enter Credentials image_not_loading_user testingisfun99 - Click on Login - Verify username image_not_loading_user + Get the page title + Add first product to cart + Verify product is added to cart From e99351ae850e499458879e39af839702c2748533 Mon Sep 17 00:00:00 2001 From: abizer14 <65510743+abizer14@users.noreply.github.com> Date: Mon, 8 Aug 2022 15:16:46 +0530 Subject: [PATCH 09/13] Updated Config.py Co-authored-by: Ankit Singh <51696887+Ankit098@users.noreply.github.com> --- config/Config.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/config/Config.py b/config/Config.py index 1937c4f..1f243f3 100644 --- a/config/Config.py +++ b/config/Config.py @@ -21,8 +21,7 @@ }, { "device" : "Samsung Galaxy S22", - "os_version" : "12", - "real_mobile" : "true" + "os_version" : "12" }] def combine_caps(i): From 70666ff5b0baaf7abd3ab22957181c6286bd6a34 Mon Sep 17 00:00:00 2001 From: Abizer Singaporewala Date: Fri, 12 Aug 2022 15:34:25 +0530 Subject: [PATCH 10/13] Bug fix - Fixed additional invalid caps getting added --- config/KeywordsFile.robot | 4 ++-- tests/parallel/Suite01.robot | 3 ++- tests/parallel/Suite02.robot | 3 ++- tests/parallel/Suite03.robot | 3 ++- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/config/KeywordsFile.robot b/config/KeywordsFile.robot index ded1323..eef611d 100644 --- a/config/KeywordsFile.robot +++ b/config/KeywordsFile.robot @@ -7,8 +7,8 @@ ${remote_url}= https://hub.browserstack.com/wd/hub *** Keywords *** Open Session - [Arguments] ${capabilities} ${test_url} - open browser remote_url=${remote_url} desired_capabilities=${capabilities} url=${test_url} + [Arguments] ${capabilities} ${browsername} ${test_url} + open browser remote_url=${remote_url} desired_capabilities=${capabilities} url=${test_url} browser=${browsername} Close Session close browser diff --git a/tests/parallel/Suite01.robot b/tests/parallel/Suite01.robot index 8137bef..ca89b4f 100644 --- a/tests/parallel/Suite01.robot +++ b/tests/parallel/Suite01.robot @@ -9,12 +9,13 @@ Test Teardown Close Session *** Variables *** ${website_url}= https://bstackdemo.com +${browser}= chrome *** Keywords *** Execute test ${final_caps}= combine caps 0 Set to Dictionary ${final_caps} name=BStack Demo - ${TEST NAME} - Open Session ${final_caps} ${website_url} + Open Session ${final_caps} ${browser} ${website_url} *** Test Cases *** diff --git a/tests/parallel/Suite02.robot b/tests/parallel/Suite02.robot index ed3d211..9fbe1c1 100644 --- a/tests/parallel/Suite02.robot +++ b/tests/parallel/Suite02.robot @@ -9,12 +9,13 @@ Test Teardown Close Session *** Variables *** ${website_url}= https://bstackdemo.com +${browser}= safari *** Keywords *** Execute test ${final_caps}= combine caps 1 Set to Dictionary ${final_caps} name=BStack Demo - ${TEST NAME} - Open Session ${final_caps} ${website_url} + Open Session ${final_caps} ${browser} ${website_url} *** Test Cases *** diff --git a/tests/parallel/Suite03.robot b/tests/parallel/Suite03.robot index c730ffb..5468727 100644 --- a/tests/parallel/Suite03.robot +++ b/tests/parallel/Suite03.robot @@ -9,12 +9,13 @@ Test Teardown Close Session *** Variables *** ${website_url}= https://bstackdemo.com +${browser}= chrome *** Keywords *** Execute test ${final_caps}= combine caps 2 Set to Dictionary ${final_caps} name=BStack Demo - ${TEST NAME} - Open Session ${final_caps} ${website_url} + Open Session ${final_caps} ${browser} ${website_url} *** Test Cases *** From 2d9334f33cdd753a47605d726a3130238220556e Mon Sep 17 00:00:00 2001 From: abizer14 <65510743+abizer14@users.noreply.github.com> Date: Fri, 12 Aug 2022 16:23:38 +0530 Subject: [PATCH 11/13] Minor whitespace fix --- tests/parallel/Suite03.robot | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/parallel/Suite03.robot b/tests/parallel/Suite03.robot index c61fdac..5468727 100644 --- a/tests/parallel/Suite03.robot +++ b/tests/parallel/Suite03.robot @@ -11,7 +11,6 @@ Test Teardown Close Session ${website_url}= https://bstackdemo.com ${browser}= chrome - *** Keywords *** Execute test ${final_caps}= combine caps 2 From bed237c8b634252a9efccc0b4d6af700099ad097 Mon Sep 17 00:00:00 2001 From: Abizer Singaporewala Date: Wed, 24 Aug 2022 13:57:49 +0530 Subject: [PATCH 12/13] Bug fix for LocalTest.robot --- tests/LocalTest.robot | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/LocalTest.robot b/tests/LocalTest.robot index 1f8427b..8d9e12e 100644 --- a/tests/LocalTest.robot +++ b/tests/LocalTest.robot @@ -9,13 +9,14 @@ Test Teardown Teardown for local test *** Variables *** ${local_url}= http://bs-local.com:45691/check +${browser}= chrome *** Keywords *** Setup for local test START LOCAL ${final_caps}= combine caps 0 Set to Dictionary ${final_caps} name=BStack Demo - ${TEST NAME} browserstack.local=true - Open Session ${final_caps} ${local_url} + Open Session ${final_caps} ${browser} ${local_url} Teardown for local test Close Session From b83444000ede8c1913dcf98e118bd9b10c627e25 Mon Sep 17 00:00:00 2001 From: Abizer Singaporewala Date: Fri, 26 Aug 2022 13:51:14 +0530 Subject: [PATCH 13/13] Updated README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 32bd691..934a793 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ Understand how many parallel sessions you need by using our [Parallel Test Calculator](https://www.browserstack.com/automate/parallel-calculator?ref=github) ## Notes -* This repository only works for Selenium 3 as of now. Desired Capabilities do not get honoured for Selenium 4. The open issue on SeleniumLibrary can be found [here](https://github.com/robotframework/SeleniumLibrary/issues/1774). +* This repository is for Selenium 3, for Selenium 4, refer to the selenium-4 branch. * You can view your test results on the [BrowserStack Automate dashboard](https://www.browserstack.com/automate) * To test on a different set of browsers, check out our [platform configurator](https://www.browserstack.com/automate/capabilities)