summaryrefslogtreecommitdiffstats
path: root/testing/condprofile/condprof/helpers.py
diff options
context:
space:
mode:
Diffstat (limited to 'testing/condprofile/condprof/helpers.py')
-rw-r--r--testing/condprofile/condprof/helpers.py110
1 files changed, 110 insertions, 0 deletions
diff --git a/testing/condprofile/condprof/helpers.py b/testing/condprofile/condprof/helpers.py
new file mode 100644
index 0000000000..befe9e0331
--- /dev/null
+++ b/testing/condprofile/condprof/helpers.py
@@ -0,0 +1,110 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+""" Helpers to build scenarii
+"""
+from condprof.util import logger
+
+_SUPPORTED_MOBILE_BROWSERS = "fenix", "gecko", "firefox"
+
+
+def is_mobile(platform):
+ return any(mobile in platform for mobile in _SUPPORTED_MOBILE_BROWSERS)
+
+
+class TabSwitcher:
+ """Helper used to create tabs and circulate in them."""
+
+ def __init__(self, session, options):
+ self.handles = None
+ self.current = 0
+ self.session = session
+ self._max = options.get("max_urls", 10)
+ self.platform = options.get("platform", "")
+ self.num_tabs = self._max >= 100 and 100 or self._max
+ self._mobile = is_mobile(self.platform)
+
+ async def create_windows(self):
+ # on mobile we don't use tabs for now
+ # see https://bugzil.la/1559120
+ if self._mobile:
+ return
+ # creating tabs
+ for i in range(self.num_tabs):
+ # see https://github.com/HDE/arsenic/issues/71
+ await self.session._request(
+ url="/window/new", method="POST", data={"type": "tab"}
+ )
+
+ async def switch(self):
+ if self._mobile:
+ return
+ try:
+ if self.handles is None:
+ self.handles = await self.session.get_window_handles()
+ self.current = 0
+ except Exception:
+ logger.error("Could not get window handles")
+ return
+
+ handle = self.handles[self.current]
+ if self.current == len(self.handles) - 1:
+ self.current = 0
+ else:
+ self.current += 1
+ try:
+ await self.session.switch_to_window(handle)
+ except Exception:
+ logger.error("Could not switch to handle %s" % str(handle))
+
+
+# 10 minutes
+_SCRIPT_TIMEOUT = 10 * 60 * 1000
+
+
+async def execute_async_script(session, script, *args):
+ # switch to the right context if needed
+ current_context = await session._request(url="/moz/context", method="GET")
+ if current_context != "chrome":
+ await session._request(
+ url="/moz/context", method="POST", data={"context": "chrome"}
+ )
+ switch_back = True
+ else:
+ switch_back = False
+ await session._request(
+ url="/timeouts", method="POST", data={"script": _SCRIPT_TIMEOUT}
+ )
+ try:
+ attempts = 0
+ while True:
+ try:
+ return await session._request(
+ url="/execute/async",
+ method="POST",
+ data={"script": script, "args": list(args)},
+ )
+ except Exception as e:
+ attempts += 1
+ logger.error("The script failed.", exc_info=True)
+ if attempts > 2:
+ return {
+ "result": 1,
+ "result_message": str(e),
+ "result_exc": e,
+ "logs": {},
+ }
+ finally:
+ if switch_back:
+ await session._request(
+ url="/moz/context", method="POST", data={"context": current_context}
+ )
+
+
+async def close_extra_windows(session):
+ logger.info("Closing all tabs")
+ handles = await session.get_window_handles()
+ # we're closing all tabs except the last one
+ for handle in handles[:-1]:
+ await session.switch_to_window(handle)
+ await session._request(url="/window", method="DELETE")