<p dir="auto">The <a href="https://playwright.dev/docs/release-notes" rel="nofollow">Release notes</a> page contains various anchors for convenience, however the anchors within each version do not contain the version, and thus the release of a new version often "clobbers" (by adding a higher-on-the-page duplicate) older anchors.</p>
<p dir="auto">This may cause confusion, for example if someone had used <a href="https://playwright.dev/docs/release-notes#playwright-test" rel="nofollow">https://playwright.dev/docs/release-notes#playwright-test</a> to link to the "Playwright Test" section of the "Version 1.13" release notes, which now points to the "Playwright Test" section of the "Version 1.14" release notes.</p>
<p dir="auto">A simple (in theory) solution: include the version in the anchor as needed. In the example I gave above:<br>
<a href="https://playwright.dev/docs/release-notes#playwright-test" rel="nofollow">https://playwright.dev/docs/release-notes#playwright-test</a><br>
... might become:<br>
<a href="https://playwright.dev/docs/release-notes#v1.13-playwright-test" rel="nofollow">https://playwright.dev/docs/release-notes#v1.13-playwright-test</a><br>
(or something like that)</p>
<p dir="auto">I took a quick look through the repo (found <a href="https://github.com/microsoft/playwright/blob/master/docs/development/releasing.md">docs/development/releasing.md</a> &amp; <a href="https://github.com/microsoft/playwright/blob/master/utils/draft_release_notes.sh">utils/draft_release_notes.sh</a>), wasn't clear how this might be accomplished.</p>
<h3 dir="auto">System info</h3>
<ul dir="auto">
<li>Playwright Version: [v1.31.2 to v1.34.0] All versions are tested with corresponding image and npm package version.</li>
<li>Operating System: [Docker playwright:v1.34.0, etc]</li>
<li>Other info:</li>
</ul>
<h3 dir="auto">Source code</h3>
<ul class="contains-task-list">
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> I provided exact source code that allows reproducing the issue locally.</li>
</ul>




<p dir="auto"><strong>Config file</strong></p>
<div class="highlight highlight-source-js notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="// playwright.config.ts
import { defineConfig, devices } from '@playwright/test';

export default defineConfig({
  webServer: {
    command: 'node ./start-server.js',
    url: 'http://localhost:10039', // I also tested with 127.0.0.1 with the same result.
    timeout: 120 * 1000,
    reuseExistingServer: false
  },
  use: {
    baseUrl: 'http://localhost:10039'
  }
});"><pre class="notranslate"><span class="pl-c">// playwright.config.ts</span>
<span class="pl-k">import</span> <span class="pl-kos">{</span> <span class="pl-s1">defineConfig</span><span class="pl-kos">,</span> <span class="pl-s1">devices</span> <span class="pl-kos">}</span> <span class="pl-k">from</span> <span class="pl-s">'@playwright/test'</span><span class="pl-kos">;</span>

<span class="pl-k">export</span> <span class="pl-k">default</span> <span class="pl-en">defineConfig</span><span class="pl-kos">(</span><span class="pl-kos">{</span>
  <span class="pl-c1">webServer</span>: <span class="pl-kos">{</span>
    <span class="pl-c1">command</span>: <span class="pl-s">'node ./start-server.js'</span><span class="pl-kos">,</span>
    <span class="pl-c1">url</span>: <span class="pl-s">'http://localhost:10039'</span><span class="pl-kos">,</span> <span class="pl-c">// I also tested with 127.0.0.1 with the same result.</span>
    <span class="pl-c1">timeout</span>: <span class="pl-c1">120</span> <span class="pl-c1">*</span> <span class="pl-c1">1000</span><span class="pl-kos">,</span>
    <span class="pl-c1">reuseExistingServer</span>: <span class="pl-c1">false</span>
  <span class="pl-kos">}</span><span class="pl-kos">,</span>
  <span class="pl-c1">use</span>: <span class="pl-kos">{</span>
    <span class="pl-c1">baseUrl</span>: <span class="pl-s">'http://localhost:10039'</span>
  <span class="pl-kos">}</span>
<span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">;</span></pre></div>
<p dir="auto"><strong>/etc/hosts</strong></p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="127.0.0.1    localhost
::1    localhost ip6-localhost ip6-loopback
..."><pre class="notranslate"><code class="notranslate">127.0.0.1    localhost
::1    localhost ip6-localhost ip6-loopback
...
</code></pre></div>
<p dir="auto">$http_proxy, $https_proxy, $no_proxy, and their upper case versions are all unset.</p>
<p dir="auto">.yarnrc includes proxy and https-proxy settings.</p>
<p dir="auto"><strong>Steps</strong></p>
<ul dir="auto">
<li>Run <code class="notranslate">DEBUG=pw:webserver npx playwright test</code></li>
</ul>
<p dir="auto"><strong>Expected</strong></p>
<p dir="auto">Ignore other proxy envs (like npm_config_proxy) other than http_proxy, https_proxy to match browser behavior.</p>
<p dir="auto">Playwright v.1.31.1 and below.</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="$ npx playwright test
[timestamp] pw:server HTTP GET: http://localhost:10039/
[timestamp] pw:server Error while checking if http://localhost:10039/ is available: connect ECONNREFUSED ::1:10039
[timestamp] pw:server Starting WebServer process node ./start-server.js
[timestamp] pw:server Process started
[timestamp] pw:server Waiting for availability...
[timestamp] pw:server HTTP GET http://localhost:10039/
[timestamp] pw:server Error while checking if http://localhost:10039/ is available: connect ECONNREFUSED ::1:10039
[timestamp] pw:server Waiting 100ms
...
[timestamp] pw:server HTTP GET: http://localhost:10039/
[around 20s] pw:server HTTP Status: 200
[timestamp] pw:server WebServer available"><pre class="notranslate">$ npx playwright <span class="pl-c1">test</span>
[timestamp] pw:server HTTP GET: http://localhost:10039/
[timestamp] pw:server Error <span class="pl-k">while</span> checking <span class="pl-k">if</span> http://localhost:10039/ is available: connect ECONNREFUSED ::1:10039
[timestamp] pw:server Starting WebServer process node ./start-server.js
[timestamp] pw:server Process started
[timestamp] pw:server Waiting <span class="pl-k">for</span> availability...
[timestamp] pw:server HTTP GET http://localhost:10039/
[timestamp] pw:server Error <span class="pl-k">while</span> checking <span class="pl-k">if</span> http://localhost:10039/ is available: connect ECONNREFUSED ::1:10039
[timestamp] pw:server Waiting 100ms
...
[timestamp] pw:server HTTP GET: http://localhost:10039/
[around 20s] pw:server HTTP Status: 200
[timestamp] pw:server WebServer available</pre></div>
<p dir="auto"><strong>Actual</strong></p>
<p dir="auto">Network pinging uses other proxy envs (like npm_config_proxy) other than http_proxy, https_proxy.</p>
<p dir="auto">Playwright v1.31.2 and above. I am only able to reproduce it in our company's GitLab CI K8S environment. I tried reproducing it locally (Podman container) and v1.31.2 and above works fine.</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="$ npx playwright test
[timestamp] pw:server HTTP GET: http://localhost:10039/
[timestamp] pw:server HTTP Status: 407
[timestamp] pw:server Starting WebServer process node ./start-server.js
[timestamp] pw:server Process started
[timestamp] pw:server Waiting for availability...
[timestamp] pw:server HTTP GET http://localhost:10039/
[timestamp] pw:server HTTP Status: 407
[timestamp] pw:server Waiting 100ms
...
[timestamp] pw:server HTTP GET: http://localhost:10039/
[timestamp] pw:server HTTP Status: 407
Error: Timed out waiting 120000ms from config.webServer.
error Command failed with exit code 1."><pre class="notranslate">$ npx playwright <span class="pl-c1">test</span>
[timestamp] pw:server HTTP GET: http://localhost:10039/
[timestamp] pw:server HTTP Status: 407
[timestamp] pw:server Starting WebServer process node ./start-server.js
[timestamp] pw:server Process started
[timestamp] pw:server Waiting <span class="pl-k">for</span> availability...
[timestamp] pw:server HTTP GET http://localhost:10039/
[timestamp] pw:server HTTP Status: 407
[timestamp] pw:server Waiting 100ms
...
[timestamp] pw:server HTTP GET: http://localhost:10039/
[timestamp] pw:server HTTP Status: 407
Error: Timed out waiting 120000ms from config.webServer.
error Command failed with <span class="pl-c1">exit</span> code 1.</pre></div>
<p dir="auto">Seeing the changes of v1.31.2 related to webServer (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1601121247" data-permission-text="Title is private" data-url="https://github.com/microsoft/playwright/issues/21227" data-hovercard-type="issue" data-hovercard-url="/microsoft/playwright/issues/21227/hovercard" href="https://github.com/microsoft/playwright/issues/21227">#21227</a>), I made my own debug script. But my script runs fine in v1.31.2 and above:</p>
<p dir="auto"><strong>test-server.js</strong></p>
<div class="highlight highlight-source-js notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="const utils = require('playwright-core/lib/utils');
const {httpRequest} = utils;

httpRequest(
  {
    url: 'http://localhost:10039/',
    headers: {Accept: '*/*'},
    rejectUnauthorized: true,
  },
  res =&gt; {
    res.resume();
    const statusCode = res.statusCode;
    console.log(statusCode);
    
    let body = '';
    res.on('data', chunk =&gt; { body += chunk; };
    res.on('end', () =&gt; { console.log(body); });
  },
  console.error,
)

/*
node ./start-server.js &amp;
sleep 30
node ./test-server.js
*/

/*
200
&lt;!doctype html&gt;...
*/"><pre class="notranslate"><span class="pl-k">const</span> <span class="pl-s1">utils</span> <span class="pl-c1">=</span> <span class="pl-en">require</span><span class="pl-kos">(</span><span class="pl-s">'playwright-core/lib/utils'</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
<span class="pl-k">const</span> <span class="pl-kos">{</span>httpRequest<span class="pl-kos">}</span> <span class="pl-c1">=</span> <span class="pl-s1">utils</span><span class="pl-kos">;</span>

<span class="pl-en">httpRequest</span><span class="pl-kos">(</span>
  <span class="pl-kos">{</span>
    <span class="pl-c1">url</span>: <span class="pl-s">'http://localhost:10039/'</span><span class="pl-kos">,</span>
    <span class="pl-c1">headers</span>: <span class="pl-kos">{</span><span class="pl-c1">Accept</span>: <span class="pl-s">'*/*'</span><span class="pl-kos">}</span><span class="pl-kos">,</span>
    <span class="pl-c1">rejectUnauthorized</span>: <span class="pl-c1">true</span><span class="pl-kos">,</span>
  <span class="pl-kos">}</span><span class="pl-kos">,</span>
  <span class="pl-s1">res</span> <span class="pl-c1">=&gt;</span> <span class="pl-kos">{</span>
    <span class="pl-s1">res</span><span class="pl-kos">.</span><span class="pl-en">resume</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
    <span class="pl-k">const</span> <span class="pl-s1">statusCode</span> <span class="pl-c1">=</span> <span class="pl-s1">res</span><span class="pl-kos">.</span><span class="pl-c1">statusCode</span><span class="pl-kos">;</span>
    <span class="pl-smi">console</span><span class="pl-kos">.</span><span class="pl-en">log</span><span class="pl-kos">(</span><span class="pl-s1">statusCode</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
    
    <span class="pl-k">let</span> <span class="pl-s1">body</span> <span class="pl-c1">=</span> <span class="pl-s">''</span><span class="pl-kos">;</span>
    <span class="pl-s1">res</span><span class="pl-kos">.</span><span class="pl-en">on</span><span class="pl-kos">(</span><span class="pl-s">'data'</span><span class="pl-kos">,</span> <span class="pl-s1">chunk</span> <span class="pl-c1">=&gt;</span> <span class="pl-kos">{</span> <span class="pl-s1">body</span> <span class="pl-c1">+=</span> <span class="pl-s1">chunk</span><span class="pl-kos">;</span> <span class="pl-kos">}</span><span class="pl-kos"></span><span class="pl-kos">;</span>
    <span class="pl-s1">res</span><span class="pl-kos">.</span><span class="pl-en">on</span><span class="pl-kos">(</span><span class="pl-s">'end'</span><span class="pl-kos">,</span> <span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=&gt;</span> <span class="pl-kos">{</span> <span class="pl-smi">console</span><span class="pl-kos">.</span><span class="pl-en">log</span><span class="pl-kos">(</span><span class="pl-s1">body</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
  <span class="pl-kos">}</span><span class="pl-kos">,</span>
  <span class="pl-smi">console</span><span class="pl-kos">.</span><span class="pl-c1">error</span><span class="pl-kos">,</span>
<span class="pl-kos">)</span>

<span class="pl-c">/*</span>
<span class="pl-c">node ./start-server.js &amp;</span>
<span class="pl-c">sleep 30</span>
<span class="pl-c">node ./test-server.js</span>
<span class="pl-c">*/</span>

<span class="pl-c">/*</span>
<span class="pl-c">200</span>
<span class="pl-c">&lt;!doctype html&gt;...</span>
<span class="pl-c">*/</span></pre></div>
<p dir="auto">Removing webServer config and running this also works fine:</p>
<div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="node ./start-server.js &amp;
sleep 30
npx playwright test"><pre class="notranslate">node ./start-server.js <span class="pl-k">&amp;</span>
sleep 30
npx playwright <span class="pl-c1">test</span></pre></div>