Repository: MetaMask/metamask-extension
Pull request #32962: fix: flaky test `Multichain API Calling wallet_invokeMethod on the same dapp across three different connected chains Write operations: calling eth_sendTransaction` on each connected scope should match chosen addresses in each chain to the selected address`
Author: login: seaona
Labels: name: flaky tests
name: team-qa
description: QA team
name: release-12.20.0
description: Issue or pull request that will be included in release 12.20.0
Created: 2025-05-15T11:48:11Z | Merged: 2025-05-15T18:13:15Z

<!--
Please submit this PR as a draft initially.
Do not mark it as "Ready for review" until the template has been completely filled out, and PR status checks have passed at least once.
-->

## **Description**
This PR fixes flakiness due to using the anti-pattern `await element.getText();` and then asserting for our expected value.

This causes that sometimes, when we assert, the value for that element is not yet loaded, and the previous one is asserted, which makes the test fail:

```js
AssertionError [ERR_ASSERTION]: Should have Account 2 selected, got Account 1
+ actual - expected

+ 'Account 1'
- 'Account 2'
           ^

    at <anonymous> (test/e2e/flask/multichain-api/wallet_invokeMethod.spec.ts:145:22)
    at process.processTicksAndRejections (node:internal/process/task_queues:105:5)
    at async withFixtures (test/e2e/helpers.js:306:5)
    at async Context.<anonymous> (test/e2e/flask/multichain-api/wallet_invokeMethod.spec.ts:95:9)

      + expected - actual

      -Account 1
      +Account 2
```


It also adds a couple of more tweaks to make the test more robust in relation to windows.

[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/MetaMask/metamask-extension/pull/32962?quickstart=1)

## **Related issues**

Fixes: https://github.com/MetaMask/metamask-extension/issues/32961

## **Manual testing steps**

1. e2e should pass

## **Screenshots/Recordings**

<!-- If applicable, add screenshots and/or recordings to visualize the before and after of your change. -->

### **Before**

<!-- [screenshots/recordings] -->

### **After**

<!-- [screenshots/recordings] -->

## **Pre-merge author checklist**

- [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Extension Coding Standards](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I’ve included tests if applicable
- [x] I’ve documented my code using [JSDoc](https://jsdoc.app/) format if applicable
- [x] I’ve applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-extension/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors.

## **Pre-merge reviewer checklist**

- [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots.



Diff:
diff --git a/test/e2e/flask/multichain-api/testHelpers.ts b/test/e2e/flask/multichain-api/testHelpers.ts
index c90851a3db6e..e427e8bfe2f2 100644
--- a/test/e2e/flask/multichain-api/testHelpers.ts
+++ b/test/e2e/flask/multichain-api/testHelpers.ts
@@ -90,7 +90,10 @@ export const addAccountInWalletAndAuthorize = async (
   await checkboxes[0].click(); // select all checkbox
   await driver.delay(regularDelayMs);
 
-  await driver.clickElement({ text: 'Update', tag: 'button' });
+  await driver.clickElementAndWaitToDisappear({
+    text: 'Update',
+    tag: 'button',
+  });
 };
 
 /**
diff --git a/test/e2e/flask/multichain-api/wallet_invokeMethod.spec.ts b/test/e2e/flask/multichain-api/wallet_invokeMethod.spec.ts
index 052b35195d34..69779403480c 100644
--- a/test/e2e/flask/multichain-api/wallet_invokeMethod.spec.ts
+++ b/test/e2e/flask/multichain-api/wallet_invokeMethod.spec.ts
@@ -44,8 +44,10 @@ describe('Multichain API', function () {
             await testDapp.connectExternallyConnectable(extensionId);
             await testDapp.initCreateSessionScopes(GANACHE_SCOPES, ACCOUNTS);
             await addAccountInWalletAndAuthorize(driver);
-            await driver.clickElement({ text: 'Connect', tag: 'button' });
-            await driver.delay(largeDelayMs);
+            await driver.clickElementAndWaitForWindowToClose({
+              text: 'Connect',
+              tag: 'button',
+            });
             await driver.switchToWindowWithTitle(
               WINDOW_TITLES.MultichainTestDApp,
             );
@@ -71,17 +73,10 @@ describe('Multichain API', function () {
                 `[data-testid="invoke-method-${scope}-btn"]`,
               );
 
-              const resultElement = await driver.findElement(
-                `#invoke-method-${escapeColon(scope)}-${invokeMethod}-result-0`,
-              );
-
-              const result = await resultElement.getText();
-
-              assert.strictEqual(
-                result,
-                `"${EXPECTED_RESULTS[scope]}"`,
-                `${scope} method ${invokeMethod} expected "${EXPECTED_RESULTS[scope]}", got ${result} instead`,
-              );
+              await driver.waitForSelector({
+                css: `[id="invoke-method-${scope}-${invokeMethod}-result-0"]`,
+                text: `"${EXPECTED_RESULTS[scope]}"`,
+              });
             }
           },
         );
@@ -108,9 +103,11 @@ describe('Multichain API', function () {
             await testDapp.connectExternallyConnectable(extensionId);
             await testDapp.initCreateSessionScopes(GANACHE_SCOPES, ACCOUNTS);
             await addAccountInWalletAndAuthorize(driver);
-            await driver.clickElement({ text: 'Connect', tag: 'button' });
+            await driver.clickElementAndWaitForWindowToClose({
+              text: 'Connect',
+              tag: 'button',
+            });
 
-            await driver.delay(largeDelayMs);
             await driver.switchToWindowWithTitle(
               WINDOW_TITLES.MultichainTestDApp,
             );
@@ -135,18 +132,13 @@ describe('Multichain API', function () {
               await driver.delay(largeDelayMs);
               await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog);
 
-              const accountWebElement = await driver.findElement(
-                '[data-testid="sender-address"]',
-              );
-              const accountText = await accountWebElement.getText();
               const expectedAccount =
                 i === INDEX_FOR_ALTERNATE_ACCOUNT ? 'Account 2' : 'Account 1';
 
-              assert.strictEqual(
-                accountText,
-                expectedAccount,
-                `Should have ${expectedAccount} selected, got ${accountText}`,
-              );
+              await driver.waitForSelector({
+                tesId: 'sender-address',
+                text: expectedAccount,
+              });
 
               await driver.clickElement({
                 text: 'Confirm',
@@ -174,9 +166,10 @@ describe('Multichain API', function () {
             await testDapp.connectExternallyConnectable(extensionId);
             await testDapp.initCreateSessionScopes(GANACHE_SCOPES, ACCOUNTS);
             await addAccountInWalletAndAuthorize(driver);
-            await driver.clickElement({ text: 'Connect', tag: 'button' });
-
-            await driver.delay(largeDelayMs);
+            await driver.clickElementAndWaitForWindowToClose({
+              text: 'Connect',
+              tag: 'button',
+            });
             await driver.switchToWindowWithTitle(
               WINDOW_TITLES.MultichainTestDApp,
             );


Reviews:
user: login: seaona
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-15T12:16:34Z
user: login: seaona
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-15T12:17:24Z
user: login: seaona
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-15T12:17:37Z
user: login: chloeYue
body: LGTM ! thanks ! 
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-15T13:25:51Z
user: login: jiexi
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-15T15:49:56Z
user: login: jiexi
body: beautiful. Thank you for making this logic better 🙏 
state: APPROVED
author_association: MEMBER
submitted_at: 2025-05-15T15:50:39Z
user: login: adonesky1
body: THANK YOU!
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-15T16:39:01Z

Review comments:
diff_hunk: @@ -44,8 +44,10 @@ describe('Multichain API', function () {
             await testDapp.connectExternallyConnectable(extensionId);
             await testDapp.initCreateSessionScopes(GANACHE_SCOPES, ACCOUNTS);
             await addAccountInWalletAndAuthorize(driver);
-            await driver.clickElement({ text: 'Connect', tag: 'button' });
-            await driver.delay(largeDelayMs);
path: test/e2e/flask/multichain-api/wallet_invokeMethod.spec.ts
user: login: seaona
body: we can remove the delay by waiting for the window to close
created_at: 2025-05-15T12:16:34Z
author_association: MEMBER
diff_hunk: @@ -71,17 +73,10 @@ describe('Multichain API', function () {
                 `[data-testid="invoke-method-${scope}-btn"]`,
               );
 
-              const resultElement = await driver.findElement(
-                `#invoke-method-${escapeColon(scope)}-${invokeMethod}-result-0`,
-              );
-
-              const result = await resultElement.getText();
-
-              assert.strictEqual(
-                result,
-                `"${EXPECTED_RESULTS[scope]}"`,
-                `${scope} method ${invokeMethod} expected "${EXPECTED_RESULTS[scope]}", got ${result} instead`,
-              );
path: test/e2e/flask/multichain-api/wallet_invokeMethod.spec.ts
user: login: seaona
body: this is an anti-pattern that leads to race conditions. We should look for the specific text directly in the selector.
See more here https://github.com/MetaMask/metamask-extension/issues/19870
created_at: 2025-05-15T12:17:24Z
author_association: MEMBER
diff_hunk: @@ -135,18 +132,13 @@ describe('Multichain API', function () {
               await driver.delay(largeDelayMs);
               await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog);
 
-              const accountWebElement = await driver.findElement(
-                '[data-testid="sender-address"]',
-              );
-              const accountText = await accountWebElement.getText();
               const expectedAccount =
                 i === INDEX_FOR_ALTERNATE_ACCOUNT ? 'Account 2' : 'Account 1';
 
-              assert.strictEqual(
-                accountText,
-                expectedAccount,
-                `Should have ${expectedAccount} selected, got ${accountText}`,
-              );
path: test/e2e/flask/multichain-api/wallet_invokeMethod.spec.ts
user: login: seaona
body: this is an anti-pattern that leads to race conditions. We should look for the specific text
See more here https://github.com/MetaMask/metamask-extension/issues/19870
created_at: 2025-05-15T12:17:37Z
author_association: MEMBER
diff_hunk: @@ -71,17 +73,10 @@ describe('Multichain API', function () {
                 `[data-testid="invoke-method-${scope}-btn"]`,
               );
 
-              const resultElement = await driver.findElement(
-                `#invoke-method-${escapeColon(scope)}-${invokeMethod}-result-0`,
-              );
-
-              const result = await resultElement.getText();
-
-              assert.strictEqual(
-                result,
-                `"${EXPECTED_RESULTS[scope]}"`,
-                `${scope} method ${invokeMethod} expected "${EXPECTED_RESULTS[scope]}", got ${result} instead`,
-              );
path: test/e2e/flask/multichain-api/wallet_invokeMethod.spec.ts
user: login: jiexi
body: ahhh. yeah that makes sense
created_at: 2025-05-15T15:49:56Z
author_association: MEMBER

PR comments:
user: login: github-actions[bot]
created_at: 2025-05-15T11:48:25Z
body: **CLA Signature Action:** All authors have signed the CLA. You may need to manually re-run the blocking PR check if it doesn't pass in a few minutes.
author_association: CONTRIBUTOR
user: login: metamaskbot
created_at: 2025-05-15T13:15:31Z
body: <details><summary>Builds ready [e4e4fe9]</summary><ul><li>builds: <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/builds/metamask-chrome-12.17.3.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/builds-mv2/metamask-firefox-12.17.3.zip">firefox</a></li>
<li>builds (beta): <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15045190669/builds-beta/metamask-beta-chrome-12.17.3-beta.0.zip">chrome</a></li>
<li>builds (flask): <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/builds-flask/metamask-flask-chrome-12.17.3-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/builds-flask-mv2/metamask-flask-firefox-12.17.3-flask.0.zip">firefox</a></li>
<li>builds (test): <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/builds-test/metamask-chrome-12.17.3.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/builds-test-mv2/metamask-firefox-12.17.3.zip">firefox</a></li>
<li>builds (test-flask): <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/builds-test-flask/metamask-flask-chrome-12.17.3-flask.0.zip">chrome</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/builds-test-flask-mv2/metamask-flask-firefox-12.17.3-flask.0.zip">firefox</a></li>
<li>build viz: <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/build-viz/index.html">Build System</a></li>
<li>bundle size: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15045190669/bundle-size/bundle_size.json">Bundle Size Stats</a></li>
<li>user-actions-benchmark: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15045190669/benchmarks/benchmark-chrome-browserify-userActions.json">User Actions Stats</a></li>
<li>storybook: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15045190669/storybook-build/index.html">Storybook</a></li>
<li>typescript migration: <a href="https://diuv6g5fj9pvx.cloudfront.net/metamask-extension/15045190669/ts-migration-dashboard/index.html">Dashboard</a></li>
<li><a href="https://app.circleci.com/pipelines/github/MetaMask/metamask-extension/jobs/4892916/artifacts/">all CircleCI artifacts</a></li>
<li><details>
       <summary>bundle viz:</summary>
       <ul><li>background: <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/background-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/background-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/background-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/background-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/background-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/background-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/background-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/background-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/background-8.html">8</a></li><li>common: <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/common-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/common-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/common-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/common-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/common-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/common-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/common-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/common-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/common-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/common-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/common-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/common-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/common-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/common-13.html">13</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/common-14.html">14</a></li><li>ui: <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/ui-0.html">0</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/ui-1.html">1</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/ui-2.html">2</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/ui-3.html">3</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/ui-4.html">4</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/ui-5.html">5</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/ui-6.html">6</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/ui-7.html">7</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/ui-8.html">8</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/ui-9.html">9</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/ui-10.html">10</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/ui-11.html">11</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/ui-12.html">12</a>, <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/ui-13.html">13</a></li><li>content-script: <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/content-script-0.html">0</a></li><li>offscreen: <a href="https://output.circle-artifacts.com/output/job/a8223be9-c510-4221-9033-56deb726e0b1/artifacts/0/build-artifacts/source-map-explorer/offscreen-0.html">0</a></li></ul>
     </details></li></ul></details>

<details><summary>UI Startup Metrics (1210 ± 70 ms)</summary><table><thead><tr><th>Platform</th><th>BuildType</th><th>Page</th><th>Metric</th><th>Mean (ms)</th><th>Min (ms)</th><th>Max (ms)</th><th>Std Dev (ms)</th><th>P 75 (ms)</th><th>P 95 (ms)</th></tr></thead><tbody><tr><td rowspan="22">Chrome</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1210</td><td align="right">1099</td><td align="right">1589</td><td align="right">70</td><td align="right">1252</td><td align="right">1320</td></tr><tr><td>load</td><td align="right">1058</td><td align="right">952</td><td align="right">1357</td><td align="right">64</td><td align="right">1098</td><td align="right">1157</td></tr><tr><td>domContentLoaded</td><td align="right">1052</td><td align="right">940</td><td align="right">1350</td><td align="right">64</td><td align="right">1092</td><td align="right">1152</td></tr><tr><td>domInteractive</td><td align="right">17</td><td align="right">13</td><td align="right">45</td><td align="right">4</td><td align="right">17</td><td align="right">26</td></tr><tr><td>firstPaint</td><td align="right">746</td><td align="right">134</td><td align="right">1180</td><td align="right">417</td><td align="right">1079</td><td align="right">1149</td></tr><tr><td>backgroundConnect</td><td align="right">8</td><td align="right">4</td><td align="right">25</td><td align="right">5</td><td align="right">8</td><td align="right">24</td></tr><tr><td>firstReactRender</td><td align="right">19</td><td align="right">15</td><td align="right">38</td><td align="right">4</td><td align="right">20</td><td align="right">31</td></tr><tr><td>getState</td><td align="right">15</td><td align="right">5</td><td align="right">45</td><td align="right">9</td><td align="right">21</td><td align="right">34</td></tr><tr><td>initialActions</td><td align="right">0</td><td align="right">0</td><td align="right">1</td><td align="right">0</td><td align="right">0</td><td align="right">1</td></tr><tr><td>loadScripts</td><td align="right">812</td><td align="right">711</td><td align="right">1081</td><td align="right">62</td><td align="right">851</td><td align="right">914</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">5</td><td align="right">32</td><td align="right">3</td><td align="right">8</td><td align="right">13</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">2185</td><td align="right">1760</td><td align="right">2551</td><td align="right">164</td><td align="right">2298</td><td align="right">2415</td></tr><tr><td>load</td><td align="right">1697</td><td align="right">1357</td><td align="right">2202</td><td align="right">141</td><td align="right">1762</td><td align="right">1889</td></tr><tr><td>domContentLoaded</td><td align="right">1691</td><td align="right">1350</td><td align="right">2198</td><td align="right">141</td><td align="right">1756</td><td align="right">1875</td></tr><tr><td>domInteractive</td><td align="right">16</td><td align="right">12</td><td align="right">66</td><td align="right">11</td><td align="right">13</td><td align="right">49</td></tr><tr><td>firstPaint</td><td align="right">171</td><td align="right">66</td><td align="right">388</td><td align="right">62</td><td align="right">220</td><td align="right">281</td></tr><tr><td>backgroundConnect</td><td align="right">30</td><td align="right">9</td><td align="right">97</td><td align="right">17</td><td align="right">40</td><td align="right">54</td></tr><tr><td>firstReactRender</td><td align="right">183</td><td align="right">55</td><td align="right">378</td><td align="right">109</td><td align="right">303</td><td align="right">345</td></tr><tr><td>getState</td><td align="right">13</td><td align="right">4</td><td align="right">57</td><td align="right">8</td><td align="right">15</td><td align="right">29</td></tr><tr><td>initialActions</td><td align="right">3</td><td align="right">1</td><td align="right">6</td><td align="right">1</td><td align="right">4</td><td align="right">5</td></tr><tr><td>loadScripts</td><td align="right">1686</td><td align="right">1348</td><td align="right">2196</td><td align="right">142</td><td align="right">1754</td><td align="right">1873</td></tr><tr><td>setupStore</td><td align="right">17</td><td align="right">6</td><td align="right">38</td><td align="right">7</td><td align="right">22</td><td align="right">30</td></tr><tr><td rowspan="22">Firefox</td><td rowspan="11">Browserify</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1336</td><td align="right">1165</td><td align="right">1572</td><td align="right">98</td><td align="right">1407</td><td align="right">1533</td></tr><tr><td>load</td><td align="right">1190</td><td align="right">1037</td><td align="right">1443</td><td align="right">97</td><td align="right">1266</td><td align="right">1363</td></tr><tr><td>domContentLoaded</td><td align="right">1190</td><td align="right">1036</td><td align="right">1443</td><td align="right">97</td><td align="right">1266</td><td align="right">1362</td></tr><tr><td>domInteractive</td><td align="right">100</td><td align="right">38</td><td align="right">195</td><td align="right">30</td><td align="right">114</td><td align="right">152</td></tr><tr><td>firstPaint</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td></tr><tr><td>backgroundConnect</td><td align="right">21</td><td align="right">14</td><td align="right">91</td><td align="right">10</td><td align="right">21</td><td align="right">33</td></tr><tr><td>firstReactRender</td><td align="right">25</td><td align="right">20</td><td align="right">60</td><td align="right">10</td><td align="right">23</td><td align="right">53</td></tr><tr><td>getState</td><td align="right">8</td><td align="right">4</td><td align="right">35</td><td align="right">4</td><td align="right">8</td><td align="right">10</td></tr><tr><td>initialActions</td><td align="right">0</td><td align="right">0</td><td align="right">1</td><td align="right">0</td><td align="right">0</td><td align="right">1</td></tr><tr><td>loadScripts</td><td align="right">1172</td><td align="right">1023</td><td align="right">1425</td><td align="right">96</td><td align="right">1247</td><td align="right">1341</td></tr><tr><td>setupStore</td><td align="right">11</td><td align="right">4</td><td align="right">200</td><td align="right">28</td><td align="right">6</td><td align="right">23</td></tr><tr><td rowspan="11">Webpack</td><td rowspan="11">Home</td><td>uiStartup</td><td align="right">1502</td><td align="right">1350</td><td align="right">1798</td><td align="right">90</td><td align="right">1551</td><td align="right">1681</td></tr><tr><td>load</td><td align="right">1291</td><td align="right">1167</td><td align="right">1581</td><td align="right">89</td><td align="right">1332</td><td align="right">1476</td></tr><tr><td>domContentLoaded</td><td align="right">1291</td><td align="right">1166</td><td align="right">1581</td><td align="right">89</td><td align="right">1332</td><td align="right">1476</td></tr><tr><td>domInteractive</td><td align="right">77</td><td align="right">40</td><td align="right">165</td><td align="right">18</td><td align="right">83</td><td align="right">109</td></tr><tr><td>firstPaint</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td><td align="right">NaN</td></tr><tr><td>backgroundConnect</td><td align="right">22</td><td align="right">15</td><td align="right">60</td><td align="right">7</td><td align="right">23</td><td align="right">35</td></tr><tr><td>firstReactRender</td><td align="right">34</td><td align="right">29</td><td align="right">52</td><td align="right">4</td><td align="right">36</td><td align="right">43</td></tr><tr><td>getState</td><td align="right">8</td><td align="right">4</td><td align="right">32</td><td align="right">5</td><td align="right">9</td><td align="right">21</td></tr><tr><td>initialActions</td><td align="right">0</td><td align="right">0</td><td align="right">2</td><td align="right">0</td><td align="right">1</td><td align="right">1</td></tr><tr><td>loadScripts</td><td align="right">1272</td><td align="right">1150</td><td align="right">1560</td><td align="right">88</td><td align="right">1314</td><td align="right">1458</td></tr><tr><td>setupStore</td><td align="right">8</td><td align="right">5</td><td align="right">23</td><td align="right">3</td><td align="right">8</td><td align="right">13</td></tr></tbody></table>Benchmark value 24 exceeds gate value 18 for chrome browserify home p95 backgroundConnect<br>
Benchmark value 34 exceeds gate value 33 for chrome browserify home p95 getState<br>
Benchmark value 26 exceeds gate value 25 for firefox browserify home mean firstReactRender<br>
Benchmark value 11 exceeds gate value 9 for firefox browserify home mean setupStore<br>
<b>Sum of mean exceeds: 3ms | Sum of p95 exceeds: 7ms<br>
Sum of all benchmark exceeds: 10ms</b><br>
</details>

<details><summary>Bundle size diffs</summary><ul><li>background: 0 Bytes (0%)</li>
<li>ui: 0 Bytes (0%)</li>
<li>common: 0 Bytes (0%)</li></ul></details>


author_association: COLLABORATOR