网页截图+cookie处理+自动化验证码处理
网页截图
案例:打开百度页面,截图
#/usr/bin python #-*- coding:UTF-8 -*- #####################截图##################### from selenium import webdriver from time import sleep driver = webdriver.Chrome() driver.get("https://www.baidu.com/") ##截图 driver.get_screenshot_as_file(r"E:\study\python\baidu.jpg") sleep(5) driver.quit()
cookie的处理
Cookie是储存在用户本地终端上的数据,实际上是一小段的文本信息。
帮助 Web 站点保存有关访问者的信息,方便用户的访问。如记住用户名密码实现自动登录。
在自动化UI测试过程中,也可以用来避开登录
driver.get(url) driver.delete_all_cookies() for cookie in cookies: driver.add_cookie(cookie) driver.refresh()
# -*- coding: utf-8 -*- # @Time : 2020/7/17 15:06 # @Author : 饭盆里 # @File : test_cookie.py # @Software: PyCharm # @desc : import shelve from time import sleep import pytest from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By class Test(): def setup(self): options = Options() # 和浏览器打开的调试端口进行通信 # 浏览器要使用 --remote-debugging-port=9222 开启调试, # 由于我环境变量设置了变量,alias driver_debugging=\'/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=9222\' # 所以可以直接:driver_debugging options.debugger_address = \'127.0.0.1:9222\' self.driver = webdriver.Chrome(options=options) # self.driver = webdriver.Chrome() self.driver.implicitly_wait(3) def teardown(self): self.driver.quit() @pytest.mark.skip def test_baidu(self): self.driver.get(\'https://www.baidu.com/\') self.driver.find_element(By.ID,\'kw\').send_keys(\'hi\') self.driver.find_element(By.XPATH,\'//*[@id="su"]\').click() sleep(5) def test_wework(self): self.driver.get("https://work.weixin.qq.com/") # 获取 cookies # print(self.driver.get_cookies()) cookies = [{\'domain\': \'.work.weixin.qq.com\', \'httpOnly\': False, \'name\': \'wwrtx.vid\', \'path\': \'/\', \'secure\': False, \'value\': \'1688850531850742\'}, {\'domain\': \'.work.weixin.qq.com\', \'httpOnly\': True, \'name\': \'wwrtx.vst\', \'path\': \'/\', \'secure\': False, \'value\': \'PI81GkMu8osptnJ46fIu-UWJvR3o8_ViBwX5USscimOQRrHRyNdnruNfbjNLbSU2p3AvksJoKJc6tACT8EJXxe89v6xc0h_5FZUIikMzapf27LnrSjJkfUxRoHkefiaUAoTRgR0a_QBWoj8mEOELID9xl2Etr5gBTKAqCPdJzz3aBZC5b7iKufwcWtgb54qvKyXIK4J5zMnAy8DBzvrRb2pUE_hYYbkptzwyfk5rR7xiK01F3fqXjJwA2QIuI5R_e35ZDA10FFYBxpMtVyvbJA\'}, {\'domain\': \'.work.weixin.qq.com\', \'httpOnly\': False, \'name\': \'wxpay.vid\', \'path\': \'/\', \'secure\': False, \'value\': \'1688850531850742\'}, {\'domain\': \'.work.weixin.qq.com\', \'httpOnly\': False, \'name\': \'wxpay.corpid\', \'path\': \'/\', \'secure\': False, \'value\': \'1970325138147142\'}, {\'domain\': \'.work.weixin.qq.com\', \'expiry\': 1626742501, \'httpOnly\': False, \'name\': \'Hm_lvt_9364e629af24cb52acc78b43e8c9f77d\', \'path\': \'/\', \'secure\': False, \'value\': \'1594975399,1594979354,1594979612,1595206501\'}, {\'domain\': \'.qq.com\', \'expiry\': 2147385600, \'httpOnly\': False, \'name\': \'pgv_pvid\', \'path\': \'/\', \'secure\': False, \'value\': \'8752271993\'}, {\'domain\': \'.work.weixin.qq.com\', \'httpOnly\': True, \'name\': \'wwrtx.ref\', \'path\': \'/\', \'secure\': False, \'value\': \'direct\'}, {\'domain\': \'.work.weixin.qq.com\', \'httpOnly\': True, \'name\': \'wwrtx.ltype\', \'path\': \'/\', \'secure\': False, \'value\': \'1\'}, {\'domain\': \'.work.weixin.qq.com\', \'httpOnly\': False, \'name\': \'wwrtx.d2st\', \'path\': \'/\', \'secure\': False, \'value\': \'a3834163\'}, {\'domain\': \'work.weixin.qq.com\', \'expiry\': 1595238009, \'httpOnly\': True, \'name\': \'ww_rtkey\', \'path\': \'/\', \'secure\': False, \'value\': \'oj731e\'}, {\'domain\': \'.work.weixin.qq.com\', \'httpOnly\': False, \'name\': \'Hm_lpvt_9364e629af24cb52acc78b43e8c9f77d\', \'path\': \'/\', \'secure\': False, \'value\': \'1595206501\'}, {\'domain\': \'.work.weixin.qq.com\', \'httpOnly\': True, \'name\': \'wwrtx.refid\', \'path\': \'/\', \'secure\': False, \'value\': \'26225621643276726\'}, {\'domain\': \'.work.weixin.qq.com\', \'httpOnly\': True, \'name\': \'wwrtx.sid\', \'path\': \'/\', \'secure\': False, \'value\': \'lvWc6ImOzsx44Nw-2SegyMqIl7_H2EiVGhYcto58RPhmIx18vxT56MuBeZCy7aHo\'}, {\'domain\': \'.work.weixin.qq.com\', \'expiry\': 1595238009, \'httpOnly\': False, \'name\': \'wwrtx.c_gdpr\', \'path\': \'/\', \'secure\': False, \'value\': \'0\'}, {\'domain\': \'.qq.com\', \'expiry\': 1658051906, \'httpOnly\': False, \'name\': \'_ga\', \'path\': \'/\', \'secure\': False, \'value\': \'GA1.2.1583622381.1594901080\'}, {\'domain\': \'.work.weixin.qq.com\', \'expiry\': 1597798500, \'httpOnly\': False, \'name\': \'wwrtx.i18n_lan\', \'path\': \'/\', \'secure\': False, \'value\': \'zh-cn\'}] # # 创建或者打开一个数据库 db = shelve.open("cookies") # # 将数据存储到 shelve 中 db["cookies"] = cookies # # # 取出数据 cookies = db["cookies"] #把cookie 中的时间戳去除"expiry",然后加入到浏览器的cookies中 for cookie in cookies: if "expiry" in cookie.keys(): cookie.pop("expiry") # 把字典加入到 driver 的 cookie 中 self.driver.add_cookie(cookie) sleep(2) self.driver.get("https://work.weixin.qq.com/wework_admin/frame#contacts") # sleep(4) self.driver.find_element(By.XPATH, "//*[@id=\'menu_contacts\']").click() # db.close()
- 手动在代理浏览器页面进行扫码登陆企业微信
- 用代码获取此时的cookie:
self.driver.get_cookies()
将此时的cookie打印后,放入一个变量中,以备后续使用
#/usr/bin python #-*- coding:UTF-8 -*- #####################cookie##################### from selenium import webdriver from time import sleep driver = webdriver.Chrome() driver.get("https://www.baidu.com/") ##获取cookie cookie = driver.get_cookies() ##打印全部cookie print(cookie) ##打印第一组cookie print(cookie[0]) #添加cookie 字典形式 driver.add_cookie({\'name\':\'fanpl\',\'value\':\'fanfan\'}) for cookie in driver.get_cookies(): print("%s --- %s" %(cookie[\'name\'],cookie[\'value\'])) driver.quit()
自动化测试验证码问题
验证码作用
不少网站在用户登录、用户提交信息等登录和输入的页面上使用了验证码技术。验证码技术可以有效防止恶意用户对网站的滥用,使得网站可以有效避免用户信息失窃、保证网站稳定安全性。
但是验证码给自动化测试带来一些不便,使脚本无法正常运行覆盖功能模块。
解决办法
1.去掉验证码
这是最简单的方法,对于开发人员来说,只是把验证码的相关代码注释掉即可,如果是在测试环境,这样做可省去了测试人员不少麻烦,如果自动化脚本是要在正式环境跑,这样就给系统带来了一定的风险。
2.设置万能码
去掉验证码的主要是安全问题,为了应对在线系统的安全性威胁,可以在修改程序时不取消验证码,而是程序中留一个“后门”—设置一个“万能验证码”,只要用户输入这个“万能验证码”,程序就认为验证通过,否则按照原先的验证方式进行验证。
3.验证码识别技术(OCR)
例如可以通过Python-tesseract 来识别图片验证码,Python-tesseract是光学字符识别Tesseract OCR引擎的Python封装类。能够读取任何常规的图片文件(JPG, GIF ,PNG , TIFF等)。不过,目前市面上的验证码形式繁多,目前任何一种验证码识别技术,识别率都不是100% 。
4.记录cookie
通过向浏览器中添加cookie 可以绕过登录的验证码。
基于Cookie绕过验证码自动登录
案例:使用Cookie绕过百度验证码自动登录账户。(需要用到抓包工具)
from selenium import webdriver from time import sleep driver=webdriver.Firefox() driver.get("http://www.baidu.com/") #手动添加cookie driver.add_cookie({\'name\':\'BAIDUID\',\'value\':\'9E4BF1D44014…(根据实际获取值填写)\'}) driver.add_cookie({\'name\':\'BDUSS\',\'value\':\'根据实际抓包获取值填写\'}) sleep(2) driver.refresh() sleep(3) driver.quit()