Skip to content

[BUG]: Host mapping is not respected on remote browsers when used with exposeNetwork #186

@ShaMan123

Description

@ShaMan123

Describe the bug
I use --host-resolver-rules to forward a baseURL to localhost.
This is useful in many testing scenarios (e.g. whitelisting).

This works when I run my tests on a local browser but doesn't work on remote browsers.
I assume it is related to the proxy server that playwright uses in the latter case.

I order to try to workaround this issue, I have tried to specify host mapping on my machine in the /etc/hosts file.
The same happens. It works on local browsers and doesn't work on remote browsers.
However, chrome says it respects the mapping when I query chrome://net-internals/#dns.

A Simple Reproduction

test.use({
  baseURL: "https://www.wikipedia.org/",
  launchOptions: {
    /** Map wikipedia to github */
    args: [`--host-resolver-rules=MAP www.wikipedia.org github.com`],
  },
});

test("Host Mapping", async ({ page, baseURL }, testInfo) => {
  // Should hit github.com
  await page.goto(baseURL, { waitUntil: "load" });
  await expect(page).toHaveScreenshot();
});

Expected behavior
Screenshot should show the github main page

Actual behavior
Screenshot shows the wikipedia main page

To Reproduce
Steps to reproduce the behavior:

  1. Add the following the playwright.config.ts
const baseURL = 'my.domain.com';

export default defineConfig({
  ...

  use: {
    baseURL,
    ignoreHTTPSErrors: true,
    launchOptions: {
      /** Map {@link baseURL} to {@link localhost} */
      args: [`--host-resolver-rules=MAP ${new URL(baseURL).host} 127.0.0.1:3000`]
    },
});
  1. Start a dev server on port 3000
  2. Run a test in HEADED mode (in order to open chrome diagnostics)
test("Host Mapping", async ({ page, baseURL }, testInfo) => {
  await page.goto("chrome://version", { waitUntil: "load" });
  await testInfo.attach("chrome-version", {
    body: (await page.textContent("body")) || "",
    contentType: "text/plain",
  });

  await page.goto("chrome://net-internals/#dns");
  await page.getByRole("button", { name: "Clear host cache" }).click();
  await page.getByRole("link", { name: "Sockets" }).click();
  await page.getByRole("button", { name: "Flush socket pools" }).click();
  await page.getByRole("link", { name: "DNS" }).click();
  await page.getByRole("textbox", { name: "example.com" }).click();
  await page
    .getByRole("textbox", { name: "example.com" })
    .fill(new URL(baseURL).hostname);
  await page.getByRole("button", { name: "Lookup" }).click();
  await expect(page.locator("#dns-view-dns-lookup-output")).toHaveText(
    /127\.0\.0\.1/
  );

  await page.goto("chrome://version", { waitUntil: "load" });
  await testInfo.attach("chrome-version", {
    body: await page.content(),
    contentType: "plain/html",
  });

  // Should hit localhost
  await page.goto(baseURL, { waitUntil: "networkidle" });
});

Expected behavior
Host mapping should be respected by the remote browser

Screenshots
If applicable, add screenshots to help explain your problem.

repro.mov
**chrome://version** output
<!DOCTYPE html><html id="t" dir="ltr" lang="en"><head>
    <meta charset="utf-8">
    <meta name="color-scheme" content="light dark">
    <title>About Version</title>

    <link rel="icon" type="image/png" sizes="32x32" href="chrome://theme/current-channel-logo">

    <link rel="stylesheet" href="chrome://resources/css/text_defaults.css">

    <link rel="stylesheet" href="chrome://version/about_version.css">


    <script type="module" src="about_version.js"></script>
  </head>

  <body>
    <div id="outer">
      <div id="logo">

        <!-- Version for themes. -->
        <picture>
          <source srcset="chrome://theme/IDR_PRODUCT_LOGO_WHITE,
                          chrome://theme/IDR_PRODUCT_LOGO_WHITE@2x 2x" media="(prefers-color-scheme: dark)">
          <source srcset="chrome://theme/IDR_PRODUCT_LOGO,
                          chrome://theme/IDR_PRODUCT_LOGO@2x 2x" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)">
          <img alt="Chromium logo" src="chrome://theme/IDR_PRODUCT_LOGO">
        </picture>


        <div id="company">The Chromium Authors</div>
        <div id="copyright">Copyright 2025 The Chromium Authors. All rights reserved.</div>
      </div>
      <table id="inner" cellpadding="0" cellspacing="0" border="0">
        <tbody><tr><td class="label">Chromium</td>
          <td class="version" id="version">
            <span id="copy-content">
              <span>134.0.6998.35</span>
              (<span>Official Build</span>)
              <span></span>
              <span>(64-bit)</span>
  
            </span>
            <button id="copy-to-clipboard" aria-label="Copy version string">
              <div id="copy-to-clipboard-icon"></div>
            </button>
          </td>
        </tr>
        <tr>
          <td class="label">Revision</td>
          <td class="version">
            <span>ea6ef4c2ac15ae95d2cfd65682da62c093415099-refs/branch-heads/6998@{#1472}</span>
          </td>
        </tr>

        <tr>
          <td class="label">OS</td>
          <td class="version" id="os_type">
            <span id="copy-os-content">
              <span>Linux</span>


            </span>
          </td>
        </tr>




        <tr><td class="label">JavaScript</td>
          <td class="version" id="js_engine">
            <span>V8</span>
            <span>13.4.114.14</span>
          </td>
        </tr>

        <tr><td class="label">User Agent</td>
          <td class="version" id="useragent">Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36</td>
        </tr>
        <tr><td class="label">Command Line</td>
          <td class="version" id="command_line"> /root/.cache/ms-playwright/chromium-1161/chrome-linux/chrome --disable-field-trial-config --disable-background-networking --disable-background-timer-throttling --disable-backgrounding-occluded-windows --disable-back-forward-cache --disable-breakpad --disable-client-side-phishing-detection --disable-component-extensions-with-background-pages --disable-component-update --no-default-browser-check --disable-default-apps --disable-dev-shm-usage --disable-extensions --disable-features=AcceptCHFrame,AutoExpandDetailsElement,AvoidUnnecessaryBeforeUnloadCheckSync,CertificateTransparencyComponentUpdater,DeferRendererTasksAfterInput,DestroyProfileOnBrowserClose,DialMediaRouteProvider,ExtensionManifestV2Disabled,GlobalMediaControls,HttpsUpgrades,ImprovedCookieControls,LazyFrameLoading,LensOverlay,MediaRouter,PaintHolding,ThirdPartyStoragePartitioning,Translate --allow-pre-commit-input --disable-hang-monitor --disable-ipc-flooding-protection --disable-popup-blocking --disable-prompt-on-repost --disable-renderer-backgrounding --force-color-profile=srgb --metrics-recording-only --no-first-run --enable-automation --password-store=basic --use-mock-keychain --no-service-autorun --export-tagged-pdf --disable-search-engine-choice-screen --unsafely-disable-devtools-self-xss-warnings --no-sandbox --proxy-server=socks5://127.0.0.1:42687 --proxy-bypass-list=&lt;-loopback&gt; --host-resolver-rules=MAP dev-web.collaboard.app 127.0.0.1:3000 --user-data-dir=/tmp/playwright_chromiumdev_profile-JOg6J6 --remote-debugging-pipe --no-startup-window --flag-switches-begin --flag-switches-end</td>
        </tr>

        <tr><td class="label">Executable Path</td>
          <td class="version" id="executable_path">/root/.cache/ms-playwright/chromium-1161/chrome-linux/chrome</td>
        </tr>
        <tr><td class="label">Profile Path</td>
          <td class="version" id="profile_path">/tmp/playwright_chromiumdev_profile-JOg6J6/Default</td>
        </tr>


        <tr id="variations-seed-section" hidden="">
          <td class="label">Variations Seed Type</td>
          <td class="version" id="variations-seed"></td>
        </tr>
        <tr id="variations-cmd-section">
          <td class="label">Command-line Variations</td>
          <td class="version-wide" id="variations-cmd" data-value="eyJkaXNhYmxlLWZlYXR1cmVzIjoiQWNjZXB0Q0hGcmFtZSxBdXRvRXhwYW5kRGV0YWlsc0VsZW1lbnQsQXZvaWRVbm5lY2Vzc2FyeUJlZm9yZVVubG9hZENoZWNrU3luYyxDZXJ0aWZpY2F0ZVRyYW5zcGFyZW5jeUNvbXBvbmVudFVwZGF0ZXIsRGVmZXJSZW5kZXJlclRhc2tzQWZ0ZXJJbnB1dCxEZXN0cm95UHJvZmlsZU9uQnJvd3NlckNsb3NlLERpYWxNZWRpYVJvdXRlUHJvdmlkZXIsRXh0ZW5zaW9uTWFuaWZlc3RWMkRpc2FibGVkLEdsb2JhbE1lZGlhQ29udHJvbHMsSHR0cHNVcGdyYWRlcyxJbXByb3ZlZENvb2tpZUNvbnRyb2xzLExhenlGcmFtZUxvYWRpbmcsTGVuc092ZXJsYXksTWVkaWFSb3V0ZXIsUGFpbnRIb2xkaW5nLFRoaXJkUGFydHlTdG9yYWdlUGFydGl0aW9uaW5nLFRyYW5zbGF0ZSIsImVuYWJsZS1mZWF0dXJlcyI6IlVrbVNhbXBsaW5nUmF0ZVx1MDAzQ1VrbVNhbXBsaW5nUmF0ZSIsImZvcmNlLWZpZWxkdHJpYWwtcGFyYW1zIjoiVWttU2FtcGxpbmdSYXRlLlNhbXBsZWRfTm9TZWVkX090aGVyOl9kZWZhdWx0X3NhbXBsaW5nLzEiLCJmb3JjZS1maWVsZHRyaWFscyI6IlVrbVNhbXBsaW5nUmF0ZS9TYW1wbGVkX05vU2VlZF9PdGhlciJ9">eyJkaXNhYmxlLWZlYXR1cmVzIjoiQWNjZXB0Q0hGcmFtZSxBdXRvRXhwYW5k...</td>
          <td>
            <button id="copy-variations-to-clipboard" aria-label="Copy variations string">
              <div id="copy-to-clipboard-icon"></div>
            </button>
          </td>
        </tr>
        <tr id="variations-section">
          <td class="label">Active Variations</td>
          <td class="version" id="variations-list">f4f00e05-ca7d8d80<br>9481ce98-3d47f4f4<br>2a426c03-3d47f4f4<br>70678518-dee66fa8<br>be338734-dee66fa8<br>5f9907a9-dee66fa8<br>8eeccb9a-dee66fa8<br>2b465683-dee66fa8<br>52fc7926-dee66fa8<br>bc9b361d-dee66fa8<br>a41a7188-dee66fa8<br>ff71bfdc-dee66fa8<br>e7cc79d5-dee66fa8<br>4b935545-3d47f4f4<br>9a38bae3-6046c8a7<br>2d1e43a3-3d47f4f4<br>386dc267-3d47f4f4<br>d69d967d-3695c92e<br></td>
        </tr>
        <tr id="sanitizer-section" hidden="">
          <td class="label">Sanitizer</td>
          <td class="version" id="sanitizer"></td>
        </tr>
      </tbody></table>
    </div>

    <div id="messages" role="alert" aria-live="polite" aria-relevant="additions">
    </div>
  

</body></html>

Setup information (please complete the following information):

  • Azure Subscription Id: 9fe9ffb9-c762-4e25-983b-3cc6a635a4c3
  • Workspace Name: CollaboardPlaywright
  • Service trace Id (if available):
  • Log snippet (if available):
  • Browser on which tests are executed (if applicable): chromium
  • Time range (in PST) when the issue was experienced: 5:00 4/4
  • Playwright Version: 1.51
  • Client machine OS: macOS
  • OS requested on Service: linux

Additional context
Add any other context about the problem here.

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions