如何在 python selenium chrome webdriver 中设置标头

Мих*_*мин 8 python selenium selenium-chromedriver

我无法找到如何在 selenium chrome webdriver (python) 中设置请求标头。我需要设置“主机”标头。我尝试过:

from selenium import webdriver
from pyvirtualdisplay import Display
from selenium.webdriver import DesiredCapabilities


url = 'http://localhost:888/test'

display = Display(visible=0, size=(800, 800))
display.start()

desired_capabilities = DesiredCapabilities.CHROME.copy()
desired_capabilities['chrome.page.customHeaders.host'] = 'test.local'

driver = webdriver.Chrome('/tmp/chromedriver',
                          desired_capabilities=desired_capabilities)

driver.get(url)
Run Code Online (Sandbox Code Playgroud)

结果:

GET /test HTTP/1.1
Host: localhost:888
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/53.0.2785.143 Chrome/53.0.2785.143 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
Run Code Online (Sandbox Code Playgroud)

所以,我期望标题host:test.local但发现Host: localhost:888

我做错了什么?我找不到如何使用 Chrome webdriver 设置标头:(

pbu*_*uck -1

Host请求标头中是服务器(目的地)的名称,这是由您的driver.get(url).

Host请求标头是使用 nodejs 从 serverUrl 构造的url.parse(serverUrl)。因此,您无法将主机标头设置为“b”的请求发送到服务器“a”。

这意味着如果您的服务器托管在本地计算机上,您(可能)可以通过以下方式访问它http://localhost:888/test,在这种情况下,您的标头将包括:

GET /test HTTP/1.1
Host: localhost:888
Run Code Online (Sandbox Code Playgroud)

或访问它http://127.0.0.1:888/导致

GET /test HTTP/1.1
Host: 127.0.0.1:888
Run Code Online (Sandbox Code Playgroud)

或者访问它http://Johns-iMac.local:888/test...假设您使用的 iMac 主机名为“Johns-iMac.local”:

GET /test HTTP/1.1
Host: Johns-iMac.local:888
Run Code Online (Sandbox Code Playgroud)

或者使用您的网络接口 IP 地址访问它,也许http://192.168.1.5:888/test

GET /test HTTP/1.1
Host: 192.168.1.5:888
Run Code Online (Sandbox Code Playgroud)

这是您的解决方案的关键:您需要使用 URL 访问它http://test.local:888/test

因此,您想要做的是修改 DNS,以便您的计算机认为主机test.local具有 IP 地址127.0.0.1(或您喜欢的任何地址)。

执行此操作取决于您的操作系统,但通常只需在文件末尾添加一行即可/etc/hosts

test.local    127.0.0.1
Run Code Online (Sandbox Code Playgroud)

(您可能需要重新启动)。

从现在开始,所有请求都test.local将发送到服务器,127.0.0.1http://test.local:888/test为您提供请求标头

GET /test HTTP/1.1
Host: test.local:888
Run Code Online (Sandbox Code Playgroud)
  • 注意:我说您的服务器“可能”响应任何/所有这些不同的请求。确实如此,假设它配置为响应默认主机,或者配置了与您尝试访问的任何主机相匹配的 VirtualHost (Apache) 或服务器块 (nginx)。