Skip to content

browserstack_integration

BrowserStackDriverFactory

Source code in libs\cafex_ui\src\cafex_ui\web_client\browserstack_integration.py
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
class BrowserStackDriverFactory:
    def __init__(self) -> None:
        self.exceptions = CoreExceptions()
        self.web_driver: "WebDriver" = None
        self.bs_local = None
        self.logger = CoreLogger(name=__name__).get_logger()
        self.obj_config = ConfigUtils()

    def create_browserstack_webdriver(
            self, browserstack_username: str, browserstack_access_key: str,
            browser_options: object | list
    ) -> WebDriver | Exception:
        """Create a remote webdriver session on BrowserStack.

        Examples:
            >> from cafex_ui import CafeXWeb
            >> CafeXWeb().create_browserstack_webdriver([{"browser": "chrome"}])

        Args:
            browserstack_username: The username for BrowserStack.
            browserstack_access_key: The access key for BrowserStack.
            browser_options: A dictionary containing browser options.

        Returns:
            WebDriver
        """
        try:
            self._start_browserstack_local(browserstack_access_key)
            self.web_driver, response = UISecurity().create_browserstack_webdriver(
                browserstack_username, browserstack_access_key, browser_options
            )
            details = json.loads(response)
            self.logger.info("Browserstack execution results: %s", details["public_url"])
            return self.web_driver
        except Exception as e:
            custom_exception_message = (
                "Exception in create_browserstack_webdriver method. Exception Details: %s",
                repr(e),
            )
            self.exceptions.raise_generic_exception(
                message=str(custom_exception_message),
                insert_report=True,
                trim_log=True,
                log_local=True,
                fail_test=False,
            )
            raise e

    def _get_data_from_browserstack_config_file(self) -> dict:
        """Get data from the BrowserStack configuration file."""

        browserstack_config_file = self.obj_config.base_config.get(
            "browserstack_config_file", "browserstack.yml"
        )
        bs_config = self.obj_config.read_browserstack_web_yml_file(browserstack_config_file)
        return bs_config

    def _start_browserstack_local(self, browserstack_access_key: str) -> None:
        """Start Browserstack Local Server if the execution is happening on
        BrowserStack and 'local' is set as 'true' in the configuration file.

        Examples:
            >> from cafex_ui import CafeXWeb
            >> CafeXWeb().start_browserstack_local(browserstack_access_key="your_access_key")

        Args:
            browserstack_access_key: The access key for BrowserStack.
        Returns:
            None
        """
        try:
            self.bs_local = Local()
            use_browserstack_local = False
            bs_config = self._get_data_from_browserstack_config_file()
            if "bstack:options" in bs_config.keys():
                if "local" in bs_config["bstack:options"]:
                    if str(bs_config["bstack:options"]["local"]).lower() == "true":
                        use_browserstack_local = True
            if use_browserstack_local and not self.bs_local.isRunning():
                bs_local_args = {
                    "key": browserstack_access_key,
                    "force": "true",
                    "onlyAutomate": "true",
                }
                self.bs_local = UISecurity().start_bs_local(self.bs_local, bs_local_args)
        except Exception as e:
            self.logger.exception("Error in start_browserstack_local method--> %s", str(e))

    def stop_browserstack_local(self):
        """Stop the Browserstack Local Server if it is running.

        Examples:
            >> from cafex_ui import CafeXWeb
            >> CafeXWeb().stop_browserstack_local()

        Returns:
            None
        """
        try:
            if self.bs_local is not None:
                if self.bs_local.isRunning():
                    self.bs_local.stop()
        except Exception as e:
            self.logger.exception("Error in stop_browserstack_local method--> %s", str(e))

    def get_browser_stack_browsers_list(
            self, browserstack_username: str, browserstack_access_key: str
    ) -> list | Exception:
        """Retrieve a list of browsers from BrowserStack.

        Examples:
            >> from cafex_ui import CafeXWeb
            >> browsers_list = CafeXWeb().get_browser_stack_browsers_list()

        Args:
            browserstack_username: The username for BrowserStack.
            browserstack_access_key: The access key for BrowserStack.

        Returns:
            List
        """
        try:
            browserstack_api_endpoint = "https://api.browserstack.com/automate/browsers.json"
            bs_config = self._get_data_from_browserstack_config_file()
            resultant_list = []
            if "use_random_browsers" in bs_config.keys():
                response = UISecurity().get_browser_stack_browsers_list(
                    browserstack_api_endpoint, browserstack_username, browserstack_access_key
                )
                if response.status_code == 200:
                    browsers_list = response.json()
                    for browser in browsers_list:
                        browser_dict = {
                            "browserName": browser["browser"].lower(),
                            "bstack:options": {
                                "os": browser["os"],
                                "osVersion": browser["os_version"],
                                "browserVersion": browser["browser_version"],
                            },
                        }
                        resultant_list.append(browser_dict)
                return resultant_list
            return resultant_list
        except Exception as e:
            self.logger.exception("Error in get_browser_stack_browsers_list method--> %s", str(e))
            return e

    def get_device_list_from_json(self, file_name: str) -> list:
        """Retrieve a list of devices from a JSON file.

        Examples:
            >> from cafex_ui import CafeXWeb
            >> devices_list = CafeXWeb().get_device_list_from_json("devices.json")

        Args:
            file_name: The file name which contains the list of devices.

        Returns:
            list: A list of devices with their names converted to lowercase.

        Raises:
            FileNotFoundError: If the specified file does not exist.
            IOError: If there is an error while reading the file.
            Exception: If the file is not in JSON format or any other exception occurs.
        """
        try:
            details = []
            if str(file_name).endswith(".json"):
                res_file_path = (
                        self.obj_config.get_browserstack_web_configuration_directory_path()
                        + os.sep
                        + file_name
                )
                with open(res_file_path, encoding="utf-8") as json_file:
                    json_data = json.load(json_file)
                for browser in json_data:
                    browser["browserName"] = browser["browserName"].lower()
                    details.append(browser)
                return details
            raise Exception("Given file is not in json format")
        except FileNotFoundError as exc:
            raise FileNotFoundError("The specified file does not exist.") from exc
        except IOError as exc:
            raise IOError("Error while reading the file.") from exc
        except Exception as e:
            self.logger.exception("Could not get device list from JSON--> %s", str(e))
            raise e

    def get_available_browsers(
            self, browsers_file: str, browserstack_username: str, browserstack_access_key: str
    ) -> dict:
        """Retrieve a randomly selected browser from a list of common browsers.

        Examples:
            >> from cafex_ui import CafeXWeb
            >> available_browser = CafeXWeb().get_available_browsers("browsers.json")

        Args:
            browsers_file: The file name which contains the list of browsers.
            browserstack_username: The username for BrowserStack.
            browserstack_access_key: The access key for BrowserStack.

        Returns:
            dict: A randomly selected available browser from the common devices list.

        Raises:
            ValueError: If no common browsers are found between client usage and BrowserStack lists.
        """
        try:
            client_intended_browsers = self.get_device_list_from_json(browsers_file)
            browser_stack_browsers = self.get_browser_stack_browsers_list(
                browserstack_username, browserstack_access_key
            )
            common_browsers = [
                browser for browser in browser_stack_browsers if browser in client_intended_browsers
            ]
            if not common_browsers:
                raise ValueError(
                    "No common browsers found between user list and BrowserStack list."
                )
            random_browser = random.choice(common_browsers)
            self.logger.info("Randomly selected browser: %s", random_browser)
            return random_browser
        except Exception as e:
            print("Error in get_available_browsers method--> %s", str(e))
            raise e

create_browserstack_webdriver(browserstack_username, browserstack_access_key, browser_options)

Create a remote webdriver session on BrowserStack.

Examples:

from cafex_ui import CafeXWeb CafeXWeb().create_browserstack_webdriver([{"browser": "chrome"}])

Parameters:

Name Type Description Default
browserstack_username str

The username for BrowserStack.

required
browserstack_access_key str

The access key for BrowserStack.

required
browser_options object | list

A dictionary containing browser options.

required

Returns:

Type Description
WebDriver | Exception

WebDriver

Source code in libs\cafex_ui\src\cafex_ui\web_client\browserstack_integration.py
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
def create_browserstack_webdriver(
        self, browserstack_username: str, browserstack_access_key: str,
        browser_options: object | list
) -> WebDriver | Exception:
    """Create a remote webdriver session on BrowserStack.

    Examples:
        >> from cafex_ui import CafeXWeb
        >> CafeXWeb().create_browserstack_webdriver([{"browser": "chrome"}])

    Args:
        browserstack_username: The username for BrowserStack.
        browserstack_access_key: The access key for BrowserStack.
        browser_options: A dictionary containing browser options.

    Returns:
        WebDriver
    """
    try:
        self._start_browserstack_local(browserstack_access_key)
        self.web_driver, response = UISecurity().create_browserstack_webdriver(
            browserstack_username, browserstack_access_key, browser_options
        )
        details = json.loads(response)
        self.logger.info("Browserstack execution results: %s", details["public_url"])
        return self.web_driver
    except Exception as e:
        custom_exception_message = (
            "Exception in create_browserstack_webdriver method. Exception Details: %s",
            repr(e),
        )
        self.exceptions.raise_generic_exception(
            message=str(custom_exception_message),
            insert_report=True,
            trim_log=True,
            log_local=True,
            fail_test=False,
        )
        raise e

get_available_browsers(browsers_file, browserstack_username, browserstack_access_key)

Retrieve a randomly selected browser from a list of common browsers.

Examples:

from cafex_ui import CafeXWeb available_browser = CafeXWeb().get_available_browsers("browsers.json")

Parameters:

Name Type Description Default
browsers_file str

The file name which contains the list of browsers.

required
browserstack_username str

The username for BrowserStack.

required
browserstack_access_key str

The access key for BrowserStack.

required

Returns:

Name Type Description
dict dict

A randomly selected available browser from the common devices list.

Raises:

Type Description
ValueError

If no common browsers are found between client usage and BrowserStack lists.

Source code in libs\cafex_ui\src\cafex_ui\web_client\browserstack_integration.py
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
def get_available_browsers(
        self, browsers_file: str, browserstack_username: str, browserstack_access_key: str
) -> dict:
    """Retrieve a randomly selected browser from a list of common browsers.

    Examples:
        >> from cafex_ui import CafeXWeb
        >> available_browser = CafeXWeb().get_available_browsers("browsers.json")

    Args:
        browsers_file: The file name which contains the list of browsers.
        browserstack_username: The username for BrowserStack.
        browserstack_access_key: The access key for BrowserStack.

    Returns:
        dict: A randomly selected available browser from the common devices list.

    Raises:
        ValueError: If no common browsers are found between client usage and BrowserStack lists.
    """
    try:
        client_intended_browsers = self.get_device_list_from_json(browsers_file)
        browser_stack_browsers = self.get_browser_stack_browsers_list(
            browserstack_username, browserstack_access_key
        )
        common_browsers = [
            browser for browser in browser_stack_browsers if browser in client_intended_browsers
        ]
        if not common_browsers:
            raise ValueError(
                "No common browsers found between user list and BrowserStack list."
            )
        random_browser = random.choice(common_browsers)
        self.logger.info("Randomly selected browser: %s", random_browser)
        return random_browser
    except Exception as e:
        print("Error in get_available_browsers method--> %s", str(e))
        raise e

get_browser_stack_browsers_list(browserstack_username, browserstack_access_key)

Retrieve a list of browsers from BrowserStack.

Examples:

from cafex_ui import CafeXWeb browsers_list = CafeXWeb().get_browser_stack_browsers_list()

Parameters:

Name Type Description Default
browserstack_username str

The username for BrowserStack.

required
browserstack_access_key str

The access key for BrowserStack.

required

Returns:

Type Description
list | Exception

List

Source code in libs\cafex_ui\src\cafex_ui\web_client\browserstack_integration.py
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
def get_browser_stack_browsers_list(
        self, browserstack_username: str, browserstack_access_key: str
) -> list | Exception:
    """Retrieve a list of browsers from BrowserStack.

    Examples:
        >> from cafex_ui import CafeXWeb
        >> browsers_list = CafeXWeb().get_browser_stack_browsers_list()

    Args:
        browserstack_username: The username for BrowserStack.
        browserstack_access_key: The access key for BrowserStack.

    Returns:
        List
    """
    try:
        browserstack_api_endpoint = "https://api.browserstack.com/automate/browsers.json"
        bs_config = self._get_data_from_browserstack_config_file()
        resultant_list = []
        if "use_random_browsers" in bs_config.keys():
            response = UISecurity().get_browser_stack_browsers_list(
                browserstack_api_endpoint, browserstack_username, browserstack_access_key
            )
            if response.status_code == 200:
                browsers_list = response.json()
                for browser in browsers_list:
                    browser_dict = {
                        "browserName": browser["browser"].lower(),
                        "bstack:options": {
                            "os": browser["os"],
                            "osVersion": browser["os_version"],
                            "browserVersion": browser["browser_version"],
                        },
                    }
                    resultant_list.append(browser_dict)
            return resultant_list
        return resultant_list
    except Exception as e:
        self.logger.exception("Error in get_browser_stack_browsers_list method--> %s", str(e))
        return e

get_device_list_from_json(file_name)

Retrieve a list of devices from a JSON file.

Examples:

from cafex_ui import CafeXWeb devices_list = CafeXWeb().get_device_list_from_json("devices.json")

Parameters:

Name Type Description Default
file_name str

The file name which contains the list of devices.

required

Returns:

Name Type Description
list list

A list of devices with their names converted to lowercase.

Raises:

Type Description
FileNotFoundError

If the specified file does not exist.

IOError

If there is an error while reading the file.

Exception

If the file is not in JSON format or any other exception occurs.

Source code in libs\cafex_ui\src\cafex_ui\web_client\browserstack_integration.py
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
def get_device_list_from_json(self, file_name: str) -> list:
    """Retrieve a list of devices from a JSON file.

    Examples:
        >> from cafex_ui import CafeXWeb
        >> devices_list = CafeXWeb().get_device_list_from_json("devices.json")

    Args:
        file_name: The file name which contains the list of devices.

    Returns:
        list: A list of devices with their names converted to lowercase.

    Raises:
        FileNotFoundError: If the specified file does not exist.
        IOError: If there is an error while reading the file.
        Exception: If the file is not in JSON format or any other exception occurs.
    """
    try:
        details = []
        if str(file_name).endswith(".json"):
            res_file_path = (
                    self.obj_config.get_browserstack_web_configuration_directory_path()
                    + os.sep
                    + file_name
            )
            with open(res_file_path, encoding="utf-8") as json_file:
                json_data = json.load(json_file)
            for browser in json_data:
                browser["browserName"] = browser["browserName"].lower()
                details.append(browser)
            return details
        raise Exception("Given file is not in json format")
    except FileNotFoundError as exc:
        raise FileNotFoundError("The specified file does not exist.") from exc
    except IOError as exc:
        raise IOError("Error while reading the file.") from exc
    except Exception as e:
        self.logger.exception("Could not get device list from JSON--> %s", str(e))
        raise e

stop_browserstack_local()

Stop the Browserstack Local Server if it is running.

Examples:

from cafex_ui import CafeXWeb CafeXWeb().stop_browserstack_local()

Returns:

Type Description

None

Source code in libs\cafex_ui\src\cafex_ui\web_client\browserstack_integration.py
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
def stop_browserstack_local(self):
    """Stop the Browserstack Local Server if it is running.

    Examples:
        >> from cafex_ui import CafeXWeb
        >> CafeXWeb().stop_browserstack_local()

    Returns:
        None
    """
    try:
        if self.bs_local is not None:
            if self.bs_local.isRunning():
                self.bs_local.stop()
    except Exception as e:
        self.logger.exception("Error in stop_browserstack_local method--> %s", str(e))