From 89dfe3ab6b145030939959993e246de2e6b2c975 Mon Sep 17 00:00:00 2001 From: Mihir Rawool Date: Tue, 27 Oct 2026 21:26:44 +0530 Subject: [PATCH 1/6] LTS-5442: add the Robot Framework sample tests from the bundled zip The Playwright-Robot sample shipped in load-testing-backend (sample/sample-playwright-robot-repo.zip, LTS-2848) was never pushed to this repo, which only held a README and the Semgrep workflow. Add its five files unchanged so the public sample matches what customers run and the code can be reviewed and scanned here. Co-Authored-By: Claude Opus 5.5 --- browserstack-load.yml | 29 ++++++++++++++++ requirements.txt | 2 ++ resources/common.resource | 14 ++++++++ tests/bstack_test_add_to_cart.robot | 14 ++++++++ tests/bstack_test_checkout_flow.robot | 49 +++++++++++++++++++++++++++ 5 files changed, 108 insertions(+) create mode 100644 browserstack-load.yml create mode 100644 requirements.txt create mode 100644 resources/common.resource create mode 100644 tests/bstack_test_add_to_cart.robot create mode 100644 tests/bstack_test_checkout_flow.robot diff --git a/browserstack-load.yml b/browserstack-load.yml new file mode 100644 index 0000000..ca20f36 --- /dev/null +++ b/browserstack-load.yml @@ -0,0 +1,29 @@ +projectName: Robot Framework Playwright Load Testing Sample +loadTestName: robot-playwright-sample +framework: playwright-robot +files: + dependencies: + - requirements.txt + testConfigs: + - tests/ +thresholds: [] +headless: true +vus: 2 +duration: 1m 50s +regions: + - loadzone: eu-central-1 + percent: 100 +loadProfile: ramping +loadProfileStages: + - duration: 10s + startVUs: 0 + targetVUs: 2 + type: ramp-up + - duration: 1m 30s + startVUs: 2 + targetVUs: 2 + type: hold + - duration: 10s + startVUs: 2 + targetVUs: 0 + type: ramp-down diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..29e0ecc --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +robotframework==7.1.0 +robotframework-browser==18.4.0 diff --git a/resources/common.resource b/resources/common.resource new file mode 100644 index 0000000..317a7cc --- /dev/null +++ b/resources/common.resource @@ -0,0 +1,14 @@ +*** Settings *** +Library Browser + +*** Variables *** +${BASE_URL} https://bstackdemo.com/ +${BROWSER} chromium +${HEADLESS} ${FALSE} + +*** Keywords *** +Open BStackDemo + [Documentation] Opens a Playwright browser session via Browser library and navigates to bstackdemo. + New Browser browser=${BROWSER} headless=${HEADLESS} + New Context viewport={'width': 1280, 'height': 720} + New Page ${BASE_URL} diff --git a/tests/bstack_test_add_to_cart.robot b/tests/bstack_test_add_to_cart.robot new file mode 100644 index 0000000..870c45b --- /dev/null +++ b/tests/bstack_test_add_to_cart.robot @@ -0,0 +1,14 @@ +*** Settings *** +Resource ../resources/common.resource +Test Setup Open BStackDemo +Test Teardown Close Browser + +*** Test Cases *** +BStackDemo Test Add To Cart + [Documentation] Adds a product to the cart and asserts the cart shows the same product name. + Wait For Elements State css=[id="3"] > p visible timeout=10s + ${product_to_add}= Get Text css=[id="3"] > p + Click css=[id="3"] > .shelf-item__buy-btn + Wait For Elements State css=.float-cart--open .shelf-item__details p.title visible timeout=10s + ${product_in_cart}= Get Text css=.float-cart--open .shelf-item__details p.title + Should Be Equal ${product_in_cart} ${product_to_add} diff --git a/tests/bstack_test_checkout_flow.robot b/tests/bstack_test_checkout_flow.robot new file mode 100644 index 0000000..e598859 --- /dev/null +++ b/tests/bstack_test_checkout_flow.robot @@ -0,0 +1,49 @@ +*** Settings *** +Resource ../resources/common.resource +Test Setup Open BStackDemo +Test Teardown Close Browser + +*** Test Cases *** +BStackDemo Test Checkout Flow + [Documentation] Signs in, adds two items, completes the address form, and proceeds through checkout. + + # sign in + Wait For Elements State id=signin visible timeout=15s + Click id=signin + + Wait For Elements State css=#username svg visible timeout=15s + Click css=#username svg + Wait For Elements State id=react-select-2-option-0-0 visible timeout=15s + Click id=react-select-2-option-0-0 + + Wait For Elements State css=#password svg visible timeout=15s + Click css=#password svg + Wait For Elements State id=react-select-3-option-0-0 visible timeout=15s + Click id=react-select-3-option-0-0 + + Click id=login-btn + + # add two items to cart + Wait For Elements State css=[id="1"] > .shelf-item__buy-btn visible timeout=15s + Click css=[id="1"] > .shelf-item__buy-btn + Wait For Elements State css=div.float-cart__close-btn visible timeout=15s + Click css=div.float-cart__close-btn + Wait For Elements State css=[id="2"] > .shelf-item__buy-btn visible timeout=15s + Click css=[id="2"] > .shelf-item__buy-btn + Wait For Elements State css=.buy-btn visible timeout=15s + Click css=.buy-btn + + # add address details + Wait For Elements State id=firstNameInput visible timeout=15s + Fill Text id=firstNameInput first + Fill Text id=lastNameInput last + Fill Text id=addressLine1Input address + Fill Text id=provinceInput province + Fill Text id=postCodeInput pincode + + # checkout + Click id=checkout-shipping-continue + Wait For Elements State xpath=//*[normalize-space()='Continue'] visible timeout=15s + Click xpath=//*[normalize-space()='Continue'] + Wait For Elements State xpath=//*[normalize-space()='Orders'] visible timeout=15s + Click xpath=//*[normalize-space()='Orders'] From 4083a1189a5bc1a07210e25792a1ad1605369a2c Mon Sep 17 00:00:00 2001 From: Mihir Rawool Date: Tue, 27 Oct 2026 22:18:47 +0530 Subject: [PATCH 2/6] LTS-5442: fix the robot sample findings (hash-pinned deps, thresholds, checkout assertion, .npmrc, shared-account note) - LTS-5660: requirements.txt is now a hash-pinned lock (uv, py3.10 universal); direct deps moved to requirements.in - LTS-5661: browserstack-load.yml ships error-percentage and p95 thresholds - LTS-5662: checkout test asserts the order confirmation message - LTS-5663: README explains every VU shares the demo user - LTS-5664: drop access=public from .npmrc Co-Authored-By: Claude Opus 5.5 --- .npmrc | 1 - README.md | 11 ++ browserstack-load.yml | 17 +- requirements.in | 2 + requirements.txt | 258 +++++++++++++++++++++++++- tests/bstack_test_checkout_flow.robot | 2 + 6 files changed, 287 insertions(+), 4 deletions(-) create mode 100644 requirements.in diff --git a/.npmrc b/.npmrc index 33911e3..96780a5 100644 --- a/.npmrc +++ b/.npmrc @@ -4,4 +4,3 @@ save-exact=true engine-strict=true legacy-peer-deps=false audit-level=high -access=public diff --git a/README.md b/README.md index ca35674..73e24d4 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,13 @@ # browserstack-playwright-robot-load-testing-sample Sample repository for Playwright framework to do load testing + +## Notes before you adapt this sample + +- **Dependencies are hash-pinned.** `requirements.txt` is a lock with a hash for every package, so pip refuses anything that doesn't match. Edit the direct dependencies in `requirements.in`, then regenerate the lock: + + ```sh + uv pip compile requirements.in --universal --python-version 3.10 --generate-hashes -o requirements.txt + ``` + +- **Set thresholds for your own SLA.** `browserstack-load.yml` ships an error-rate and a p95 response-time threshold. Without thresholds every run reports as passed, however the application behaves. +- **Every VU logs in as the same demo user.** That's fine against bstackdemo.com. Against your own application, give each VU its own test account. Concurrent sessions sharing one account race on the same cart and orders, and that can hide real failures. diff --git a/browserstack-load.yml b/browserstack-load.yml index ca20f36..880b2fa 100644 --- a/browserstack-load.yml +++ b/browserstack-load.yml @@ -6,7 +6,22 @@ files: - requirements.txt testConfigs: - tests/ -thresholds: [] +# Pass/fail criteria for the run. Tune these to your application's SLA. +thresholds: + - metric: error-percentage + condition: "<" + threshold: 5 + unit: "%" + type: blu + requestType: entireTestRun + failOnBreach: false + - metric: p95-response-time + condition: "<" + threshold: 10000 + unit: ms + type: blu + requestType: entireTestRun + failOnBreach: false headless: true vus: 2 duration: 1m 50s diff --git a/requirements.in b/requirements.in new file mode 100644 index 0000000..29e0ecc --- /dev/null +++ b/requirements.in @@ -0,0 +1,2 @@ +robotframework==7.1.0 +robotframework-browser==18.4.0 diff --git a/requirements.txt b/requirements.txt index 29e0ecc..c2171e4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,256 @@ -robotframework==7.1.0 -robotframework-browser==18.4.0 +# Hash-pinned lock (pip verifies every download). Direct dependencies live in +# requirements.in; regenerate with: +# uv pip compile requirements.in --universal --python-version 3.10 --generate-hashes -o requirements.txt +click==8.5.0 \ + --hash=sha256:255bc9599cf7748b4b1a446ccc735421bd08a2ae529a8b88597d3de5664ee360 \ + --hash=sha256:ba0d2089de75ea0310e2dde03160e6ca10009947fb95a182f9b54021bb272e34 + # via robotframework-browser +grpcio==1.63.0 \ + --hash=sha256:01799e8649f9e94ba7db1aeb3452188048b0019dc37696b0f5ce212c87c560c3 \ + --hash=sha256:0697563d1d84d6985e40ec5ec596ff41b52abb3fd91ec240e8cb44a63b895094 \ + --hash=sha256:08e1559fd3b3b4468486b26b0af64a3904a8dbc78d8d936af9c1cf9636eb3e8b \ + --hash=sha256:166e5c460e5d7d4656ff9e63b13e1f6029b122104c1633d5f37eaea348d7356d \ + --hash=sha256:1ff737cf29b5b801619f10e59b581869e32f400159e8b12d7a97e7e3bdeee6a2 \ + --hash=sha256:219bb1848cd2c90348c79ed0a6b0ea51866bc7e72fa6e205e459fedab5770172 \ + --hash=sha256:259e11932230d70ef24a21b9fb5bb947eb4703f57865a404054400ee92f42f5d \ + --hash=sha256:2e93aca840c29d4ab5db93f94ed0a0ca899e241f2e8aec6334ab3575dc46125c \ + --hash=sha256:3a6d1f9ea965e750db7b4ee6f9fdef5fdf135abe8a249e75d84b0a3e0c668a1b \ + --hash=sha256:50344663068041b34a992c19c600236e7abb42d6ec32567916b87b4c8b8833b3 \ + --hash=sha256:56cdf96ff82e3cc90dbe8bac260352993f23e8e256e063c327b6cf9c88daf7a9 \ + --hash=sha256:5c039ef01516039fa39da8a8a43a95b64e288f79f42a17e6c2904a02a319b357 \ + --hash=sha256:6426e1fb92d006e47476d42b8f240c1d916a6d4423c5258ccc5b105e43438f61 \ + --hash=sha256:65bf975639a1f93bee63ca60d2e4951f1b543f498d581869922910a476ead2f5 \ + --hash=sha256:6a1a3642d76f887aa4009d92f71eb37809abceb3b7b5a1eec9c554a246f20e3a \ + --hash=sha256:6ef0ad92873672a2a3767cb827b64741c363ebaa27e7f21659e4e31f4d750280 \ + --hash=sha256:756fed02dacd24e8f488f295a913f250b56b98fb793f41d5b2de6c44fb762434 \ + --hash=sha256:75f701ff645858a2b16bc8c9fc68af215a8bb2d5a9b647448129de6e85d52bce \ + --hash=sha256:8064d986d3a64ba21e498b9a376cbc5d6ab2e8ab0e288d39f266f0fca169b90d \ + --hash=sha256:878b1d88d0137df60e6b09b74cdb73db123f9579232c8456f53e9abc4f62eb3c \ + --hash=sha256:8f3f6883ce54a7a5f47db43289a0a4c776487912de1a0e2cc83fdaec9685cc9f \ + --hash=sha256:91b73d3f1340fefa1e1716c8c1ec9930c676d6b10a3513ab6c26004cb02d8b3f \ + --hash=sha256:93a46794cc96c3a674cdfb59ef9ce84d46185fe9421baf2268ccb556f8f81f57 \ + --hash=sha256:93f45f27f516548e23e4ec3fbab21b060416007dbe768a111fc4611464cc773f \ + --hash=sha256:9e350cb096e5c67832e9b6e018cf8a0d2a53b2a958f6251615173165269a91b0 \ + --hash=sha256:a2d60cd1d58817bc5985fae6168d8b5655c4981d448d0f5b6194bbcc038090d2 \ + --hash=sha256:a3abfe0b0f6798dedd2e9e92e881d9acd0fdb62ae27dcbbfa7654a57e24060c0 \ + --hash=sha256:a44624aad77bf8ca198c55af811fd28f2b3eaf0a50ec5b57b06c034416ef2d0a \ + --hash=sha256:a7b19dfc74d0be7032ca1eda0ed545e582ee46cd65c162f9e9fc6b26ef827dc6 \ + --hash=sha256:ad2ac8903b2eae071055a927ef74121ed52d69468e91d9bcbd028bd0e554be6d \ + --hash=sha256:b005292369d9c1f80bf70c1db1c17c6c342da7576f1c689e8eee4fb0c256af85 \ + --hash=sha256:b2e44f59316716532a993ca2966636df6fbe7be4ab6f099de6815570ebe4383a \ + --hash=sha256:b3afbd9d6827fa6f475a4f91db55e441113f6d3eb9b7ebb8fb806e5bb6d6bd0d \ + --hash=sha256:b416252ac5588d9dfb8a30a191451adbf534e9ce5f56bb02cd193f12d8845b7f \ + --hash=sha256:b5194775fec7dc3dbd6a935102bb156cd2c35efe1685b0a46c67b927c74f0cfb \ + --hash=sha256:cacdef0348a08e475a721967f48206a2254a1b26ee7637638d9e081761a5ba86 \ + --hash=sha256:cd1e68776262dd44dedd7381b1a0ad09d9930ffb405f737d64f505eb7f77d6c7 \ + --hash=sha256:cdcda1156dcc41e042d1e899ba1f5c2e9f3cd7625b3d6ebfa619806a4c1aadda \ + --hash=sha256:cf8dae9cc0412cb86c8de5a8f3be395c5119a370f3ce2e69c8b7d46bb9872c8d \ + --hash=sha256:d2497769895bb03efe3187fb1888fc20e98a5f18b3d14b606167dacda5789434 \ + --hash=sha256:e3b77eaefc74d7eb861d3ffbdf91b50a1bb1639514ebe764c47773b833fa2d91 \ + --hash=sha256:e48cee31bc5f5a31fb2f3b573764bd563aaa5472342860edcc7039525b53e46a \ + --hash=sha256:e4cbb2100ee46d024c45920d16e888ee5d3cf47c66e316210bc236d5bebc42b3 \ + --hash=sha256:f28f8b2db7b86c77916829d64ab21ff49a9d8289ea1564a2b2a3a8ed9ffcccd3 \ + --hash=sha256:f3023e14805c61bc439fb40ca545ac3d5740ce66120a678a3c6c2c55b70343d1 \ + --hash=sha256:fdf348ae69c6ff484402cfdb14e18c1b0054ac2420079d575c53a60b9b2853ae + # via + # grpcio-tools + # robotframework-browser +grpcio-tools==1.63.0 \ + --hash=sha256:0ca6d5623dadce66fabbd8b04d0572e35fd63b31f1ae7ea1555d662864852d33 \ + --hash=sha256:0f8ce3fc598886a5370f28c86f94d06ddb0d3a251101a5bb8ed9576d9f86a519 \ + --hash=sha256:1ab17460a2dfd3433af3120598bc18e705e3092d4d8396d3c06fe93deab19bbb \ + --hash=sha256:1b88be61eaa41eb4deb6b91a1e21d2a789d8567f0a973694fa27c09196f39a9a \ + --hash=sha256:2474cffbc8f29404f0e3a2109c0a0423211ba93fe048b144e734f601ff391fc7 \ + --hash=sha256:27684446c81bffcd4f20f13bf672ac7cbeaefbd270b3d867cdb58132e4b866bc \ + --hash=sha256:2924747142ebcbbd62acf65936fbc9694afbdfc2c6ae721461015370e27b8d6f \ + --hash=sha256:32247ac2d575a633aea2536840fd232d56f309bd940081d772081bd71e0626c6 \ + --hash=sha256:376136b9bbd16304a2e550ea0bb2b3340b720a0f623856124987845ef071d479 \ + --hash=sha256:3ef50fa15689f46a2c903f1c9687aa40687d67dcb0469903fff37a63e55f11cd \ + --hash=sha256:3f138c822090e7c87ef6a5dce0a6c4fdf68a9472e6a936b70ac7be2371184abe \ + --hash=sha256:409613bb694308a1945256d1d05c3ef3497f9fbf7fd68bd8bed86d80d97df334 \ + --hash=sha256:4374c8beefec84f682c799b8df5ac4b217c09de6d69038ce16fc12dcd862fff8 \ + --hash=sha256:49404876ec70bdae431eac5b1591c32c0bba4047dfd96dc6add03dbcdad5a5fc \ + --hash=sha256:49435413548e019921e125b178f3fd30543aa348c70775669b5ed80f0b39b393 \ + --hash=sha256:49af114fed0075025fe243cb3c8405c7a99f0b87f4eb7ccdaaf33ce1f55d8318 \ + --hash=sha256:517ed2b405793e55c527f332296ae92a3e17fdd83772f1569709f2c228acaf54 \ + --hash=sha256:54136ac94eabc45b1b72d5ca379e5a2753f21a654f562838c5a9b706482bc1f0 \ + --hash=sha256:632f78d8730d39363fc5afaf7cb5cf2f56b4e346ca11f550af74cff85e702f79 \ + --hash=sha256:63a975d0457b2db1ee19fe99806091c71ad22f6f3664adc8f4c95943684dc0fd \ + --hash=sha256:6bbf51f334452fcac422509979635f97e2c2c3e71f21480891f2ba280b4b6867 \ + --hash=sha256:711d9f038c18c2f637b89af70c485018ae437dff5f7d2c631ca6a1eee7563038 \ + --hash=sha256:744952a560fdb060a5f9d467d130fde6dbfee2abb07143c87e9b17aae3c19d5a \ + --hash=sha256:7cbf570f7b9badd3bd27be5e057ca466d447c1047bf80c87a53d8bcb2e87bbbe \ + --hash=sha256:8341846604df00cf1c0a822476d27f4c481f678601a2f0b190e3b9936f857ded \ + --hash=sha256:847ca8d75090d66e787576049500eb7c230a9997146d5d433da7928baf914273 \ + --hash=sha256:94b52c0dfb6026f69858a10ee3eadf15c343667647b5846cace82f61fe809c88 \ + --hash=sha256:acb5cc845942dc0f020eefbe10ad8ac6fe2f96b99c035da738c5d3026d3a5324 \ + --hash=sha256:b2d246eee3b2a6afe65362c22a98b0e6d805c227c2569c5616ad3bec619621dd \ + --hash=sha256:b5d74a30409eda2a0cdaa700da23fe3cad5d7ac47ac2d52644abe13a84047aa0 \ + --hash=sha256:b61682c06f0bcf2c576537819c42d5fb8eec1a0a9c05c905005200a57ff54c1f \ + --hash=sha256:b87750347cb024bb74d5139da01ffba9f099ad2e43ba45893dc627ec920d57ab \ + --hash=sha256:bc0e6af05f66b36186ad3467d46ecc0f51dc9fa366005e095f4aa7739c7bfcba \ + --hash=sha256:c305274aa111412f5b8858242853e56c16ebcedc25d6a49ad615fd1b3ecd5971 \ + --hash=sha256:c63a0f37b6b64dc31b2f1a0e5f889ae8b6bb7b7b20fe2406c1285321a7c54fdd \ + --hash=sha256:c759306c04e3d0b3da3bd576e3de8bcbccc31a243a85ad256fd46d3a3ed93402 \ + --hash=sha256:cb9a0f61cabff426eaf5c0a506de599c9f006b31947ba1159254cc291c1dbdd1 \ + --hash=sha256:d58a5aacee102858e49b1cc89b1ba1a020bb04f001df057e2b03fa11e6c636d1 \ + --hash=sha256:d7142b0162834d3a67df532744a733b0757b11056373bd489a70dc07a3f65829 \ + --hash=sha256:df4dc9db9763594ae6ae04b42d6fcf7f163897a072f8fc946b864c9c3f0fbab1 \ + --hash=sha256:e197d5de49bb024f3d0b9e1ee1a0cce9e39955e17738bfbed72b0cc506a4824c \ + --hash=sha256:e68d9df9134906cbab1b225b625e11a368ab01b9ff24a4546bddec705ec7fd66 \ + --hash=sha256:e952835e7b8f40204bceb2a96fc7bcb8b07ff45ca9d07266774bc429db1efead \ + --hash=sha256:f2cc0b3098ff48811ca821440e03763dcabd11158a11d9ea819c58938a9ea276 \ + --hash=sha256:f305a5d61613e7ea3510eab62d65d47dff5206fcbe3b2347a7c1ebc9eff23dc6 \ + --hash=sha256:f74a6da9db48296c3e7e34820e96744a0ea9cd58c3fa075ed206f7bb75229324 + # via robotframework-browser +overrides==7.7.0 \ + --hash=sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a \ + --hash=sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49 + # via robotframework-browser +protobuf==5.26.1 \ + --hash=sha256:38aa5f535721d5bb99861166c445c4105c4e285c765fbb2ac10f116e32dcd46d \ + --hash=sha256:3c388ea6ddfe735f8cf69e3f7dc7611e73107b60bdfcf5d0f024c3ccd3794e23 \ + --hash=sha256:7ee014c2c87582e101d6b54260af03b6596728505c79f17c8586e7523aaa8f8c \ + --hash=sha256:8ca2a1d97c290ec7b16e4e5dff2e5ae150cc1582f55b5ab300d45cb0dfa90e51 \ + --hash=sha256:9b557c317ebe6836835ec4ef74ec3e994ad0894ea424314ad3552bc6e8835b4e \ + --hash=sha256:b9ba3ca83c2e31219ffbeb9d76b63aad35a3eb1544170c55336993d7a18ae72c \ + --hash=sha256:d693d2504ca96750d92d9de8a103102dd648fda04540495535f0fec7577ed8fc \ + --hash=sha256:da612f2720c0183417194eeaa2523215c4fcc1a1949772dc65f05047e08d5932 \ + --hash=sha256:e6039957449cb918f331d32ffafa8eb9255769c96aa0560d9a5bf0b4e00a2a33 \ + --hash=sha256:f7417703f841167e5a27d48be13389d52ad705ec09eade63dfc3180a959215d7 \ + --hash=sha256:fbfe61e7ee8c1860855696e3ac6cfd1b01af5498facc6834fcc345c9684fb2ca + # via + # grpcio-tools + # robotframework-browser +robotframework==7.1 \ + --hash=sha256:23b4c80e0079e512fb3322fd1505a2cfc4ab054903ce96c121c215034bd5c7fc \ + --hash=sha256:34796d387e182b36f05d82f3bbc802bd6a30192ebf1e03c76d2086d0d04faaff + # via + # -r requirements.in + # robotframework-assertion-engine + # robotframework-browser +robotframework-assertion-engine==3.5.0 \ + --hash=sha256:718d0f3f69edde48ab9d601b9d3e792ac52d1adfa790642a788ea09f96d5afa8 \ + --hash=sha256:793c65411b5172380476d259d838917a08cc87d7d4d18d8eae59d3b824ccde1b + # via robotframework-browser +robotframework-browser==18.4.0 \ + --hash=sha256:16d0f0ad5c7c213af954e83b3567bcfe38a5d562f21f92044acca37d7087ceba \ + --hash=sha256:56b7458eb07b37741affb3a8721a98ca188c5666f179b1397b8df9650fa199d2 + # via -r requirements.in +robotframework-pythonlibcore==4.6.0 \ + --hash=sha256:c45acbdf781b35a5cbac8e1c019fedab87d99f34ff29a6c99b774fbd95313f27 \ + --hash=sha256:db8d707961a0b83a5497d9c02b8919805e47b73907d0a588c79593518dc133a7 + # via + # robotframework-assertion-engine + # robotframework-browser +setuptools==84.2.0 \ + --hash=sha256:6f445ca2ce864605f81e223f262b4c94ffcb9a4a63473bae0ed7be5aab0291da \ + --hash=sha256:8cc107ac7a403105dc8d6477664171f36135fab26adf8b5e0edaebc313f39b21 + # via grpcio-tools +typing-extensions==4.16.0 \ + --hash=sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8 \ + --hash=sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5 + # via robotframework-browser +wrapt==2.5.1 \ + --hash=sha256:016602dd8827d190280a707c5e67f9a80038f54bac1782cc8ff68a2a16c618bc \ + --hash=sha256:03aa7d2256309b57ddbf317bff2cae5f47e50ea9ae8d582780ebe0b554347b42 \ + --hash=sha256:051220e5071fdfb1a6678707c8abb7bbf4824d40f99758394b2b4d64855fb284 \ + --hash=sha256:0591e6eace0d186c9ef1ecd1244be5a04e98041424cfca425b684ffe4f0d8030 \ + --hash=sha256:05f6138d5833edf68d88f950ea71bd96daf0a9505b53abd48aa002a0b6d05765 \ + --hash=sha256:06740dbf984af8a26d4b63b75a6ee4e88846c068dc865486ad906448079f50d4 \ + --hash=sha256:094b847491b813b6e6c1775e03770930d75078c0821adf929ac712830951ef25 \ + --hash=sha256:09b1893ee4063706574c1813abf479b8b51926633fbdb6f96aab8dc7b0976668 \ + --hash=sha256:0a526227efe17dd94bd16b123d170f879bce42c15f10eb92495a745f54caa943 \ + --hash=sha256:0c9480bdee340a1602cae5a777146ab4be3e384fdcb569fffdf8721032314645 \ + --hash=sha256:129cab3c7b21e68e693c2819a95c47f3b1c41a834b931154688c83b6aef6bdab \ + --hash=sha256:12bee472452019706fa1d4ead093f52a9683b4fe6617953e15bab9acdfdc013f \ + --hash=sha256:12d3d2b9d6553df6e2421ab99e1cc5413509076788f57fcb3169f5ce100a19d1 \ + --hash=sha256:1425fcf0e70b27053bd610d57bae975856e7897e3f6ba1456d2b80b9d7fd15d1 \ + --hash=sha256:183bf0bb893f783c9d22f953cb01fababb9f618e098763f8e66337b575b0647a \ + --hash=sha256:1910be5adc0232cc6e8c0673bf3f41c2ee724547543526bed8d00734458e7bc5 \ + --hash=sha256:1a96e2671c60f9f09ae547b5a815cecb29af16caa68d73693387d0028788cb32 \ + --hash=sha256:22300c5f254627f24ad2197998fde26db6eacbb0f879162944bf7bd79dd5ee5b \ + --hash=sha256:22a9fda6ac53536ec74e3e334f3568af2535a3df1ae70e8f2816f77160c386d9 \ + --hash=sha256:25eb4d928a9abeaf70ca786a35861b46d1ab37cc4ce49ea70a070dacdead4dfe \ + --hash=sha256:25ed8b1b39234140d5b5c6a273130c7595e0abece417c3ca3cb378fcea5cd0fe \ + --hash=sha256:26313f38d18d40a9975123a4ebff9da125ec63ab9ece4f05320a3d8d37d2c1fe \ + --hash=sha256:26d8ea2ec6818aeb656bd8a9e745a6f1fb0edfcd8f54291ccd94f62eb5f5e3bd \ + --hash=sha256:29b62e87fcd6a1893f669abfd02a596a7fc5cfa79fa57e42c4e650a6c170c67b \ + --hash=sha256:2c642a83b6703804b571caa3b8b205aacd341b1b37e2b2d89cd70e03e0e9caa6 \ + --hash=sha256:36d7d0ad593c4f1a651e4032de834db59aee1a929ee396cd483895b673328e51 \ + --hash=sha256:380f72610181883f66b41442cfc7c0f7552b42169efb2113def26e6380013d37 \ + --hash=sha256:3cf273b7e8d2038abb7f0a8c6550aff4f617b9d486a9965c8e8acc96a3a04de9 \ + --hash=sha256:3f93ceb0ac4896de45d5a45a8f4e69474da583440589de10b362ddc1db4691ed \ + --hash=sha256:4b3f410c416752e1dba53d361e2e6562f22c2c3ec855740dfa5836e061b22571 \ + --hash=sha256:521bd5ef2a33171fac08a0a302d51a983c19c3519406c1ee8da7ce29285488da \ + --hash=sha256:5ad562c23e61e626f9d27aa37aa5679f1c29085de1f998466d107854048bba9e \ + --hash=sha256:5b53000b424dc2133eaaf22838a2352d3497f5d7c2e7d9a2acfe675ab7225bb1 \ + --hash=sha256:5be9816d9de88f02fce23cf55f392403411d9bd9c7ae57fdc965a43b22e2de5e \ + --hash=sha256:6201c7e122f40060a9b50696d80deec8f93b1a235ec0443f51d7a8a42f7044a6 \ + --hash=sha256:6405ff2160af9d59132ebb076eda0304db44d9d09809582932412ef7c0788a36 \ + --hash=sha256:69fd0fbb3daf7c8c6f5e062847a0061f880f347374d74cf1daba57220fb64cd0 \ + --hash=sha256:6e3eff05ae616671b40d7ad0a504210329e4adc9fb91415663570aca93c5f5cc \ + --hash=sha256:711e73da3d7983547fc9dd208973b6b0c52640822f5d477910ba24622df6ba64 \ + --hash=sha256:729d644b6acaf4846a4ef81b037857b66a01dea6d227f827c6d71c0b6d656d6c \ + --hash=sha256:736c1de0230c6d24327b14684794214167b2c5ebb6332e28a10f504641b600df \ + --hash=sha256:76f230a9b07e3cb66646d265398f579abb6128b1bb4cb97c74b1ae5d09e96f31 \ + --hash=sha256:7fa321270b40f3e8cdfd954b3a8dcafc6db1d8bbd4d681b92dfa6b9ef91a9a99 \ + --hash=sha256:8078186f719a92693199f1e06c4ec72e1e6d374c2e459da18ed5c39d6966d727 \ + --hash=sha256:859f67bfc31eb7ab55f237b629cd4ab0441b075912446481f910f7d02066811e \ + --hash=sha256:8922821f66ec08a39f72247776c6158db5bfaa09d0c8f607cd854bdf6b2a2c10 \ + --hash=sha256:89d9a8607b7028054bb6fd01d437f205534a5d59d53c3665d15949a99a2fce0d \ + --hash=sha256:8a7c078323e6e1534968cb85488c5eb7ee2b9bbd0f8a291095213a763da40dab \ + --hash=sha256:8bdf4696fb5bb141a7f96710ac6d9a6aa9a57a14c54075f9c7d3946869d457df \ + --hash=sha256:920f700ef41ee774a1e4778c1f4295e117f1ff3435a7e0cd3e997d10da819d32 \ + --hash=sha256:9a34640eb6295f33ca23462977de275fe8f3a50ab339b8918b96d69a7451e2e1 \ + --hash=sha256:9aa7660684d73925c0d1e4f8536ccbaf233cef3897e33a8c2ec462f83b338323 \ + --hash=sha256:9bad4dbb4e61624fcce5f301e37f9e743ecae4f1259a3777b3207eb7eba3dccd \ + --hash=sha256:9bc472825027b276d4bf678d2ac64149db0b122f80ae6f59c423e6d31f0c4bb7 \ + --hash=sha256:9f0750cbc2e29e4f3c9529d3587d4e7ed8f60638ceafb80b87a95833b0c5acd9 \ + --hash=sha256:9f437dd704abc4ee1bd03bb2d796d362d0e75915e8f3113a7900b3b7ec5f8b47 \ + --hash=sha256:a18e63910252eb75d8806b4baefbc3a03612502f63eab042e3741b00b719f043 \ + --hash=sha256:a1e823aecb3746b8f9e0aee2e1413887871ee2f5c502a3e0ef8d466dbd4adde1 \ + --hash=sha256:a424e8a9776c06aef6313af1d0e3fe6e0838af4241d0c09eb0a3b46f2c9a5ff3 \ + --hash=sha256:a88370a7d89fcb1c4953a87673fdd7b4a0eb14a1a4dfce49771f0c827ef44893 \ + --hash=sha256:ab6db7d2a18d366cc57c2228253cf26443190aba0a6dd0939b3c1e8ac6e29e2c \ + --hash=sha256:ad81bf81b0a0b6c6ec74169638202851962843e86749570c463eecc55072f93b \ + --hash=sha256:aed178902c2386d7c5d3d23eb96d32c100e34cb8c2390e7ece0e4901ae43f0e7 \ + --hash=sha256:b0c82c19baca8ddeb4f513f584f53f6d3aa96b1a273f1a507d6d70620b01ba92 \ + --hash=sha256:b238e955ba34ef2b8897f358b7b868b41b9a02ffd338014b62985fa91898cc4a \ + --hash=sha256:b40f814df9e106371fea48911814383284e99df34ec1aa1fdd9b07d2055345d0 \ + --hash=sha256:b40fb47d637df8da7b02d76f242688416c23e53195ea5748895db671c01759d2 \ + --hash=sha256:bc5c0203d383403043fb86c964bd0bab4fcbfb26004ff4bb9c6d02ebc1d608ae \ + --hash=sha256:bde5d1b37101b1e9dd3da1f35072e2e7028e9c5e3511f7d76d3fdd4d071b7663 \ + --hash=sha256:bfaa998ceeea4d0aa72b40cdd0023d19409504e244b439ff2aa9f01729341c5f \ + --hash=sha256:c25c594f58ecb676358d6d6b0ff068b8bbbc506dc831c6d17876460c66ce39c2 \ + --hash=sha256:c39c7130ea0702c4ab0faf12da1df1e02d5174305c17edf02309e2f058c4114f \ + --hash=sha256:c40f3b1cd3ff9dd9f4ae829e4301f0d3a553e3467058b8c3f5528fee2c768a20 \ + --hash=sha256:c44dd9881626da7d621c23805f26726f6b023cf3e9755f48d092bc9cbef4a8e7 \ + --hash=sha256:c4d9c76e9a16a8bae0bdcc57efabad499192565bd9a95258b01fb0b49a62bd63 \ + --hash=sha256:c6e6c226b1ca5402d7ae5fb34a0d21f1b49124fe4200e5884d1e19e53c47ac1d \ + --hash=sha256:ca7b967e96384abdf7e7182c79f71529997981ece8169f8a8ddb31bc5b57cbec \ + --hash=sha256:cab37b82ec328173222e4f9da5eec4f2ec9e8e506f83557c8be8e1bffad351cc \ + --hash=sha256:ce3889e3815f97d46414eb574bffdd9bdb41ff70f503097e2707615a87d4e92c \ + --hash=sha256:cef2a8f006410b6134a0d273ec037fea8cc7a6a914f1bd7555ad9788ad788c6e \ + --hash=sha256:cf63fffcdcd8c60f223d3967bb92cc4fc2e8b46f09e75b67a6a75e6f47c0fc43 \ + --hash=sha256:d5b665a43fe0d3b390cbdd3c003d61c92fa07bd5e3fb1ed3f47920c2d03cd9fd \ + --hash=sha256:d6d274ec50a5b208be75596dc44ea253e65deaa6ee3a600babc86dafbb957dfc \ + --hash=sha256:d800c7689154622b0ba2922ceca44a3cf2ef61c3b9a4c4eeb1d8b3050d7ededa \ + --hash=sha256:d90c91cb4ef83b2ff00db4e0a7bdd9602902504ef9b26d0f9d7ecf6cd05c7554 \ + --hash=sha256:da42395e7add724c1f7caf18a2977b1fbdfd5aab314e5622731f0ed66731eaaf \ + --hash=sha256:da847332447db5505162759a4cd5ac374eb8b74841fe97a98ef3de14edd2586d \ + --hash=sha256:dc401274fcc7b15b3b2c12df2ff34024a11925243a7d3daee91c6d7d14f9addf \ + --hash=sha256:df6e3a36170cda0d313be50fe5065948e7f12f3a181b38cbc262e9f2ee4824e1 \ + --hash=sha256:e089a22ff5af1290b8c759a610830bdb2a829ef9c3d7797e4ee32c2f795ed482 \ + --hash=sha256:e85a9db9e5a5ccc326edb19e35a5106ba16e451d570a2ec8ea9deb1ea52a3c42 \ + --hash=sha256:ea27bcf5c56b13463ba5b9bbfa4d6544997e47ba6db77c59a259b09daa802d4d \ + --hash=sha256:f063c696328408fc4f259b9d7d439398d36b709e12445a904e7b047f0a84c3c5 \ + --hash=sha256:f1630201b0e2a96bb26304b7adfbd91a4ef486abb5a4c48377444a0bed749f37 \ + --hash=sha256:f1c911818fb076910ef509f2298dfcb966a54a6ff068eebd459632102cf589fb \ + --hash=sha256:f280c115ea64eff3dcbd68a668ce3f63476a4ba386bbabb318017e286196ea2c \ + --hash=sha256:f595bb0185aab3e9dc31950c95d914f56ea8278810c3b928f3426e12ed6d27bc \ + --hash=sha256:f98eaf784cd12bc69c77af398084174531007cd81849c962163ccfc6e791f3ea \ + --hash=sha256:fc0eb73b450b53950b7879ac7642889c82918d17bd2d877fd7270348dfd5550c \ + --hash=sha256:fcccaa1484f7dd1091602970988ab741491f9f974013c844f70e45ac1196b80d \ + --hash=sha256:fd3f878a4aac3c262447ddf43c5f4c18fc67dfc3ba69c4fb1c7a4c4af96abe7e + # via robotframework-browser diff --git a/tests/bstack_test_checkout_flow.robot b/tests/bstack_test_checkout_flow.robot index e598859..1cb2d10 100644 --- a/tests/bstack_test_checkout_flow.robot +++ b/tests/bstack_test_checkout_flow.robot @@ -43,6 +43,8 @@ BStackDemo Test Checkout Flow # checkout Click id=checkout-shipping-continue + Wait For Elements State id=confirmation-message visible timeout=15s + Get Text id=confirmation-message == Your Order has been successfully placed. Wait For Elements State xpath=//*[normalize-space()='Continue'] visible timeout=15s Click xpath=//*[normalize-space()='Continue'] Wait For Elements State xpath=//*[normalize-space()='Orders'] visible timeout=15s From 5e62218eeb6912cef0536d9cf7c2d5f3816f6df7 Mon Sep 17 00:00:00 2001 From: Mihir Rawool Date: Wed, 28 Oct 2026 02:48:54 +0530 Subject: [PATCH 3/6] LTS-5442: rewrite browserstack-load.yml in the CLI schema The yml was copied from the backend's bundled zip, which uses the backend's internal shape (loadTestName, framework: playwright-robot, loadProfileStages with startVUs/targetVUs, "1m 30s" durations). browserstack-cli rejects those keys. Use the CLI shape instead: testName, testType/framework/language per the CLI's robot sample, loadProfile.stages with from/to, and no-space durations. Verified with `browserstack-cli load run`: passed, both thresholds passed. Co-Authored-By: Claude Opus 5.5 --- browserstack-load.yml | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/browserstack-load.yml b/browserstack-load.yml index 880b2fa..5517e48 100644 --- a/browserstack-load.yml +++ b/browserstack-load.yml @@ -1,6 +1,8 @@ projectName: Robot Framework Playwright Load Testing Sample -loadTestName: robot-playwright-sample -framework: playwright-robot +testName: robot-playwright-sample +testType: Playwright +framework: robot +language: python files: dependencies: - requirements.txt @@ -24,21 +26,21 @@ thresholds: failOnBreach: false headless: true vus: 2 -duration: 1m 50s regions: - loadzone: eu-central-1 percent: 100 -loadProfile: ramping -loadProfileStages: - - duration: 10s - startVUs: 0 - targetVUs: 2 - type: ramp-up - - duration: 1m 30s - startVUs: 2 - targetVUs: 2 - type: hold - - duration: 10s - startVUs: 2 - targetVUs: 0 - type: ramp-down +loadProfile: + type: ramping + stages: + - type: ramp-up + duration: 10s + from: 0 + to: 2 + - type: hold + duration: 1m30s + from: 2 + to: 2 + - type: ramp-down + duration: 10s + from: 2 + to: 0 From f670019e22b766ed301a5b74832cb71269b3ca42 Mon Sep 17 00:00:00 2001 From: Mihir Rawool Date: Wed, 28 Oct 2026 15:53:26 +0530 Subject: [PATCH 4/6] LTS-5442: re-trigger CI after re-enabling the Semgrep workflow Co-Authored-By: Claude Opus 5.5 From 680d0f106d52ebba8a2a5db9eecd3cd6273220e9 Mon Sep 17 00:00:00 2001 From: Mihir Rawool Date: Wed, 28 Oct 2026 15:55:23 +0530 Subject: [PATCH 5/6] LTS-5442: set min-release-age in .npmrc (Semgrep npm-missing-minimum-release-age) Matches the playwright and webdriverio samples: npm refuses package versions published less than 7 days ago, which blunts freshly-hijacked releases. Co-Authored-By: Claude Opus 5.5 --- .npmrc | 1 + 1 file changed, 1 insertion(+) diff --git a/.npmrc b/.npmrc index 96780a5..010edf0 100644 --- a/.npmrc +++ b/.npmrc @@ -4,3 +4,4 @@ save-exact=true engine-strict=true legacy-peer-deps=false audit-level=high +min-release-age=7 From cc99335f65a9bf192c506ad9db11e5c3eb690231 Mon Sep 17 00:00:00 2001 From: Mihir Rawool Date: Tue, 27 Oct 2026 20:52:38 +0530 Subject: [PATCH 6/6] LTS-5442: pin the Semgrep image by digest LTS-5546: pull returntocorp/semgrep:1.166.0 by its immutable digest, the same pin as the other load-testing samples. The Actions steps in this workflow were already SHA-pinned. Co-Authored-By: Claude Opus 5.5 --- .github/workflows/Semgrep.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Semgrep.yml b/.github/workflows/Semgrep.yml index e857756..17ceac4 100644 --- a/.github/workflows/Semgrep.yml +++ b/.github/workflows/Semgrep.yml @@ -27,7 +27,7 @@ jobs: container: # A Docker image with Semgrep installed. Do not change this. - image: returntocorp/semgrep:1.166.0 + image: returntocorp/semgrep:1.166.0@sha256:c180f0c93a17b420c0af5006214a29d3c747c5459c732b740191adf657dd0068 # Skip any PR created by dependabot to avoid permission issues: if: (github.actor != 'dependabot[bot]')