@eyeo/get-browser-binary 0.12.0 → 0.13.0

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.
package/README.md CHANGED
@@ -83,6 +83,14 @@ Increasing the timeout may be useful on slow connection environments:
83
83
  npm test -- --timeout <ms>
84
84
  ```
85
85
 
86
+ By default, tests delete the `./browser-snapshots` before each `Browser` suite
87
+ runs. To change that behavior you may set the `TEST_KEEP_SNAPSHOTS` environment
88
+ variable to `true`. Example:
89
+
90
+ ```shell
91
+ TEST_KEEP_SNAPSHOTS=true npm test
92
+ ```
93
+
86
94
  ### Running tests on Docker
87
95
 
88
96
  Useful to reproduce the CI environment of the `test:browsers:linux` job.
@@ -101,14 +109,6 @@ parameter:
101
109
  docker run --shm-size=512m -e TEST_ARGS="--grep chromium.*latest --timeout 100000" -it browsers
102
110
  ```
103
111
 
104
- By default, tests delete the `./browser-snapshots` before each `Browser` suite
105
- runs. To change that behavior you may set the `TEST_KEEP_SNAPSHOTS` environment
106
- variable to `true`. Example:
107
-
108
- ```shell
109
- TEST_KEEP_SNAPSHOTS=true npm test
110
- ```
111
-
112
112
  #### ARM architecture (M1/M2 Apple Silicon)
113
113
 
114
114
  Chromium (ARM native):
package/RELEASE_NOTES.md CHANGED
@@ -1,3 +1,17 @@
1
+ # 0.13.0
2
+
3
+ - Fixes an issue that prevented the webdriver from locating the Edge binary on
4
+ Linux (#60)
5
+ - Uses headless new mode on Edge >= 116 (!74)
6
+ - Replaces omahaproxy API (deprecated) with chromiumdash (!73)
7
+ - Throws a `browser not installed` error when `customBinaryPath` doesn't exist
8
+ (!72)
9
+
10
+ ### Testing
11
+
12
+ - Changes the test extension in incognito mode from spanning to split (#59)
13
+ - Runs Linux Edge tests in a different browser version order (!71)
14
+
1
15
  # 0.12.0
2
16
 
3
17
  - Adds a new field `customBrowserBinary` to `getDriver()` options parameter that
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eyeo/get-browser-binary",
3
- "version": "0.12.0",
3
+ "version": "0.13.0",
4
4
  "description": "Install browser binaries and matching webdrivers",
5
5
  "repository": {
6
6
  "type": "git",
package/src/browsers.js CHANGED
@@ -102,23 +102,29 @@ class Browser {
102
102
  * Gets the installed version returned by the browser binary.
103
103
  * @param {string} binary The path to the browser binary.
104
104
  * @return {string} Installed browser version.
105
+ * @throws {Error} Browser is not installed.
105
106
  */
106
107
  static async getInstalledVersion(binary) {
107
- let stdout;
108
108
  try {
109
+ let stdout;
110
+ let stderr;
109
111
  if (platform == "win32") {
110
- ({stdout} = await promisify(exec)(
112
+ ({stdout, stderr} = await promisify(exec)(
111
113
  `(Get-ItemProperty ${binary}).VersionInfo.ProductVersion`,
112
114
  {shell: "powershell.exe"})
113
115
  );
114
116
  }
115
117
  else {
116
- ({stdout} = await promisify(execFile)(binary, ["--version"]));
118
+ ({stdout, stderr} = await promisify(execFile)(binary, ["--version"]));
117
119
  }
120
+ if (stderr)
121
+ throw new Error(stderr);
122
+
118
123
  return stdout.trim();
119
124
  }
120
- catch (e) {}
121
- return "";
125
+ catch (err) {
126
+ throw new Error(`${BROWSER_NOT_INSTALLED_ERROR}.\nBinary path: ${binary}\n${err}`);
127
+ }
122
128
  }
123
129
 
124
130
  /**
@@ -201,7 +207,8 @@ class Chromium extends Browser {
201
207
  "darwin-x64": "mac",
202
208
  "darwin-arm64": "mac_arm64"
203
209
  }[platformArch];
204
- let url = `https://omahaproxy.appspot.com/all.json?os=${os}`;
210
+ let url = `https://versionhistory.googleapis.com/v1/chrome/platforms/${os}/channels/${channel}/versions/all/releases`;
211
+
205
212
  let data;
206
213
  try {
207
214
  data = await got(url).json();
@@ -209,13 +216,7 @@ class Chromium extends Browser {
209
216
  catch (err) {
210
217
  throw new Error(`${BROWSER_VERSION_CHECK_ERROR}: ${url}\n${err}`);
211
218
  }
212
- let release = data[0].versions.find(ver => ver.channel == channel);
213
- let {current_version: version} = release;
214
-
215
- if (release.true_branch && release.true_branch.includes("_"))
216
- // A wrong base may be caused by a mini-branch (patched) release
217
- // In that case, the base is taken from the unpatched version
218
- version = [...version.split(".").slice(0, 3), "0"].join(".");
219
+ let {version} = data.releases[0];
219
220
 
220
221
  return version;
221
222
  }
@@ -231,10 +232,18 @@ class Chromium extends Browser {
231
232
  }
232
233
 
233
234
  static async #getBase(chromiumVersion) {
234
- let url = `https://omahaproxy.appspot.com/deps.json?version=${chromiumVersion}`;
235
+ let url;
235
236
  let chromiumBase;
236
237
  try {
237
- ({chromium_base_position: chromiumBase} = await got(url).json());
238
+ // https://gitlab.com/eyeo/developer-experience/get-browser-binary/-/issues/55
239
+ if (getMajorVersion(chromiumVersion) < 91) {
240
+ url = `https://omahaproxy.appspot.com/deps.json?version=${chromiumVersion}`;
241
+ ({chromium_base_position: chromiumBase} = await got(url).json());
242
+ }
243
+ else {
244
+ url = `https://chromiumdash.appspot.com/fetch_version?version=${chromiumVersion}`;
245
+ ({chromium_main_branch_position: chromiumBase} = await got(url).json());
246
+ }
238
247
  }
239
248
  catch (err) {
240
249
  throw new Error(`${BROWSER_VERSION_CHECK_ERROR}: ${url}\n${err}`);
@@ -797,9 +806,6 @@ class Edge extends Browser {
797
806
 
798
807
  let binaryPath = binary || Edge.#getBinaryPath();
799
808
  let versionNumber = await Edge.#getInstalledVersionNumber(binaryPath);
800
- if (!versionNumber)
801
- throw new Error(`${BROWSER_NOT_INSTALLED_ERROR}. Binary path: ${binaryPath}`);
802
-
803
809
  let [zip, driverBinary] = {
804
810
  "win32-ia32": ["edgedriver_win32.zip", "msedgedriver.exe"],
805
811
  "win32-x64": ["edgedriver_win64.zip", "msedgedriver.exe"],
@@ -844,21 +850,35 @@ class Edge extends Browser {
844
850
  extraArgs = [], customBrowserBinary
845
851
  } = {}, downloadTimeout = 0) {
846
852
  let binary;
847
- if (!customBrowserBinary && (platform == "linux" || platform == "darwin"))
848
- ({binary} = await Edge.installBrowser(version, downloadTimeout));
853
+ let versionNumber;
854
+ if (!customBrowserBinary && (platform == "linux" || platform == "darwin")) {
855
+ ({binary, versionNumber} =
856
+ await Edge.installBrowser(version, downloadTimeout));
857
+ }
858
+ else {
859
+ binary = customBrowserBinary || Edge.#getBinaryPath();
860
+ versionNumber =
861
+ await Edge.#getInstalledVersionNumber(binary);
862
+ }
849
863
 
850
- let driverPath = await Edge.#installDriver(customBrowserBinary || binary);
864
+ let driverPath = await Edge.#installDriver(binary);
851
865
  let serviceBuilder = new edge.ServiceBuilder(driverPath);
852
866
 
853
867
  let options = new edge.Options().addArguments("no-sandbox", ...extraArgs);
854
- if (headless)
855
- options.headless();
868
+ if (headless) {
869
+ if (versionNumber && getMajorVersion(versionNumber) >= 114)
870
+ options.addArguments("headless=new");
871
+ else
872
+ options.headless();
873
+ }
856
874
  if (extensionPaths.length > 0)
857
875
  options.addArguments(`load-extension=${extensionPaths.join(",")}`);
858
876
  if (incognito)
859
877
  options.addArguments("inprivate");
860
878
  if (insecure)
861
879
  options.addArguments("ignore-certificate-errors");
880
+ if (platform == "linux")
881
+ options.setEdgeChromiumBinaryPath(`/usr/bin/${binary}`);
862
882
 
863
883
  let builder = new webdriver.Builder();
864
884
  builder.forBrowser("MicrosoftEdge");
package/test/browsers.js CHANGED
@@ -28,7 +28,8 @@ import "geckodriver"; // Required to set the driver path on Windows
28
28
  const VERSIONS = {
29
29
  chromium: ["latest", "75.0.3770.0", "beta", "dev"],
30
30
  firefox: ["latest", "60.0", "beta"],
31
- edge: ["dev", "latest", "beta", "95.0.1020.40"]
31
+ // Unusual ordering: https://gitlab.com/eyeo/developer-experience/get-browser-binary/-/issues/57
32
+ edge: ["dev", "beta", "latest", "95.0.1020.40"]
32
33
  };
33
34
  const TEST_URL = "https://abptestpages.org/en/exceptions/iframe_subdomains";
34
35
  const TEST_URL_LONG_PAGE = "https://abptestpages.org/";
@@ -300,5 +301,11 @@ for (let browser of Object.keys(BROWSERS)) {
300
301
  .rejects.toThrow(`Unsupported browser version: ${unsupported}`);
301
302
  }
302
303
  });
304
+
305
+ it("does not run not installed custom browsers", async() => {
306
+ let customBrowserBinary = "not-installed";
307
+ await expect(BROWSERS[browser].getDriver("latest", {customBrowserBinary}))
308
+ .rejects.toThrow(/(Browser is not installed|binary is not a Firefox executable)/);
309
+ });
303
310
  });
304
311
  }
@@ -4,5 +4,6 @@
4
4
  "manifest_version": 3,
5
5
  "background": {
6
6
  "service_worker": "background.js"
7
- }
7
+ },
8
+ "incognito": "split"
8
9
  }