Python Selenium Chrome 本地调试那些事儿

741 阅读6分钟

一、序言

《Python爬虫选型》章节后,相信真正进行爬虫开发的小伙伴会发现,在实际爬取数据的过程中,除了从简单网页上爬取信息外,更多需要将账号、密码、验证码登录后才能进行数据爬取,要达到这个效果只有两种方式,一种是在目标网站上获取token、登录接口、获取验证码接口后,人工拼接目标网站登录接口的入参进行用户登录,另一种是利用selenium工具模拟人工登录的行为进行用户登录。山姆推荐大家用第二种。原因有两点,第一点学习门槛或成本相对较低,入门上手相对简单;第二点能真实还原用户操作流程,在用户体验以及集成化测试上都是首选工具

二、问题

用过Selenium的小伙伴都知道,本地调式是必不可少的。网上也有很多教程,山姆推荐两个给大家自行学习:

在入门教程里都会教大家如何安装、对接、调试本地不同的浏览器,比较常用的是Chrome和Firefox。山姆主要遇到的问题有两个,都是跟Chrome浏览器相关。

2.1 本地Chrome浏览器与Chromedriver版本不一致的情况

从上面的推荐的教程里面会讲到如何去找到驱动与浏览器版本一致性的问题,山姆在这也再次强调下,极力推荐用谷歌官方地址去下载和浏览器版本一致的驱动
官网:[googlechromelabs.github.io/chrome-for-…]

image.png 文档默认是最新版本,但有时不巧的是谷歌官方发布的稳定版本小于本地浏览器版本或者对应的版本谷歌官网无法下载,如下图:

image.png

【出现这个问题要如何去解决呢?有没有更好的方式适合开发人员呢?】

大家可以先带着问题先自行思考或去查找资料,网上教程中提到的回退版本并非是上上策,而且针对mac的用户,chrome是无法回退版本的

2.2 本地chrome高版本后会出现http自动跳转https的情况

网上有很多种解决方案总体归纳为以下几种:

  • 设置chrome的HSTS

HSTS全称:HTTP Strict Transport Security,意译:HTTP严格传输安全,是一个Web安全策略机制。 HSTS 是一种强制浏览器只能通过 HTTPS 访问某个域名的 URL 的协议,它可以防止中间人攻击,提高数据传输的安全性

操作步骤

  1. 地址栏中输入chrome://net-internals/#hsts
  2. 在Delete domain中输入项目的域名,并Delete(删除)
  3. 可以在Query domain测试是否删除成功
  • 设置HTTPS Upgrades Disabled

操作步骤

  1. 打开Chrome浏览器
  2. 在地址栏中输入“chrome://flags/”并按下回车键
  3. 在搜索框中输入“自动重新加载恢复点”,然后找到该选项,并选择“禁用”
  4. 或找到 HTTPS Upgrades,设置为disabled,重启Chrome浏览器即可
  • 关闭安全连接

操作步骤

  1. 进入谷歌的:设置--->隐私和安全--->安全--->找到:一律使用安全连接
  2. 把一律使用安全连接调到关闭状态
  3. 然后刷新谷歌浏览器,再次用http访问,查看是否成功
  • URL Rule插件

访问链接 [chrome.google.com/webstore/de…] (国内访问要翻墙哈)

image.png

Tips:

  • 针对不同的版本,可能会有不同的影响,看看哪个方法能够解决问题,建议大家自行尝试
  • 但对于Selenium自动化测试这块好像还是不起作用,只要程序启动运行,新建浏览器进程依然我行我素进行http转成https

image.png

【为啥在自己访问浏览器有用,而自动化脚本一启动就没用了呢?】

大家依然要带着问题先自行思考或去查找资料,这里提到的自动化脚本就是上面提到的Python + Selenium(浏览器是Chrome)

三、填坑

针对上面提出的问题,山姆也思考、尝试了好几种方案,最终采纳的方式是利用固定的浏览器测试版本 + 浏览器插件,同时也建议大家使用。原因有三点:

  • Chrome浏览器自动更新比较频繁,针对用户安全这个事情只会越来越严格,因此固定Chrome测试版本是比较好的对策
  • 针对集成化测试中兼容性测试,这块本身就要求更换不同版本的浏览器进行测试
  • http自动跳转https,建议使用浏览器插件 — URL RULE,这个插件兼容性较好而且可以通过通配符来个性化定制

3.1 Windows解决步骤

  1. 选择并下载对应版本,Chrome for Testing & ChromeDriver image.png
  2. 下载后,双击Chrome for Testing配置浏览器插件URL Rule
  3. 插件安装好后,进行白名单的配置,如下图 image.png

3.2 Mac解决步骤

  1. 选择并下载对应版本,Chrome for Testing & ChromeDriver

image.png

2,3两步与Windows步骤相同不再赘述

3.3 Python Selenium 关键代码

# -*- coding: utf-8 -*-
from selenium import webdriver

# Chrome浏览器可选配置设置
option = webdriver.ChromeOptions()
option.add_argument("--no-sandbox")
option.add_argument('--disable-dev-shm-usage')
option.add_argument("--ignore-certificate-errors")
# 【Mac版】指定测试浏览器位置,如果到Testing.app就结束会报Failed to create Chrome process
option.binary_location = r"/xxx/chrome-mac-117/Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing"
# 【Windows版】指定测试浏览器位置
option.binary_location = r"D:/xxx/chrome-win64/chrome.exe"
# 配置浏览器插件URL-Rule
option.add_extension(r"/xxx/URL-Rule.crx")
# 【关键操作】指定用户浏览器数据文件目录,是解决http自动https关键步骤
option.add_argument(r"user-data-dir=/xxx/Application Support/Chromium")

# 【Mac版】指定浏览器驱动
chromedriver_path = r"/xxx/chromedriver"
# 【Windows版】指定浏览器驱动
chromedriver_path = r"/xxx/chromedriver.exe"
# 指定浏览器类型Chrome
driver = webdriver.Chrome(options=driver_opts, executable_path=chromedriver_path)
# 网页访问测试
driver.get("http://测试网站的地址")
# 退出
driver.quit()

Tips:

  • 下载.crx文件有个前提是需要安装浏览器插件CRX Extractor/Downloader

访问地址:[chromewebstore.google.com/detail/ajkh…] image.png

  • user-data-dir查找方法,以下图为例目录是到User Data而不是Default(切记!!!) 企业微信截图_17070316787733.png

四、总结

最后花一分钟总结下,Selenium本地调试常规问题网上资料已经很多,山姆这次分享的是在项目管理实战中摸索、尝试、总结出来的宝贵经验,全网独家!!! 喜欢的小伙伴可以点个赞支持下山姆,万分感谢^_^