sefiutils 1.0.46 → 1.0.47

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,128 @@
1
+ import dotenv from "dotenv";
2
+ dotenv.config() // read ".env"
3
+
4
+ import { Builder, Capabilities, WebDriver } from "selenium-webdriver";
5
+ import { getRemoteAddressAndPort, setBrowserWindowSize, setViewPortSize } from "./seUtils";
6
+ import { debug, verbose } from "./log";
7
+
8
+ export const LOCAL_SETUP_TIMEOUT = 20000;
9
+
10
+ export async function localSetup(page: string, width = 500, height = 500, acceptUntrustedCertificates = true): Promise<WebDriver> {
11
+ debug(() => `localSetup("${page}", ${width}, ${height}, ${acceptUntrustedCertificates}), getWebDriver ...`);
12
+ const driver = await getWebDriver(acceptUntrustedCertificates);
13
+ verbose(() => `Driver started, load page: ${page}`);
14
+ await driver.get(page);
15
+ debug(() => `Page loaded, set browser window size: ${width}x${height}`);
16
+ await setBrowserWindowSize(driver, width, height);
17
+ debug("Page loaded and window size set, local setup done, return driver.")
18
+ return driver;
19
+ }
20
+
21
+ /**
22
+ * To be configured in jest setup file via globalSetup as it needs to be run before any tests in all files.
23
+ * Additionally,
24
+ * ```
25
+ * await driver.get(page);
26
+ * await setViewPortSize(500, 500);
27
+ * ```
28
+ * are to be called.
29
+ */
30
+ async function getWebDriver(acceptUntrustedCertificates: boolean) {
31
+ const browser = (process.env.SEFI_BROWSER as "chrome" | "firefox" | "remote") || "remote";
32
+
33
+ debug(() => `Use browser: ${browser}`);
34
+ try {
35
+ if (browser === "chrome") {
36
+ return await setUpWebDriverChrome(acceptUntrustedCertificates);
37
+ } else if (browser === "firefox") {
38
+ return await setUpWebDriverFirefox(acceptUntrustedCertificates);
39
+ } else if (browser === "remote") {
40
+ return await setUpWebDriverInDocker(acceptUntrustedCertificates);
41
+ } else {
42
+ throw new Error(`Unknown browser: ${browser}`);
43
+ }
44
+ } catch (err) {
45
+ console.error(`Error setting up driver: ${err}`);
46
+ throw err;
47
+ }
48
+ }
49
+
50
+
51
+ async function setUpWebDriverInDocker(acceptUntrustedCertificates: boolean) {
52
+ debug("Dynamic import of selenium-webdriver/firefox");
53
+ debug("Remote browser, load firefox webdriver");
54
+ const firefox = await import('selenium-webdriver/firefox');
55
+
56
+ const { address } = getRemoteAddressAndPort();
57
+ const start = Date.now();
58
+
59
+ const options = new firefox.Options().addArguments("-headless");
60
+ options.setAcceptInsecureCerts(acceptUntrustedCertificates);
61
+
62
+ debug(() => `Start headless firefox, remote server at ${address}`)
63
+ const driver = await new Builder()
64
+ .usingServer(address)
65
+ .withCapabilities(Capabilities.firefox())
66
+ .setFirefoxOptions(options)
67
+ .build();
68
+
69
+ debug(() => {
70
+ const duration = (Date.now() - start) / 1000;
71
+ return `Driver resolved and connected, required ${duration}s.`
72
+ });
73
+ return driver;
74
+ }
75
+
76
+
77
+ /**
78
+ * To be called in the beforeAll() function of a test suite.
79
+ * Additionally,
80
+ * ```
81
+ * await driver.get(page);
82
+ * await setViewPortSize(500, 500);
83
+ * ```
84
+ * are to be called.
85
+ */
86
+ async function setUpWebDriverChrome(acceptUntrustedCertificates: boolean) {
87
+ debug("Dynamic import of chromedriver and selenium-webdriver/chrome");
88
+ //@ts-ignore
89
+ await import('chromedriver');
90
+ const chrome = await import('selenium-webdriver/chrome');
91
+
92
+ const options = new chrome.Options().addArguments("--headless=new");
93
+ options.setAcceptInsecureCerts(acceptUntrustedCertificates);
94
+
95
+ debug(() => `Start headless chrome`)
96
+ const driver = await new Builder()
97
+ .forBrowser('chrome')
98
+ .setChromeOptions(options)
99
+ .build();
100
+ return driver;
101
+ }
102
+
103
+ /**
104
+ * To be called in the beforeAll() function of a test suite.
105
+ * Additionally,
106
+ * ```
107
+ * await driver.get(page);
108
+ * await setViewPortSize(500, 500);
109
+ * ```
110
+ * are to be called.
111
+ */
112
+ async function setUpWebDriverFirefox(acceptUntrustedCertificates: boolean) {
113
+ debug("Dynamic import of geckodriver and selenium-webdriver/firefox");
114
+ //@ts-ignore
115
+ await import('geckodriver'); // installed geckodriver will cause remote configuration to fail in docker...
116
+ const firefox = await import('selenium-webdriver/firefox');
117
+
118
+ const options = new firefox.Options().addArguments("-headless");
119
+ options.setAcceptInsecureCerts(acceptUntrustedCertificates);
120
+
121
+ debug(() => `Start headless firefox`)
122
+ const driver = await new Builder()
123
+ .forBrowser('firefox')
124
+ .setFirefoxOptions(options)
125
+ .build();
126
+
127
+ return driver;
128
+ }
@@ -0,0 +1,14 @@
1
+ import { WebDriver } from "selenium-webdriver";
2
+
3
+ /**
4
+ * To be called in the afterAll() function of a test suite.
5
+ */
6
+ export async function localTeardown(driver: WebDriver) {
7
+ if (driver) {
8
+ await driver.quit();
9
+ // console.log(`Driver quit`);
10
+ } else {
11
+ throw new Error("Driver not started yet");
12
+
13
+ }
14
+ }
package/src/log.ts ADDED
@@ -0,0 +1,19 @@
1
+ const logLevel = (process.env.SEFI_LOG_LEVEL || "info").toLowerCase();
2
+
3
+ export function verbose(msg: any) {
4
+ if (logLevel=="debug" || logLevel=="verbose") {
5
+ if (msg instanceof Function) {
6
+ msg = msg();
7
+ }
8
+ console.log(msg);
9
+ }
10
+ }
11
+
12
+ export function debug(msg: any) {
13
+ if (logLevel=="debug") {
14
+ if (msg instanceof Function) {
15
+ msg = msg();
16
+ }
17
+ console.log(msg);
18
+ }
19
+ }