Skip to content

Commit f2f1378

Browse files
authored
Review (#3)
Co-authored-by: princeton, rathil and tanish
1 parent ba3be02 commit f2f1378

19 files changed

Lines changed: 1167 additions & 2 deletions

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
**.pyc

README.md

Lines changed: 342 additions & 2 deletions
Large diffs are not rendered by default.

docker-compose.yml

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
version: "3"
2+
services:
3+
chrome:
4+
image: selenium/node-chrome:4.0.0
5+
volumes:
6+
- /dev/shm:/dev/shm
7+
depends_on:
8+
- selenium-hub
9+
environment:
10+
- SE_EVENT_BUS_HOST=selenium-hub
11+
- SE_EVENT_BUS_PUBLISH_PORT=4442
12+
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
13+
- SCREEN_WIDTH=2880
14+
- SCREEN_HEIGHT=1800
15+
links:
16+
- selenium-hub:hub
17+
scale: 4
18+
19+
firefox:
20+
image: selenium/node-firefox:4.0.0
21+
volumes:
22+
- /dev/shm:/dev/shm
23+
depends_on:
24+
- selenium-hub
25+
environment:
26+
- SE_EVENT_BUS_HOST=selenium-hub
27+
- SE_EVENT_BUS_PUBLISH_PORT=4442
28+
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
29+
- SCREEN_WIDTH=2880
30+
- SCREEN_HEIGHT=1800
31+
links:
32+
- selenium-hub:hub
33+
scale: 4
34+
35+
selenium-hub:
36+
image: selenium/hub:4.0.0
37+
container_name: selenium-hub
38+
environment:
39+
- GRID_MAX_SESSION=50
40+
ports:
41+
- "4442:4442"
42+
- "4443:4443"
43+
- "4444:4444"

requirements.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
selenium
2+
robotframework==4.0
3+
robotframework-docker==1.1.0
4+
robotframework-pabot==1.10.1
5+
robotframework-selenium2library==3.0.0
6+
robotframework-seleniumlibrary==5.1.0
7+
robotframework-sshlibrary==3.6.0
8+
allure-robotframework==2.8.40

resources/conf/caps/test_caps.json

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
{
2+
"user": "BROWSERSTACK_USERNAME",
3+
"key": "BROWSERSTACK_ACCESS_KEY",
4+
"application_endpoint": "https://bstackdemo.com",
5+
"tests": {
6+
"parallel": {
7+
"common_caps": {
8+
"project": "browserstack-examples-robot",
9+
"build": "browserstack-examples-robot",
10+
"name": "Parallel Test",
11+
"browserstack.debug": "true",
12+
"browserstack.networkLogs": "true",
13+
"browserstack.console": "verbose"
14+
},
15+
"env_caps": [
16+
{
17+
"os": "Windows",
18+
"os_version": "10",
19+
"browser": "Internet Explorer",
20+
"browser_version": "11.0"
21+
},
22+
{
23+
"os": "Windows",
24+
"os_version": "10",
25+
"browser": "Chrome",
26+
"browser_version": "latest-1"
27+
},
28+
{
29+
"os": "OS X",
30+
"os_version": "Big Sur",
31+
"browser": "Chrome",
32+
"browser_version": "latest"
33+
},
34+
{
35+
"os": "OS X",
36+
"os_version": "Catalina",
37+
"browser": "Safari",
38+
"browser_version": "13.0"
39+
},
40+
{
41+
"os": "Android",
42+
"os_version": "11.0",
43+
"device": "Samsung Galaxy S20",
44+
"realMobile": true
45+
},
46+
{
47+
"os": "iPhone",
48+
"os_version": "13.0",
49+
"device": "iPhone XS",
50+
"realMobile": true
51+
}
52+
]
53+
},
54+
"single": {
55+
"common_caps": {
56+
"project": "browserstack-examples-robot",
57+
"build": "browserstack-examples-robot",
58+
"name": "Single Test",
59+
"chromeOptions": {
60+
"w3c" : "false"
61+
},
62+
"browserstack.maskCommands": "setValues"
63+
},
64+
"env_caps": [
65+
{
66+
"os": "Windows",
67+
"os_version": "10",
68+
"browser": "Chrome"
69+
}
70+
]
71+
},
72+
"local": {
73+
"application_env": "dev",
74+
"application_endpoint": "http://localhost:3000",
75+
"common_caps": {
76+
"project": "browserstack-examples-robot",
77+
"build": "browserstack-examples-robot",
78+
"name": "Local Test",
79+
"browserstack.debug": "true",
80+
"browserstack.networkLogs": "true",
81+
"browserstack.console": "verbose",
82+
"browserstack.local": "true",
83+
"browserstack.maskCommands": "setValues"
84+
},
85+
"env_caps": [
86+
{
87+
"os": "Windows",
88+
"os_version": "10",
89+
"browser": "Chrome"
90+
}
91+
]
92+
},
93+
"mobile": {
94+
"common_caps": {
95+
"project": "browserstack-examples-robot",
96+
"build": "browserstack-examples-robot",
97+
"name": "Mobile Parallel Test"
98+
},
99+
"env_caps": [
100+
{
101+
"device": "Google Pixel",
102+
"realMobile": true
103+
},
104+
{
105+
"device": "iPhone 11",
106+
"os_version": "13",
107+
"realMobile": true
108+
}
109+
]
110+
}
111+
}
112+
}

resources/conf/runners/Library.py

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
from browserstack.local import Local
2+
import json
3+
import csv
4+
import os
5+
from robot.libraries.BuiltIn import BuiltIn
6+
from selenium.webdriver.common.action_chains import ActionChains
7+
from selenium import webdriver
8+
from selenium.webdriver.chrome.options import Options
9+
from selenium.webdriver.common.keys import Keys
10+
import urllib3
11+
12+
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
13+
bstack_local = 0
14+
se2lib = BuiltIn().get_library_instance('SeleniumLibrary')
15+
16+
user_data = '../../data/user.csv'
17+
product_data = '../../data/product.csv'
18+
19+
def combine_dict(dict1, dict2):
20+
dict_1 = json.loads(str(dict1))
21+
dict_2 = json.loads(str(dict2))
22+
23+
dict_1.update(dict_2)
24+
25+
return dict_1
26+
27+
28+
def get_caps_single(caps_path, username, access_key):
29+
30+
with open(caps_path) as f:
31+
data = json.load(f)
32+
33+
single_caps_common = data['tests']['single']['common_caps']
34+
single_caps_env = data['tests']['single']['env_caps'][0]
35+
36+
single_caps_common.update(single_caps_env)
37+
single_caps_common['browserstack.user'] = username
38+
single_caps_common['browserstack.key'] = access_key
39+
40+
return single_caps_common
41+
42+
43+
def get_caps_local(caps_path, username, access_key):
44+
45+
with open(caps_path) as f:
46+
data = json.load(f)
47+
48+
caps_common = data['tests']['local']['common_caps']
49+
caps_env = data['tests']['local']['env_caps'][0]
50+
51+
caps_common.update(caps_env)
52+
caps_common['browserstack.user'] = username
53+
caps_common['browserstack.key'] = access_key
54+
55+
return caps_common
56+
57+
58+
def start_local(key):
59+
60+
global bstack_local
61+
bstack_local = Local()
62+
63+
bstack_local_args = {"key": key}
64+
65+
bstack_local.start(**bstack_local_args)
66+
67+
return bstack_local
68+
69+
70+
def stop_local():
71+
72+
global bstack_local
73+
74+
bstack_local.stop()
75+
76+
77+
def get_row_item_from_file(filepath, key):
78+
79+
dirname = os.path.dirname(__file__)
80+
filename = os.path.normpath(os.path.join(dirname, filepath))
81+
82+
with open(filename, 'r') as data:
83+
for line in csv.reader(data):
84+
if line[0] == key:
85+
return line[1]
86+
87+
88+
def get_password(username):
89+
90+
password = get_row_item_from_file(user_data, username)
91+
return password
92+
93+
94+
def get_product_prices():
95+
dirname = os.path.dirname(__file__)
96+
filename = os.path.normpath(os.path.join(
97+
dirname, product_data))
98+
99+
prices = []
100+
with open(filename, 'r') as data:
101+
for line in csv.reader(data):
102+
if line[3] != 'price':
103+
prices.append(int(line[3]))
104+
105+
prices = sorted(prices)
106+
107+
for i in range(0, len(prices)):
108+
prices[i] = str('$' + str(prices[i]) + '.00')
109+
110+
return prices
111+
112+
113+
def set_loc(lat, long):
114+
115+
global se2lib
116+
117+
se2lib.driver.execute_script(
118+
"navigator.geolocation.getCurrentPosition = function(cb){cb({ coords: {accuracy: 20,altitude: null,altitudeAccuracy: null,heading: null,latitude: " + lat + ",longitude: " + long + ",speed: null}}); }")
119+
se2lib.driver.execute_script(
120+
"window.navigator.geolocation.getCurrentPosition = function(cb){cb({ coords: {accuracy: 20,altitude: null,altitudeAccuracy: null,heading: null,latitude: " + lat + ",longitude: " + long + ",speed: null}}); }")
121+
122+
123+
def mark_test_session(result):
124+
global se2lib
125+
126+
if result == 'PASS':
127+
se2lib.driver.execute_script(
128+
'browserstack_executor: {"action": "setSessionStatus", "arguments": {"status":"passed","reason": "Test Ran Succesfully"}}')
129+
else:
130+
se2lib.driver.execute_script(
131+
'browserstack_executor: {"action": "setSessionStatus", "arguments": {"status":"failed","reason": "Oops! my sample test failed"}}')
132+
133+
134+
def set_session_name(new_name):
135+
global se2lib
136+
se2lib.driver.execute_script(
137+
'browserstack_executor: {"action": "setSessionName", "arguments": {"name": "' + new_name + '"}}')

0 commit comments

Comments
 (0)