setup-selenium-testing 0.1.1__py3-none-any.whl → 0.1.3__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- setup_selenium/selenium_module.py +53 -30
- {setup_selenium_testing-0.1.1.dist-info → setup_selenium_testing-0.1.3.dist-info}/METADATA +3 -6
- setup_selenium_testing-0.1.3.dist-info/RECORD +7 -0
- setup_selenium_testing-0.1.1.dist-info/RECORD +0 -7
- {setup_selenium_testing-0.1.1.dist-info → setup_selenium_testing-0.1.3.dist-info}/LICENSE +0 -0
- {setup_selenium_testing-0.1.1.dist-info → setup_selenium_testing-0.1.3.dist-info}/WHEEL +0 -0
@@ -1,10 +1,12 @@
|
|
1
|
+
"""Setup selenium for testing"""
|
2
|
+
|
1
3
|
from __future__ import annotations
|
2
4
|
|
3
5
|
import errno
|
4
6
|
import logging
|
5
7
|
import os as os
|
6
8
|
from enum import Enum
|
7
|
-
from typing import TYPE_CHECKING, Union
|
9
|
+
from typing import TYPE_CHECKING, Optional, Union
|
8
10
|
|
9
11
|
from selenium import webdriver
|
10
12
|
from selenium.common.exceptions import NoSuchWindowException, WebDriverException
|
@@ -12,7 +14,7 @@ from selenium.webdriver.chrome.service import Service as ChromeService
|
|
12
14
|
from selenium.webdriver.common.selenium_manager import SeleniumManager
|
13
15
|
from selenium.webdriver.edge.service import Service as EdgeService
|
14
16
|
from selenium.webdriver.firefox.service import Service as FirefoxService
|
15
|
-
from semantic_version import Version # type: ignore
|
17
|
+
from semantic_version import Version # type: ignore[import-untyped]
|
16
18
|
from typing_extensions import TypeAlias
|
17
19
|
|
18
20
|
if TYPE_CHECKING:
|
@@ -22,6 +24,9 @@ if TYPE_CHECKING:
|
|
22
24
|
from selenium.webdriver.common.options import ArgOptions
|
23
25
|
|
24
26
|
T_WebDriver: TypeAlias = Union[Firefox, Chrome, Edge]
|
27
|
+
T_DrvOpts: TypeAlias = Union[
|
28
|
+
webdriver.FirefoxOptions, webdriver.ChromeOptions, webdriver.EdgeOptions
|
29
|
+
]
|
25
30
|
|
26
31
|
__all__ = ["SetupSelenium"]
|
27
32
|
|
@@ -38,12 +43,11 @@ logger = create_logger("sel")
|
|
38
43
|
|
39
44
|
|
40
45
|
def set_logger(logr: logging.Logger) -> None:
|
41
|
-
"""
|
42
|
-
Set the global logger with a custom logger
|
43
|
-
"""
|
46
|
+
"""Set the global logger with a custom logger"""
|
44
47
|
# Check if the logger is a valid logger
|
45
48
|
if not isinstance(logr, logging.Logger):
|
46
|
-
|
49
|
+
msg = "logger must be an instance of logging.Logger"
|
50
|
+
raise TypeError(msg)
|
47
51
|
|
48
52
|
# Bind the logger input to the global logger
|
49
53
|
global logger # noqa: PLW0603
|
@@ -132,9 +136,7 @@ class SetupSelenium:
|
|
132
136
|
def make_screenshot_path(
|
133
137
|
output_dir: str = "./logs", screenshots: str = "screenshots"
|
134
138
|
) -> str:
|
135
|
-
"""
|
136
|
-
Set the output directory for where screenshots should go.
|
137
|
-
"""
|
139
|
+
"""Set the output directory for where screenshots should go."""
|
138
140
|
output_dir = os.path.abspath(os.path.expanduser(output_dir))
|
139
141
|
if os.path.split(output_dir)[-1].lower() != screenshots:
|
140
142
|
output_dir = os.path.join(output_dir, screenshots)
|
@@ -152,6 +154,7 @@ class SetupSelenium:
|
|
152
154
|
############################################################################
|
153
155
|
@staticmethod
|
154
156
|
def log_options(options: ArgOptions) -> None:
|
157
|
+
"""Logs the browser option in clean format"""
|
155
158
|
opts = "\n".join(options.arguments)
|
156
159
|
logger.debug(f"{opts}")
|
157
160
|
|
@@ -163,7 +166,7 @@ class SetupSelenium:
|
|
163
166
|
browser_path: str | None = None,
|
164
167
|
install_browser: bool = False,
|
165
168
|
) -> tuple[str, str]:
|
166
|
-
"""
|
169
|
+
"""Install the webdriver and browser if needed."""
|
167
170
|
browser = Browser[browser.upper()].lower()
|
168
171
|
driver_version = driver_version or None
|
169
172
|
|
@@ -203,19 +206,24 @@ class SetupSelenium:
|
|
203
206
|
log_dir: str = "./logs",
|
204
207
|
binary: str | None = None,
|
205
208
|
driver_path: str | None = None,
|
209
|
+
options: Optional[T_DrvOpts] = None,
|
206
210
|
) -> T_WebDriver:
|
211
|
+
"""Instantiates the browser driver"""
|
207
212
|
browser = browser.lower()
|
208
213
|
driver: T_WebDriver
|
209
214
|
if browser == Browser.FIREFOX:
|
215
|
+
assert options is None or isinstance(options, webdriver.FirefoxOptions)
|
210
216
|
driver = SetupSelenium.firefox(
|
211
217
|
headless=headless,
|
212
218
|
enable_log_driver=enable_log_driver,
|
213
219
|
log_dir=log_dir,
|
214
220
|
binary=binary,
|
215
221
|
driver_path=driver_path,
|
222
|
+
options=options,
|
216
223
|
)
|
217
224
|
|
218
225
|
elif browser == Browser.CHROME:
|
226
|
+
assert options is None or isinstance(options, webdriver.ChromeOptions)
|
219
227
|
driver = SetupSelenium.chrome(
|
220
228
|
headless=headless,
|
221
229
|
enable_log_performance=enable_log_performance,
|
@@ -224,9 +232,11 @@ class SetupSelenium:
|
|
224
232
|
log_dir=log_dir,
|
225
233
|
binary=binary,
|
226
234
|
driver_path=driver_path,
|
235
|
+
options=options,
|
227
236
|
)
|
228
237
|
|
229
238
|
elif browser == Browser.EDGE:
|
239
|
+
assert options is None or isinstance(options, webdriver.EdgeOptions)
|
230
240
|
driver = SetupSelenium.edge(
|
231
241
|
headless=headless,
|
232
242
|
enable_log_performance=enable_log_performance,
|
@@ -235,15 +245,18 @@ class SetupSelenium:
|
|
235
245
|
log_dir=log_dir,
|
236
246
|
binary=binary,
|
237
247
|
driver_path=driver_path,
|
248
|
+
options=options,
|
238
249
|
)
|
239
250
|
|
240
251
|
else:
|
241
|
-
|
252
|
+
msg = f"Unknown browser: {browser}"
|
253
|
+
raise ValueError(msg)
|
242
254
|
|
243
255
|
return driver
|
244
256
|
|
245
257
|
@staticmethod
|
246
258
|
def firefox_options() -> webdriver.FirefoxOptions:
|
259
|
+
"""Default options for firefox"""
|
247
260
|
options = webdriver.FirefoxOptions()
|
248
261
|
options.set_capability("unhandledPromptBehavior", "ignore")
|
249
262
|
|
@@ -261,8 +274,9 @@ class SetupSelenium:
|
|
261
274
|
log_dir: str = "./logs",
|
262
275
|
driver_path: str | None = None,
|
263
276
|
binary: str | None = None,
|
264
|
-
options: webdriver.FirefoxOptions = None,
|
277
|
+
options: webdriver.FirefoxOptions | None = None,
|
265
278
|
) -> webdriver.Firefox:
|
279
|
+
"""Instantiates firefox geockodriver"""
|
266
280
|
options = options or SetupSelenium.firefox_options()
|
267
281
|
if binary:
|
268
282
|
options.binary_location = binary
|
@@ -301,6 +315,7 @@ class SetupSelenium:
|
|
301
315
|
|
302
316
|
@staticmethod
|
303
317
|
def chrome_options() -> webdriver.ChromeOptions:
|
318
|
+
"""Default options for chrome"""
|
304
319
|
logger.debug("Setting up chrome options")
|
305
320
|
# The list of options set below mostly came from this StackOverflow post
|
306
321
|
# https://stackoverflow.com/q/48450594/2532408
|
@@ -332,8 +347,9 @@ class SetupSelenium:
|
|
332
347
|
log_dir: str = "./logs",
|
333
348
|
driver_path: str | None = None,
|
334
349
|
binary: str | None = None,
|
335
|
-
options: webdriver.ChromeOptions = None,
|
350
|
+
options: webdriver.ChromeOptions | None = None,
|
336
351
|
) -> webdriver.Chrome:
|
352
|
+
"""Instantiates chromedriver"""
|
337
353
|
options = options or SetupSelenium.chrome_options()
|
338
354
|
if binary:
|
339
355
|
options.binary_location = binary
|
@@ -374,12 +390,12 @@ class SetupSelenium:
|
|
374
390
|
service = ChromeService(
|
375
391
|
executable_path=driver_path,
|
376
392
|
service_args=args,
|
377
|
-
log_output=logpath,
|
393
|
+
log_output=logpath, # type: ignore[arg-type]
|
378
394
|
)
|
379
395
|
else:
|
380
396
|
service = ChromeService(
|
381
397
|
service_args=args,
|
382
|
-
log_output=logpath,
|
398
|
+
log_output=logpath, # type: ignore[arg-type]
|
383
399
|
)
|
384
400
|
|
385
401
|
driver = webdriver.Chrome(service=service, options=options)
|
@@ -405,6 +421,7 @@ class SetupSelenium:
|
|
405
421
|
|
406
422
|
@staticmethod
|
407
423
|
def set_throttle(driver: webdriver.Chrome):
|
424
|
+
"""Experimental settings to slow down browser"""
|
408
425
|
# experimental settings to slow down browser
|
409
426
|
# @formatter:off
|
410
427
|
# fmt: off
|
@@ -433,6 +450,7 @@ class SetupSelenium:
|
|
433
450
|
|
434
451
|
@staticmethod
|
435
452
|
def edge_options() -> webdriver.EdgeOptions:
|
453
|
+
"""Default options for edgedriver"""
|
436
454
|
logger.debug("Setting up edge options")
|
437
455
|
# The list of options set below mostly came from this StackOverflow post
|
438
456
|
# https://stackoverflow.com/q/48450594/2532408
|
@@ -447,8 +465,6 @@ class SetupSelenium:
|
|
447
465
|
# edgedriver crashes without these two in linux
|
448
466
|
"--no-sandbox",
|
449
467
|
"--disable-dev-shm-usage",
|
450
|
-
# it's possible we no longer need to do these
|
451
|
-
# "--disable-gpu", # https://stackoverflow.com/q/51959986/2532408
|
452
468
|
)
|
453
469
|
options = webdriver.EdgeOptions()
|
454
470
|
for opt in opts:
|
@@ -464,8 +480,9 @@ class SetupSelenium:
|
|
464
480
|
log_dir: str = "./logs",
|
465
481
|
driver_path: str | None = None,
|
466
482
|
binary: str | None = None,
|
467
|
-
options: webdriver.EdgeOptions = None,
|
483
|
+
options: webdriver.EdgeOptions | None = None,
|
468
484
|
) -> webdriver.Edge:
|
485
|
+
"""Instantiates edgedriver"""
|
469
486
|
options = options or SetupSelenium.edge_options()
|
470
487
|
if binary:
|
471
488
|
options.binary_location = binary
|
@@ -507,12 +524,12 @@ class SetupSelenium:
|
|
507
524
|
service = EdgeService(
|
508
525
|
executable_path=driver_path,
|
509
526
|
service_args=args,
|
510
|
-
log_output=logpath,
|
527
|
+
log_output=logpath, # type: ignore[arg-type]
|
511
528
|
)
|
512
529
|
else:
|
513
530
|
service = EdgeService(
|
514
531
|
service_args=args,
|
515
|
-
log_output=logpath,
|
532
|
+
log_output=logpath, # type: ignore[arg-type]
|
516
533
|
)
|
517
534
|
driver = webdriver.Edge(service=service, options=options)
|
518
535
|
|
@@ -540,6 +557,7 @@ class SetupSelenium:
|
|
540
557
|
|
541
558
|
############################################################################
|
542
559
|
def set_window_size(self, size: str = "720") -> None:
|
560
|
+
"""Helper to set the window size after driver has been instantiated."""
|
543
561
|
if size == "max":
|
544
562
|
self.driver.maximize_window()
|
545
563
|
return
|
@@ -550,17 +568,22 @@ class SetupSelenium:
|
|
550
568
|
self.driver.set_window_size(width, height)
|
551
569
|
|
552
570
|
def set_main_window_handle(self, window: str | None = None) -> str:
|
553
|
-
|
554
|
-
|
555
|
-
|
571
|
+
"""
|
572
|
+
maintains the initial window handle as an attribute
|
573
|
+
|
574
|
+
Most users will never utilize this. It's part of a legacy requirement for
|
575
|
+
an old test suite
|
576
|
+
"""
|
577
|
+
# does the main_window_handle exist and point to an available window?
|
578
|
+
if not window and not self.main_window_handle:
|
579
|
+
try:
|
580
|
+
window = self.driver.current_window_handle
|
581
|
+
except NoSuchWindowException:
|
556
582
|
try:
|
557
|
-
window = self.driver.
|
558
|
-
except
|
559
|
-
|
560
|
-
|
561
|
-
except WebDriverException:
|
562
|
-
# Have we closed all the windows?
|
563
|
-
raise
|
583
|
+
window = self.driver.window_handles[0]
|
584
|
+
except WebDriverException: # noqa: TRY302
|
585
|
+
# Have we closed all the windows?
|
586
|
+
raise
|
564
587
|
if window:
|
565
588
|
self.main_window_handle = window
|
566
589
|
return self.main_window_handle
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: setup-selenium-testing
|
3
|
-
Version: 0.1.
|
3
|
+
Version: 0.1.3
|
4
4
|
Summary: Setup Selenium for automation testing
|
5
5
|
Home-page: https://github.com/bandophahita/setup_selenium
|
6
6
|
License: MIT
|
@@ -21,17 +21,14 @@ Classifier: Programming Language :: Python :: 3 :: Only
|
|
21
21
|
Provides-Extra: dev
|
22
22
|
Provides-Extra: test
|
23
23
|
Requires-Dist: black ; extra == "dev"
|
24
|
-
Requires-Dist:
|
25
|
-
Requires-Dist: flake8 ; extra == "dev"
|
24
|
+
Requires-Dist: isort ; extra == "dev"
|
26
25
|
Requires-Dist: mypy ; extra == "dev"
|
27
|
-
Requires-Dist: pylint ; extra == "dev"
|
28
26
|
Requires-Dist: pytest ; extra == "dev" or extra == "test"
|
29
27
|
Requires-Dist: ruff ; extra == "dev"
|
30
28
|
Requires-Dist: selenium (>=4.7.0)
|
31
29
|
Requires-Dist: semantic-version
|
32
|
-
Requires-Dist: setuptools ; extra == "dev"
|
33
30
|
Requires-Dist: tox ; extra == "dev" or extra == "test"
|
34
|
-
Requires-Dist: typing-extensions
|
31
|
+
Requires-Dist: typing-extensions
|
35
32
|
Project-URL: Repository, https://github.com/bandophahita/setup_selenium
|
36
33
|
Description-Content-Type: text/markdown
|
37
34
|
|
@@ -0,0 +1,7 @@
|
|
1
|
+
setup_selenium/__init__.py,sha256=Wem42Sg7sr4nq1d_qVeSrxee5YXllJvfex3sBdoiCRM,64
|
2
|
+
setup_selenium/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
3
|
+
setup_selenium/selenium_module.py,sha256=4nLGWMXQsUwQPxJWMuq8XnR_qNHQGhyF7ta71SomzrQ,21006
|
4
|
+
setup_selenium_testing-0.1.3.dist-info/LICENSE,sha256=KGdE-1D1chm3UNFtfE8x-EpVxhmv2zFx8oltbO8M1qE,1070
|
5
|
+
setup_selenium_testing-0.1.3.dist-info/METADATA,sha256=CsHV_im2TaGQtkc2Oe85GAdpusQ6PIiTcEfA53IM_ZI,5385
|
6
|
+
setup_selenium_testing-0.1.3.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
|
7
|
+
setup_selenium_testing-0.1.3.dist-info/RECORD,,
|
@@ -1,7 +0,0 @@
|
|
1
|
-
setup_selenium/__init__.py,sha256=Wem42Sg7sr4nq1d_qVeSrxee5YXllJvfex3sBdoiCRM,64
|
2
|
-
setup_selenium/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
3
|
-
setup_selenium/selenium_module.py,sha256=VjTD-PvkBX7L3IV0sZixDiZxXn9R0cHiLEHYMrQcAqk,19786
|
4
|
-
setup_selenium_testing-0.1.1.dist-info/LICENSE,sha256=KGdE-1D1chm3UNFtfE8x-EpVxhmv2zFx8oltbO8M1qE,1070
|
5
|
-
setup_selenium_testing-0.1.1.dist-info/METADATA,sha256=9tt5YPpODqG0xM759xjjtuXxQcSsyo1elplCsmPpES4,5526
|
6
|
-
setup_selenium_testing-0.1.1.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
|
7
|
-
setup_selenium_testing-0.1.1.dist-info/RECORD,,
|
File without changes
|
File without changes
|