1、验证码问题

对于Web应用来说,大部分的系统在用户登录时,都要求用户输入验证码。验证码的类型的很多,有字母数字的,有汉字的,甚至还要用户输入一条算术题的答案的。对于系统来说,使用验证码可以有效果的防止采用机器猜测方法对口令的刺探,在一定程度上增加了安全性。但对于测试人员来说,不管是进行性能测试,还是自动化测试都是一个棘手的问题。

2、处理验证码的方法

(1)去掉验证码

这是最简单的方法,对于开发人员来说,只是把验证码的相关代码注释掉即可,如果是在测试环境,这样做可省去了测试人员不少麻烦,如果自动化脚本是要在正式环境跑,这样就给系统带来了一定的风险。(风险大)

(2)设置万能码

去掉验证码的主要是安全问题,为了应对在线系统的安全性威胁,可以在修改程序时不取消验证码,而是程序中留一个“后门”,设置一个“万能验证码”,只要用户输入这个“万能验证码”,程序就认为验证通过,否则按照原先的验证方式进行验证。

(3)验证码识别技术

例如可以通过Python-tesseract 来识别图片验证码,Python-tesseract 是光学字符识别Tesseract CR 引擎的Python 封装类。能够读取任何常规的图片文件(JPGGIFPNG等)。不过,目前市面上的验证码形式繁多,目前任何一种验证码识别技术,识别率都不是100% 。(玩玩还行,工作中不推荐)

(4)记录Cookie

通过向浏览器中添加Cookie可以绕过登录的验证码,这是比较有意思的一种解决方案。我们可以在用户登录之前,通过add_cookie()方法将用户名密码写入浏览器Cookie,再次访问系统登录链接将自动登录。

3、Selenium绕过验证码登陆的实现

提示:使用上面第4种方式进行实现。

"""
1.学习目标
掌握验证码处理方式
2.操作步骤
2.1 获取登录后的cookie
通过浏览器F12或抓包工具
2.2 将登录后的cookie添加到脚本中
driver.add_cookie(字典格式)
2.3 执行刷新操作
driver.refresh()
3.需求
获取百度登录后的cookie,实现免登陆
4.总结
4.1 首先登录一次
4.2 明确哪些cookie和登录相关
(1)如果明确哪些cookie是保存用户信息,添加相应的cookie就好
(2)如果不知道哪些cookie是保存用户信息的
@1 可以把登陆后的cookie全部添加进去。
@2也可以登陆前和登陆后分别获取cookie,
登陆后多出来的cookie就是和登陆相关的用户信息cookie。
4.3 使用cookie做免登陆时,注意原来登录的账号不能退出。
"""
# 1.导入selenium
from selenium import webdriver
from time import sleep # 2.打开浏览器
driver = webdriver.Chrome() # 3.打开页面
url = "http://www.baidu.com/"
driver.get(url)
sleep(2) """
4. 登陆一次百度网站
通过浏览器F12或抓包工具,获取cookie,
火狐浏览器方便获取
""" """
5. 添加百度登录后的cookie
要确定哪些cookie是和用户信息先关的。
百度中BAIDUID和BDUSS两个cookie是和用户信息相关的。
这两个cookie就可以实现百度免登录。 测公司自己项目的时候,需要用cookie实现免登录,
需要问一下开发,和用户个人信息相关的登陆数据是哪些cookie。
加载这些条cookie信息就可以实现免登录。
"""
cookies = [{"name": "BAIDUID", "value": "026CB67282F2B6C4F2AC6880EAEFE5A6:FG=1"},
{"name": "BDUSS",
"value": "pJckQ3aXdEVi1ZaUVpalpDfjhmQTlpZW9mfnNCMUFCdDFCNUpZajB3TG5sdlJlRVFBQUFBJCQAAAAAAAAAAAEAAAAzO-pLc2RqYWtzZGs3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOcJzV7nCc1eYX"}] # 6. 遍历cookies列表,添加cookie
for cookie in cookies:
driver.add_cookie(cookie) # 7. 刷新页面
driver.refresh()
sleep(3) # 8.关闭浏览器
driver.quit() """
注意:
当你手动点击退出登陆,你所加载这这些cookie就失效了。
如果还需要通过cookie实现免登录,就要重新获取cookie信息。
"""

4、总结

  • 通过上面例子我们可以知道,查看访问百度所获得的Cookie中,也没有看到有“sessionID”的数据,所以说“sessionID”名字是其他的名字也是一样的,后端拿到这些Cookie之后,只需要知道这个数据就是Session,然后拿去和数据库里的进行比对就行了。
  • 使用Cookie进行登录最大的难点是如何获得与用户登陆或认证相关的Cookie信息 ,如果找到不到对应Cookie的名字,就没办法通过add_cookie()方法设置有效的Cookie信息。可以通过get_cookies()方法来获取登录的所有的Cookie信息,从而通过add_cookie()方法将用户登陆或认证相关的Cookie数据,写入到浏览器Cookie中。当然最简单的方法还是在接口文档中有明确的说明,或者询问开发人员。

5、补充练习

通过比对登陆操作前后Cookie的变化,来确定与用户登陆操作相关的Cookie信息。

提示:下面代码是提供一个解决问题的思路,以后在实际工作中按自己的需求自行封装。

代码如下:

# 导入包
from selenium import webdriver
import time # 定义全局变量
url = 'http://www.baidu.com/' # 登陆操作
def login():
'''先定义一个正常登录的方法,获取登录前和登录后的cookie''' driver = webdriver.Chrome() driver.get(url)
driver.maximize_window()
cookieBefore = driver.get_cookies() # 获取所有cookie
# 打印登录前的所有cookie
print(cookieBefore)
time.sleep(2)
driver.find_element_by_id("new-username").clear()
driver.find_element_by_id("new-username").send_keys("username")
driver.implicitly_wait(5)
driver.find_element_by_id("new-password").clear()
driver.find_element_by_id("new-password").send_keys("password")
driver.find_element_by_id('home-right-login').click()
driver.implicitly_wait(5)
# 加一个休眠,这样得到的cookie 才是登录后的cookie,否则可能打印的还是登录前的cookie
time.sleep(5)
print("登录后!")
cookiesAfter = driver.get_cookies() # 获取登陆后的所有cookie
print("cookiesAfter:")
print(cookiesAfter)
# cookie 存放到了list,其中是dict
# 对比发现登录后的cookie比登录前多了4个dict。
# 如下代码分别是 1、4 、7、 8
len1 = len(cookiesAfter) # 以下代码被写死不能通用
print("len:%d" %len1)
cookie1 = cookiesAfter[0]
cookie2 = cookiesAfter[3]
cookie3 = cookiesAfter[-2]
cookie4 = cookiesAfter[-1]
print("cookie1:%s" %cookie1)
print("cookie2:%s" %cookie2)
print("cookie3:%s" %cookie3)
print("cookie4:%s" %cookie4)
driver.quit()
# 将获取的这四个cookie作为参数,传递给,使用cookie登录的函数,如下
cookieLogin(cookie1,cookie2,cookie3,cookie4) # 使用cookie免登录操作
def cookieLogin(cookie1,cookie2,cookie3,cookie4):
print("+++++++++++++++++++++++++")
print("cookieLogin")
print("cookie2:%s" % cookie2)
print("cookie4:%s" % cookie4)
driver = webdriver.Chrome()
driver.maximize_window()
# 清除一下cookie
driver.delete_all_cookies()
time.sleep(3)
driver.get(url)
# 打开浏览器后添加访问地址后,添加cookie
driver.add_cookie(cookie1)
driver.add_cookie(cookie2)
driver.add_cookie(cookie3)
driver.add_cookie(cookie4)
print("cookies")
# 打印一下cookie,与上面正常登录的cookie对比一下
print(driver.get_cookies())
time.sleep(5)
# 刷新页面,可以看到已经是登录状态了,至此完成的使用cookie 的登录。
driver.refresh()
time.sleep(5)
driver.quit() if __name__ == "__main__":
login()

参考:[https://www.cnblogs.com/BlueSkyyj/p/8615879.html](

『心善渊』Selenium3.0基础 — 21、Selenium实现绕过验证码进行登陆的更多相关文章

  1. 『心善渊』Selenium3.0基础 — 24、Selenium的expected_conditions模块详细介绍

    目录 1.EC模块介绍 2.EC模块常用类 3.EC模块的使用 4.EC模块综合使用 (1)title_is(title)示例 (2)presence_of_element_located(locat ...

  2. 『心善渊』Selenium3.0基础 — 11、Selenium对元素常用操作

    目录 1.Selenium对元素常用操作 2.Selenium对元素的其他操作 1.Selenium对元素常用操作 操作 说明 click() 单击元素 send_keys() 模拟输入 clear( ...

  3. 『心善渊』Selenium3.0基础 — 12、Selenium操作鼠标和键盘事件

    目录 (一)对鼠标的操作 1.鼠标事件介绍 2.ActionChains 类鼠标操作的常用方法 3.perform()方法 4.鼠标事件操作步骤 5.示例 (1)右键单击.左键双击 (2)鼠标拖拽动作 ...

  4. 『心善渊』Selenium3.0基础 — 1、Selenium自动化测试框架介绍

    目录 1.Selenium介绍 2.Selenium的特点 3.Selenium版本说明 4.拓展:WebDriver与Selenium RC的区别 5.Webdriver工作原理 1.Seleniu ...

  5. 『心善渊』Selenium3.0基础 — 2、Selenium测试框架环境搭建(Windows)

    目录 1.浏览器安装 2.浏览器驱动下载 (1)ChromeDriver for Chrome (2)Geckodriver for Firefox (3)IEDriverServer for IE ...

  6. 『心善渊』Selenium3.0基础 — 3、使用Selenium操作浏览器对象的基础API

    目录 1.导入Selenium库 2.创建浏览器对象 3.浏览器窗口大小设置 4.浏览器位置设置 5.请求访问网址 6.浏览器页面前进.后退和刷新 7.关闭浏览器 相比于高大上的各种Selenium进 ...

  7. 『心善渊』Selenium3.0基础 — 4、Selenium基础元素定位详解

    目录 1.什么是元素定位 2.Selenium元素定位常用API (1)By_id 定位 (2)by_name 定位 (3)by_class_name 定位 (4)by_tag_name 定位 (5) ...

  8. 『心善渊』Selenium3.0基础 — 19、使用Selenium操作文件的上传和下载

    目录 1.Selenium实现文件上传 (1)页面中的文件上传说明 (2)文件上传示例 (3)总结 2.Selenium实现文件下载 (1)Firefox浏览器文件下载 1)操作步骤: 2)文件下载示 ...

  9. 『心善渊』Selenium3.0基础 — 20、Selenium对Cookie的操作

    目录 1.Cookie介绍 2.Session介绍 3.Cookie工作原理图解 4.Cookie内容参数说明 5.Selenium操作Cookie的API 6.Selenium操作Cookie的示例 ...

随机推荐

  1. 通过format学习,python的内部方法是面象对象的-python面向对象

    1.常用的形式 s ="{0} {0} qqq {0} xxx {1}".format('dog','cat')print(s) 结果:dog dog qqq dog xxx ca ...

  2. 查找目录下的所有文件中是否含有某个字符串 find .|xargs grep -ri "IBM"

    linux查看目录下所有文件内容中是否包含某个字符串 2017-07-25 15:13:22 默一鸣 阅读数 21556 文章标签: linux查找文件夹文件内容字符串 更多 分类专栏: Unix   ...

  3. shell 读取某个目录下的所有文件

    #!/bin/shFILE_PATH="xxx" xxx:路径cd $FILE_PATHfor FILE in `ls` do echo $FILE done

  4. STM32低功耗总结

    之前自己做过一个项目的低功耗大约11ua,那时总结下有几点: 1.外设时钟必须切换为内部时钟: 2.不用的外设全部关闭,要用再开就是了: 3.浮空引脚必须配置为下拉: 4.硬件上的上拉.下拉电阻切记不 ...

  5. 10.12 telnet:远程登录主机

    telnet命令 以前是用于登录远程主机,对远程主机进行管理的.但是因为telnet是采用明文传送报文的,其安全性不好,因此现在很多Linux服务器都不开放telnet服务,而是改用更安全的SSH服务 ...

  6. harobor私有docker镜像仓库

    Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,由VMware开源,其通过添加一些企业必需的功能特性,例如安全.标识和管理等,扩展了开源 Docker Distribu ...

  7. ssh创建与添加密钥开启免密登陆 免确认机器指纹参数

     主要是两个步骤 1.控制主机创建密钥对(私钥和公钥) 2.把密钥对的公钥加入对方的认证列表中 [root@vps ~]# ssh-keygen [root@vps ~]# ssh-copy-id u ...

  8. SpringBoot打jar包-下载文件时报错-class path resource xxxxxx cannot be resolved to URL because it does not exist

    一.问题由来 新项目的开发中,打包方式由war包改为了jar包的方式,这样在部署的时候更加的方便.测试环境使用pm2这个工具来管理项目的运行,停止,重启等等非常方便. 可是当测试人员在测试项目中的文件 ...

  9. 使用python实现钉钉告警通知功能

    前言:日常工作中告警通知是必不可少的,一般会使用邮件.钉钉.企业微信等,今天分享一下使用python实现钉钉告警 一. 钉钉机器人创建 登录钉钉客户端,创建一个群,把需要收到报警信息的人员都拉到这个群 ...

  10. 如何使用 IoC

    创建Maven工程,pom.xml添加依赖 <?xml version="1.0" encoding="UTF-8"?> <project x ...