# Selenium 代理：用静态 ISP IP 运行 Chrome 和 Firefox | ProxyJam

如何在 Selenium 中为 Chrome 和 Firefox 设置代理，为什么把凭据写进 --proxy-server 会失败，以及如何用 IP 白名单代替凭据。附测试过的 Python 代码。

- Canonical: https://proxyjam.com/zh/integrations/selenium/
- Updated: 2026-10-23
- Language: zh

让 Selenium 下的 Chrome 或 Firefox 通过一个静态 ISP 地址运行。本页的每个示例在发布前都在本地代理上实际运行过，哪些做法行不通也直接写明。


在 Chrome 中，把 `--proxy-server=http://HOST:PORT` 作为参数传入；在 Firefox 中，在选项上设置一个手动 Proxy。Firefox 可以通过 Selenium 的 WebDriver BiDi 处理器 `add_authentication_handler` 应答代理的密码提示。在我们的测试中 Chrome 做不到：它会忽略 `--proxy-server` 中的凭据，两个 BiDi 处理器也都超时了。对于 Chrome，请把运行测试的 IP 加入代理的白名单，这样无论 HTTP 还是 SOCKS5，代理都不再需要凭据。


## 在 Selenium 中设置代理

1. **找到运行测试的公网 IP** 即互联网看到的那台机器或 CI 运行器的地址，而不是它的本地地址。[“我的 IP 是什么”](/zh/what-is-my-ip/)会显示这个地址。
2. **把这个 IP 加入代理的白名单** 一次 API 调用 `PUT /orders/ORDER_ID/whitelist`，或 MCP 服务器的 `set_proxy_whitelist` 工具；控制台目前还没有相应的设置项。白名单接受 IPv4 地址，每次调用都会替换整个列表。设置白名单期间，代理只接受列表中的地址，该订单的用户名和密码将不再起作用；发送一个空列表即可关闭白名单，密码登录随即恢复。
3. **从订单中复制主机和端口** 来自“我的代理”或 API。白名单设置好后，就不需要用户名和密码了。
4. **在浏览器选项中设置代理** Chrome：`--proxy-server=http://HOST:PORT`，把代理切换为 SOCKS5 后则用 `socks5://HOST:PORT`。Firefox：一个带 `httpProxy` 和 `sslProxy` 的手动 `Proxy`。
5. **打开一个页面，检查出口地址** 在被驱动的浏览器中打开一次“我的 IP 是什么”，确认显示的是您购买的地址，然后再运行测试套件。

## 测试过的 Selenium 4 Python 代码

Firefox 密码示例会发送用户名和密码，因此需要一个未设置白名单的订单。其他浏览器示例假定您机器的 IP 已在代理的白名单中；SOCKS5 示例还需要先把代理切换为 SOCKS5，切换后会得到一个新端口。请把大写内容替换为您订单中的值，并替换白名单调用中的 ORDER_ID、YOUR_API_KEY 和 YOUR_IP。

### Chrome

通过 HTTP 代理运行 Chrome。

```
# The proxy has your machine's IP on its whitelist, so no credentials
# are sent: Chrome ignores them in --proxy-server anyway.
from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument("--headless=new")  # remove to watch the browser
options.add_argument("--proxy-server=http://HOST:PORT")

driver = webdriver.Chrome(options=options)
try:
    driver.get("https://example.com/")
    print(driver.title)
finally:
    driver.quit()
```

### Firefox 密码

Firefox 应答代理的密码提示。

```
# Selenium 4.51+ with WebDriver BiDi; pip install selenium
from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy, ProxyType

options = webdriver.FirefoxOptions()
options.enable_bidi = True
options.add_argument("-headless")  # remove to watch the browser
options.proxy = Proxy({
    "proxyType": ProxyType.MANUAL,
    "httpProxy": "HOST:PORT",
    "sslProxy": "HOST:PORT",
})

driver = webdriver.Firefox(options=options)
try:
    # Answers the proxy's 407 with your username and password
    driver.network.add_authentication_handler(
        lambda request: request.provide_credentials("USERNAME", "PASSWORD")
    )
    driver.get("https://example.com/")
    print(driver.title)
finally:
    driver.quit()
```

### Firefox

通过已加入白名单的 HTTP 代理运行 Firefox。

```
# The proxy has your machine's IP on its whitelist, so no credentials
# are sent. For a password instead, see selenium-firefox-auth.
from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy, ProxyType

options = webdriver.FirefoxOptions()
options.add_argument("-headless")  # remove to watch the browser
options.proxy = Proxy({
    "proxyType": ProxyType.MANUAL,
    "httpProxy": "HOST:PORT",
    "sslProxy": "HOST:PORT",
})

driver = webdriver.Firefox(options=options)
try:
    driver.get("https://example.com/")
    print(driver.title)
finally:
    driver.quit()
```

### Chrome SOCKS5

通过 SOCKS5 代理运行 Chrome。

```
# Switch the proxy to SOCKS5 first, then use the port the order shows.
# The whitelist applies to SOCKS5 as well, so no credentials here either.
from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument("--headless=new")  # remove to watch the browser
options.add_argument("--proxy-server=socks5://HOST:PORT")

driver = webdriver.Chrome(options=options)
try:
    driver.get("https://example.com/")
    print(driver.title)
finally:
    driver.quit()
```

### 白名单调用

把您的 IP 加入代理的白名单。

```
# Put the public IPv4 address your code runs from on the proxy's
# whitelist. Replaces the list; an empty list turns whitelisting off
# and the proxy falls back to username and password.
curl -X PUT "https://api.proxyjam.com/public/v1/orders/ORDER_ID/whitelist" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"whitelisted_ips": ["YOUR_IP"]}'
```


## Selenium 中的代理选项，逐个浏览器对比

|  | HTTP 代理 | SOCKS5 代理 | 用户名和密码 |
|---|---|---|---|
| Chrome | --proxy-server=http://HOST:PORT | --proxy-server=socks5://HOST:PORT | 在 --proxy-server 中被忽略；请使用白名单 |
| Firefox | 带 httpProxy 和 sslProxy 的 Proxy | 带 socksProxy 和 socksVersion 5 的 Proxy | 通过 add_authentication_handler（BiDi）可行，限 HTTP |
| Chrome，BiDi 处理器 | add_auth_handler 和 add_authentication_handler 都超时了 | 未测试 | 在以后的 Selenium 或 Chrome 改变这一点之前，请使用白名单 |

于 2026-10-22 使用 Selenium 4.51 以及无头模式下的 Chrome 和 Firefox 测试，所用的本地代理在一个端口上要求密码，在另一个端口上接受已加入白名单的客户端。


## 浏览器测试能从这个地址得到什么

- **浏览器中无需密码:** 白名单放行您运行器的 IPv4 地址，因此选项和日志中都不会出现机密
- **两种浏览器协议:** 普通页面用 http://，订单切换后用 socks5://
- **每次运行来源相同:** 昨天和今天的运行都从同一个 IP 发出，该 IP 在整个计费周期内保持不变
- **并行驱动:** 多个驱动可以共用这个地址，也可以每个驱动各用一个

## Selenium 与代理的常见问题

### 把凭据写进 --proxy-server

Chrome 会不报错地丢弃该参数中的用户名和密码，不带凭据去连接，然后收到代理返回的 407。页面随即加载失败，看起来像网络问题，而不像身份验证问题。

### 驱动下载也走了代理

当 Firefox 选项带有代理时，Selenium Manager 会通过同一个代理下载驱动。如果代理只能用密码验证，这次下载会在浏览器启动前失败；使用白名单则会成功。

### 白名单里的地址不对

CI 运行器的公网出口 IP 往往与您的笔记本电脑不同，有些在每次运行之间还会变化。请把运行测试的那个地址加入白名单，并在它变化时更新，因为每次调用都会替换整个列表。

### 切换之前就在浏览器中用 SOCKS5

设为 HTTP 的地址不会响应 SOCKS5。请先在订单上切换代理，并使用随后显示的端口；只改参数中的协议名，浏览器将无法连接。


## 关于 Selenium 代理的问题

### 如何在 Selenium 中使用需要身份验证的代理？

在 Firefox 中，启用 WebDriver BiDi，并用 driver.network.add_authentication_handler 注册一个提供用户名和密码的处理器；这在 Selenium 4.51 中可行。在 Chrome 中，我们测试过的所有发送凭据的方法都不可行：它会忽略代理开关中的凭据，两个 BiDi 处理器也都超时了。对于 Chrome，请把运行测试的公网 IP 加入白名单，浏览器就能完全不带凭据地连接。

### 如何在 Python Selenium 中为 Chrome 设置代理？

创建 ChromeOptions，添加参数 --proxy-server=http://HOST:PORT，再把这些选项传给 webdriver.Chrome。如需 SOCKS5，请在订单上把代理切换为 SOCKS5，并使用 socks5://HOST:PORT，端口用订单随后显示的那个。

### IP 白名单对 SOCKS5 有效吗？

有效。已加入白名单的地址无需凭据即可通过 HTTP 和 SOCKS5 连接，正因如此，SOCKS5 才能在 Chrome 中使用，因为 Chrome 无法发送 SOCKS5 用户名和密码。白名单通过 API 或 MCP 服务器设置，接受 IPv4 地址。

### 测试套件中的每个浏览器可以使用不同的代理吗？

可以，每个驱动一个：代理是驱动启动时选项的一部分，所以两个驱动可以使用两个地址。无法更改正在运行的 Chrome 的代理；请改为启动一个新的驱动。

### 长时间运行的测试套件会中途换地址吗？

不会。驱动在退出前一直使用启动时的地址，而地址本身在整个计费周期内都分配给您。需要同时使用大量来源的测试套件需要一个会更换来源的代理池，而这还没有上市销售。

### 代理可以用来做什么？

对您自己的产品进行端到端测试、按地区检查您的网店、广告验证、价格调研和品牌保护，按照我们的可接受使用政策都无需事先审核。驱动浏览器去破解验证码、机器人防护、速率限制或账号封禁则是另一回事：这个地址做不到，政策也禁止尝试。


静态地址让浏览器测试可以复现：同一个测试套件下周再运行，仍从同一个地方到达，所以结果的变化来自网站本身。在 [ISP 代理](/zh/isp-proxies/)页面订购地址，查看[价格](/zh/pricing/)，并通过 [Python requests](/zh/integrations/python-requests/) 指南在普通 HTTP 调用中设置同一个地址。



## 参考来源

- [Selenium documentation, Proxy](https://www.selenium.dev/documentation/webdriver/drivers/options/#proxy)，在浏览器选项中设置代理
- [Selenium documentation, Selenium Manager](https://www.selenium.dev/documentation/selenium_manager/)，驱动如何下载，以及下载时会使用已配置的代理
- [Chromium, network settings](https://www.chromium.org/developers/design-documents/network-settings/)，`--proxy-server` 开关及其协议




Selenium 本身不转发流量：它启动一个浏览器，并把代理作为浏览器选项的一部分交给它。这就是为什么 Chrome 和 Firefox 的做法不同，也是为什么大多数设置都失败在代理身份验证上。

## 在 Chrome 和 Firefox 中使用 Python Selenium 代理

Chrome 从命令行开关读取代理，Firefox 从其选项上的代理对象读取。两者都无需额外设置即可使用已加入白名单的代理；Firefox 还可以通过 WebDriver BiDi 应答代理的密码提示，而在我们的测试中 Chrome 没有做到这一点。

