把凭据写进 --proxy-server
Chrome 会不报错地丢弃该参数中的用户名和密码,不带凭据去连接,然后收到代理返回的 407。页面随即加载失败,看起来像网络问题,而不像身份验证问题。
简而言之: 在 Chrome 中,把
--proxy-server=http://HOST:PORT作为参数传入;在 Firefox 中,在选项上设置一个手动 Proxy。Firefox 可以通过 Selenium 的 WebDriver BiDi 处理器add_authentication_handler应答代理的密码提示。在我们的测试中 Chrome 做不到:它会忽略--proxy-server中的凭据,两个 BiDi 处理器也都超时了。对于 Chrome,请把运行测试的 IP 加入代理的白名单,这样无论 HTTP 还是 SOCKS5,代理都不再需要凭据。
Selenium 本身不转发流量:它启动一个浏览器,并把代理作为浏览器选项的一部分交给它。这就是为什么 Chrome 和 Firefox 的做法不同,也是为什么大多数设置都失败在代理身份验证上。
Chrome 从命令行开关读取代理,Firefox 从其选项上的代理对象读取。两者都无需额外设置即可使用已加入白名单的代理;Firefox 还可以通过 WebDriver BiDi 应答代理的密码提示,而在我们的测试中 Chrome 没有做到这一点。
即互联网看到的那台机器或 CI 运行器的地址,而不是它的本地地址。“我的 IP 是什么”会显示这个地址。
一次 API 调用 PUT /orders/ORDER_ID/whitelist,或 MCP 服务器的 set_proxy_whitelist 工具;控制台目前还没有相应的设置项。白名单接受 IPv4 地址,每次调用都会替换整个列表。设置白名单期间,代理只接受列表中的地址,该订单的用户名和密码将不再起作用;发送一个空列表即可关闭白名单,密码登录随即恢复。
来自“我的代理”或 API。白名单设置好后,就不需要用户名和密码了。
Chrome:--proxy-server=http://HOST:PORT,把代理切换为 SOCKS5 后则用 socks5://HOST:PORT。Firefox:一个带 httpProxy 和 sslProxy 的手动 Proxy。
在被驱动的浏览器中打开一次“我的 IP 是什么”,确认显示的是您购买的地址,然后再运行测试套件。
# 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()
# 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()
# 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()
# 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()
# 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"]}'
Firefox 密码示例会发送用户名和密码,因此需要一个未设置白名单的订单。其他浏览器示例假定您机器的 IP 已在代理的白名单中;SOCKS5 示例还需要先把代理切换为 SOCKS5,切换后会得到一个新端口。请把大写内容替换为您订单中的值,并替换白名单调用中的 ORDER_ID、YOUR_API_KEY 和 YOUR_IP。
| 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 改变这一点之前,请使用白名单 |
Chrome 会不报错地丢弃该参数中的用户名和密码,不带凭据去连接,然后收到代理返回的 407。页面随即加载失败,看起来像网络问题,而不像身份验证问题。
当 Firefox 选项带有代理时,Selenium Manager 会通过同一个代理下载驱动。如果代理只能用密码验证,这次下载会在浏览器启动前失败;使用白名单则会成功。
CI 运行器的公网出口 IP 往往与您的笔记本电脑不同,有些在每次运行之间还会变化。请把运行测试的那个地址加入白名单,并在它变化时更新,因为每次调用都会替换整个列表。
设为 HTTP 的地址不会响应 SOCKS5。请先在订单上切换代理,并使用随后显示的端口;只改参数中的协议名,浏览器将无法连接。
在 Firefox 中,启用 WebDriver BiDi,并用 driver.network.add_authentication_handler 注册一个提供用户名和密码的处理器;这在 Selenium 4.51 中可行。在 Chrome 中,我们测试过的所有发送凭据的方法都不可行:它会忽略代理开关中的凭据,两个 BiDi 处理器也都超时了。对于 Chrome,请把运行测试的公网 IP 加入白名单,浏览器就能完全不带凭据地连接。
创建 ChromeOptions,添加参数 --proxy-server=http://HOST:PORT,再把这些选项传给 webdriver.Chrome。如需 SOCKS5,请在订单上把代理切换为 SOCKS5,并使用 socks5://HOST:PORT,端口用订单随后显示的那个。
有效。已加入白名单的地址无需凭据即可通过 HTTP 和 SOCKS5 连接,正因如此,SOCKS5 才能在 Chrome 中使用,因为 Chrome 无法发送 SOCKS5 用户名和密码。白名单通过 API 或 MCP 服务器设置,接受 IPv4 地址。 SOCKS5
可以,每个驱动一个:代理是驱动启动时选项的一部分,所以两个驱动可以使用两个地址。无法更改正在运行的 Chrome 的代理;请改为启动一个新的驱动。
不会。驱动在退出前一直使用启动时的地址,而地址本身在整个计费周期内都分配给您。需要同时使用大量来源的测试套件需要一个会更换来源的代理池,而这还没有上市销售。
对您自己的产品进行端到端测试、按地区检查您的网店、广告验证、价格调研和品牌保护,按照我们的可接受使用政策都无需事先审核。驱动浏览器去破解验证码、机器人防护、速率限制或账号封禁则是另一回事:这个地址做不到,政策也禁止尝试。 可接受使用政策
--proxy-server 开关及其协议