tips:这个只是 selenium-wire 的简单说明

遇到的问题

测试环境原先是提供 host 方式来切换不同版本的测试环境,现在改成代理 + 不同请求头(nohost)来路由不同版本的测试环境。

自动化框架也需要进行对应修改,原版的 selenium/webdriver 支持代理,但不支持修改请求头。而通过 +fiddler/mitmproxy 的方式感觉过于小题大做了。

使用了 selenium-wire 来解决

google 到 selenium-wire,能解决这个问题。安装(>python3.6):

pip install selenium-wire

引入 selenium-wire 只需要以下改造:

wireOptions={
      'proxy': {
         'http': 'http://'+myProxy,
          'https': 'https://'+myProxy,
           'no_proxy': 'localhost,127.0.0.1'
      }
 }
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option("useAutomationExtension", False)
driver = webdriver.Chrome(executable_path=ChromeDriverPath,options=chrome_options,seleniumwire_options=wireOptions)

修改请求头

全局方式修改

driver.header_overrides=[
    ('.*xxx.xxx.com.*', {"ENV-ID":"1"})
]
driver.header_overrides={
"ENV-ID":"1",
"Proxy-Client-Ip":"67.220.90.13"
}

拦截 request 修改

def interceptor(request):
  if request.host=='xxx.xxx.com':
    if request.headers.get('ENV-ID'):
       del request.headers['ENV-ID']
    request.headers['ENV-ID'] = '1'
driver.request_interceptor = interceptor

恢复操作

del driver.request_interceptor
del driver.header_overrides

其他用法

  1. 利用 selenium-wire 可以做很多事情:获取各种请求、响应的头和内容,修改请求、响应的头和内容(mock),这些可以在文档中找到对应例子: https://github.com/wkeeling/selenium-wire
  2. 一个例子:屏蔽一些加载很慢或无法加载的埋点类资源,提高 selenium 的运行速度:
def interceptor(request:Request):
     p=re.compile(".*(pro6e.com|riskified|google|doubleclick|snapengage.com|taboola|hubapi|hubspot|facebook|hs-scripts.com).*")
     if p.findall(request.host):
         request.abort()
driver.request_interceptor = interceptor


↙↙↙阅读原文可查看相关链接,并与作者交流