今天下午处理了一个ui自动化工程师提交给 我们测试技术委员会的 关于 selenium+pytthon 的疑难杂症。
经过一番思考后成功解决,且方法极为简单可靠,具体代码在最后。
先看下这个疑难问题:

访问一个内部平台登陆页面,
然后弹出证书弹窗:
必须点击确定按钮。否则无法继续加载登陆页面
手动点击一次之后,关浏览器下次打开仍然会弹出。
需求是想每次代码能自动点击确定关闭弹窗,然后继续执行

对于成熟的测开来说,需要在大脑中先思考解决这个问题的几种可能办法,然后迅速判断出每条方法的难度,复杂度,麻烦程度,成功概率,后续维护等。
首先思路有俩条大方向:

1.设置浏览器方向,让浏览器自己永远不用弹这个证书弹窗。
2.在自动化代码里动手脚,让每次到这之后自动点击确定好关闭弹窗。

先说说方法1: 从浏览器自身下手。可是作者对各种浏览器的证书设置实在是不精通,甚至百度都不知道怎么搜。而且要设置的不只有一个浏览器,谷歌/火狐/ie等等,很多。换台电脑,或者部署在服务器的时候,都是个问题。而且以自身的经验来说,可能要弄一下午,最终还是不成功。所以此路可行,但是成功率太低,优先级最后把。
所以马上想方法2:从代码中处理,这种情况跨平台性好,而且也不会因机而异。方便快捷还省时省力。

方法2:从代码里动手脚 有以下几个子思路

1.利用alert.accept() 方法,但是对于自动化工程师而言,想都不用想,这个肯定不好使。因为这次不是一个简单的alert弹窗,而是一个复杂的证书选择器。所以此路不可行。
2.利用autoIt3: autoit3最早被selenium工程师熟知基本是因为其可以处理文件上传框,但是作者目前情况是:电脑没有安装autoit3,且电脑是mac,基本无法使用,即便换成windows,也需要先到处找安全的下载地址,然后下载,然后研究破解,然后录制脚本,然后打包成.exe,然后在python代码中 运行.exe。这个过程估计弄完,天都黑了。而且程序运行速度也会受制于.exe的启动执行速度。所以判断此路可行,但是不优先。
3.利用selenium的鼠标/键盘操作,强制点击确定或按回车功能。
此方法简单可靠快速,是最佳选择。所以作者立即进行可行性调研。
这种方法利用起来有个前提,就是浏览器没有在缓冲中,python代码可以在弹窗出来后继续执行。但是实际发现,在证书弹窗出现的全部时间内,浏览器都是一直在缓冲转啊转,别说后面什么点击回车,移动鼠标操作了,连个print都无法执行。
所以在此思路上引出新问题:如何能在弹窗出现后,点击回车。
解决方向有:

1.利用超时,强制运行driver.execute_script("window.stop()") 用js的强制停止页面

这种方法使用后,的确可以停止网页,然后程序点击了回车,关闭了证书弹窗,但是结果就是,浏览器不在继续加载了。登陆页面所有的东西都没有出来,相当于你为了把受伤人身上的子弹取出来,就把人给开肠破肚的解刨了,子弹是拿出来了,人也没了~

最终作者开始用另一种子思维:

2.利用多线程,新建一个小弟去帮你点回车

这种方法是先生成一个子线程,子线程干什么呢?就只有 等待2秒,然后点击键盘回车。就这么简单。
当主线程走到 driver.get() 方法打开网页的同时,子线程start。
然后主线程 使浏览器弹出了证书选择弹窗。子线程也在刚刚等待了2秒后,按下了回车,使浏览器证书选择弹窗成功确认并关闭,然后子线程死亡。浏览器成功加载出登陆页面,主流程开始接下来的 输入用户名/密码等工作。
最后把这个方法封装了一下,以后就不用driver.get()方法了,直接调用封装好的zs_get()即可。上面的2s为啥要等待呢,因为子线程相当于你的小弟,但是个瞎子,只能自己默数2秒然后挥刀。如果不等待,那就会导致子线程先按下回车,主流程才使浏览器弹出证书选择弹窗导致无法关闭。所以最后 奉上原码:

def zs_get(url):from selenium.webdriver.common.keys import Keys  #导入键盘按键方法,有很多这里随便举例一种import threading #导入多线程模块def press_enter():  #定义子线程函数time.sleep(2) #可以多等待几秒#ActionChains(driver).send_keys(Keys.ENTER).perform() : #按下回车代码#pyautogui 注意这里必须使用第三方界面工具,原ActionChains方法会被阻塞t = threading.Thread(target=press_enter) #初始化子线程t.setDaemon(True) driver.get(url) #drver访问网址登陆页面t.start() #子线程启动zs_get("http://xxxx/xxxx/xxxx.com") #调用此方法来代替driver.get() 即可自动处理上述难题

其实作者还想了好多办法,只是在测试这种的时候直接就成功了,所以后续方法没有再进行测试和过多思考。
珍贵的不只是这个方法,而是面对一个陌生的难题的时候,要做到临危不惧,不自暴自弃,坚信没有解决不了难题,然后通过科学的方法一步一步最终 用最短的时间,确定出最好的那个方法。
有兴趣的小伙伴可以留言讨论。

记一次 selenium 处理浏览器证书弹窗的经历相关推荐

  1. selenium之浏览器、元素、鼠标等操作总结

    1    控制浏览器 Selenium 主要提供的是操作页面上各种元素的方法,但它也提供了操作浏览器本身的方法,比如浏览器的大小以及浏览器后退.前进按钮等. 1.1  控制浏览器窗口大小 在不同的浏览 ...

  2. selenium+python处理广告弹窗

    selenium+python处理广告弹窗 1. 背景 在使用浏览器渲染技术爬取网站信息时,经常会遇到一些弹出框(广告,警告框,验证码,登录窗口等)的干扰.一般来说,当这些窗口弹出时,就无法操作原始页 ...

  3. python 模拟浏览器selenium_python爬虫:使用Selenium模拟浏览器行为

    前几天有位微信读者问我一个爬虫的问题,就是在爬去百度贴吧首页的热门动态下面的图片的时候,爬取的图片总是爬取不完整,比首页看到的少.原因他也大概分析了下,就是后面的图片是动态加载的.他的问题就是这部分动 ...

  4. selenium对浏览器操作、鼠标操作等总结

    1 控制浏览器 Selenium 主要提供的是操作页面上各种元素的方法,但它也提供了操作浏览器本身的方法,比如浏览器的大小以及浏览器后退.前进按钮等. 1.1 控制浏览器窗口大小 在不同的浏览器大小下 ...

  5. 爬虫之selenium控制浏览器执行js代码

    爬虫之selenium控制浏览器执行js代码 selenium可以让浏览器执行我们规定的js代码,运行下列代码查看运行效果 import time from selenium import webdr ...

  6. selenium+Edge浏览器实现web端自动化测试

    selenium+Edge浏览器的自动化测试 1. 概述 2. selenium自动化原理 (1)selenium3 (2)安装方式 3. 实战案例体验selenium自动化 4. 关于seleniu ...

  7. python 模拟浏览器selenium 微信_Spider-Python爬虫之使用Selenium模拟浏览器行为

    分析 他的代码比较简单,主要有以下的步骤:使用BeautifulSoup库,打开百度贴吧的首页地址,再解析得到id为new_list标签底下的img标签,最后将img标签的图片保存下来. header ...

  8. python 模拟浏览器下载文件-python爬虫:使用Selenium模拟浏览器行为

    前几天有位微信读者问我一个爬虫的问题,就是在爬去百度贴吧首页的热门动态下面的图片的时候,爬取的图片总是爬取不完整,比首页看到的少.原因他也大概分析了下,就是后面的图片是动态加载的.他的问题就是这部分动 ...

  9. python+selenium自动化测试——浏览器驱动

    selenium控制浏览器需要下载对应版本的驱动,并把下载好的驱动解压然后拷贝到python的安装目录. 1.chrome 驱动对应版本及下载地址;https://npm.taobao.org/mir ...

最新文章

  1. 寒假每日一题(入门组)【week5 完结】
  2. firewall防火墙
  3. mysql浅拷贝_深入理解浅拷贝和深拷贝
  4. 【LeetCode笔记】34. 在排序数组中查找元素的第一个和最后一个位置(Java、二分)
  5. 史上最贵黑客事件!中本聪用代码亲手杀死 1844.67 亿枚比特币!
  6. Xilinx PLL IP核功能仿真
  7. mac mysql root不能登陆_Mac下新安装的MySQL无法登陆root用户解决方法
  8. 从win到linux的小问题集锦(不断更新中)
  9. android 7和苹果手机,苹果对比安卓,7个iPhone比安卓手机更好的理由
  10. mysql like BR%._MySQL Like子句
  11. 网络管理之SNMP协议
  12. 基于JSP和sql server小区物业管理系统毕业论文
  13. itextPDF生成表格的pdf
  14. IDEA类和方法注释模板设置(非常详细)
  15. 《未来行业前景必看》大数据未来的发展趋势!
  16. 淘宝评论爬取(2020-08-21)update 2020-09-18
  17. fork函数产生进程
  18. 嵌入式开发<串口调试工具>
  19. 文科类文献综述怎么写?
  20. 2020东软面试题小计(校招Java篇)

热门文章

  1. 【IDEA更改默认字体大小】
  2. mysql更改数据库登录密码失败;Access denied for user 'root'@'localhost;mysqladmin: connect to server at 'localhos
  3. 数位DP(期末机测题)
  4. Vue最佳实践(项目经验总结,定期更新)
  5. 教研教改课题 php,关于申报2019年全国高校、职业院校物流教改教研课题的通知...
  6. python统计列分布_pd.DataFrame统计各列数值多少的实例
  7. Alt+Tab快捷键:使用键盘实现众多窗口情况下的多任务快速切换,提高打工效率
  8. Vscode Remote SSH 远程连接失败过程报错:试图写入的管道不存在
  9. 实现用户登录与用户注册的思路
  10. apkanalyzer.bat could NOT be found in D:\Program Files\android-sdk的解决方案