[microsoft/playwright][BUG] VS Code 不发送 selenium 标头

2024-04-09 162 views
0
系统信息
  • 剧作家版本:v1.38.1
  • 剧作家 VS 代码:v1.0.15
  • 操作系统:macOS 12.3
  • 浏览器:铬
源代码
// .vscode/settings.json
{
  "playwright.env": {
    "SELENIUM_REMOTE_URL": "http://remote-url:4444/wd/hub",
    "SELENIUM_REMOTE_CAPABILITIES": {
      "browserName": "chrome",
      "browserVersion": "114.0"
    },
    "SELENIUM_REMOTE_HEADERS": {
      "Authorization": "OAuth token"
    }
  }
}

测试文件(独立)

it('fail', async ({ page }) => {
  await page.goto('about:blank');

  await expect(page).toHaveURL('foo');
});

脚步

  • 例如,在 docker 容器中运行远程集线器(我使用 selenoid)
  • 从 vscode 运行测试

预期的

Pwt 将 oauth 标头发送到集线器,一切正常。

实际的

Pwt 不发送 oauth 标头,测试失败并显示Error connecting to Selenium at http://remote-url:4444/wd/hub/session: OAuth authorization is required.

没有 vscode 也能正常工作。

回答

8

@DudaGod 这不应该报告给 VSCode 存储库吗?

5

变量名称应该是字符串(JSON.stringify 的结果),尝试运行:

{
  "playwright.env": {
    "SELENIUM_REMOTE_URL": "http://remote-url:4444/wd/hub",
    "SELENIUM_REMOTE_CAPABILITIES": "{\"browserName\":\"chrome\",\"browserVersion\":\"114.0\"}",
    "SELENIUM_REMOTE_HEADERS": "{\"Authorization\":\"OAuth token\"}"
  }
}

那行得通吗?

8

那行得通吗?

是的,谢谢。这是预期的行为吗?

5

从剧作家的角度来看确实如此。这是环境变量的配置,始终是字符串名称 -> 字符串值。只是 VSCode UI 允许您编写任意 json 作为值。

4

我明白了,但我觉得不太方便。

一般来说,如果 pwt 在使用 vscode 扩展运行测试时使用配置中的 selenium 环境变量会很方便。在我们的项目中,我们在fixture中设置这些selenium环境变量。从 cli 运行测试时一切正常。但是当从 vscode 插件运行测试时,浏览器会在本地启动。

这是预期的行为吗?

4

是的,我们可以在扩展中支持这一点。

9

@dgozman 在此 PR - https://github.com/microsoft/playwright-vscode/pull/380/files中,您只需从文件中字符串化环境变量.vscode/settings.json

但在这篇评论中,我描述了另一个问题:vscode 扩展不使用 pwt config/fixture/etc 中的 envs。这意味着行为会根据 cli 或 vscode 插件的启动而变化。

我应该创建另一个关于它的问题吗?

4

@DudaGod 我错过了其他评论,感谢您指出。

如何在配置中设置环境变量?我相信 VSCode 扩展和 cli 之间应该没有区别。

5

我使用简单的配置:

// playwright.config.ts
import { defineConfig, devices } from "@playwright/test";

process.env.DEBUG = "pw:browser";
process.env.SELENIUM_REMOTE_URL = "http://localhost:4444/wd/hub";
process.env.SELENIUM_REMOTE_CAPABILITIES = JSON.stringify({
    browserName: "chrome",
});

export default defineConfig({
    projects: [
        {
            name: "chromium",
            use: {...devices["Desktop Chrome"]},
        },
    ],
});

以及测试代码:

// test.spec.ts
import { test } from '@playwright/test';

test('test', async ({page}) => {
    await page.goto('https://playwright.dev/');
});

如何重现:

  • 使用 VS 代码扩展运行测试
  • 测试在本地浏览器中运行

同时我在test results选项卡中看到浏览器日志。这意味着已经process.env.DEBUG被使用了。但 Selenium envs 没有。

1

@DudaGod 你打开了“显示浏览器”复选框吗?这可以解释这种行为,因为它强制显示本地浏览器。

0

是的,你是对的,谢谢。看起来我很久以前就设置过了,结果忘了关掉它。