一、背景说明

之前写了一款简单的api模糊测试工具,之前系统可以使用http Base认证现在改成session形式并加上了token。

最简单的改造方法,是自己先在浏览器手动登录,然后提取出session和token(系统token在整个会话期间可重复使用)填到模糊测试工具中即可。但这种非全自动化的方式不到万不得已不想用。

最直接的方法,最使用requests按登录流程依次发包登录即可。但其中的难点是密码是加密提交的,询问开发人员说是DES加密;DES加密不难,但是用不同的语言编写的加密算法与别人的结果完全一致那就比较费工夫。

最后的方法,那就是使用selenium登录避开密码的构造,这种方法的关键点在于:selenium是基于图形界面操作的,没有直接的办法能获取request和response的数据包,在这种情况下如何获取session和token。

自己动web前端的存储并没有很深入了解,一直想的是如何获取selenium request和response的数据包从中提取session和token,直到看到这篇文章才想起前端的变量(尤其是restful中的全局变量)会放存localStorage和sessionStorage中,从中提取session和token即可。

二、环境搭建

2.1 下载驱动

下载驱动文件,放到后续python文件同级目录下或加入到环境变量中即可。其中Chrome驱动要注意Driver版本与浏览器版本对应要求。

Firefox驱动下载地址:https://github.com/mozilla/geckodriver/releases

Chrome驱动下载地址:http://chromedriver.chromium.org/downloads

Safari驱动下载地址:https://webkit.org/blog/6900/webdriver-support-in-safari-10/

Edge驱动下载地址:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/

2.2 安装selenium

pip install selenium

三、程序实现

3.1 系统状况

手动登录系统后,查看存储状况如下图所示,sessionid和token分别存储在sessionStorage的sessionId和token两个变量中

3.2 实现代码

import json
import time
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By class GetSessionAndToken():
def __init__(self):
# 启用无头模式,可选
browser_options = webdriver.FirefoxOptions()
browser_options.add_argument('--headless')
browser_options.add_argument('--disable-gpu')
self.browser = webdriver.Firefox(firefox_options=browser_options)
# self.browser = webdriver.Chrome() # 登录系统,具体到自己系统时需要自行修改
def login_system(self):
# 登录用户名密码,改成目标系统用户名密码
username = "admin"
password = ""
# 登录页面url,改成目标系统登录页面
url = "https://10.10.6.93/#login"
self.browser.get(url)
# 显性等待,直到用户名控件加载出来才进行下一步
WebDriverWait(self.browser,20,0.5).until(EC.presence_of_element_located((By.ID,"txtUserName")))
# 填写用户名
self.browser.find_element_by_id("txtUserName").send_keys(username)
# 填写密码
self.browser.find_element_by_id("txtPassword").send_keys(password)
# 点击登录
self.browser.find_element_by_id("btnLogin").click()
# 强制等待5秒,待session和token都成功返回并存到浏览器中
# restful隐性等待不太好用?self.browser.implicitly_wait(5)
time.sleep(5) # 获取sessionid
def get_sessionid(self):
# 是要从localStorage中获取还是要从sessionStorage中获取,具体看目标系统存到哪个中
# window.sessionStorage和直接写sessionStorage是等效的
# 一定要使用return,不然获取到的一直是None
# get的Item不一定就叫sessionId,得具体看目标系统把sessionid存到哪个变量中
sessionid = self.browser.execute_script('return sessionStorage.getItem("sessionId");') # 另外sessionid一般都直接通过返回Set-Cookies头设置到Cookie中,所以也可以从Cookie读取
# 获取浏览器所有Set-Cookie,返回对象是字典列表
# cookies = self.browser.get_cookies()
# 获取单项Cookie,是不是叫sessionId取决于系统存成什么变量,单项Cookie是字典
# cookie = self.browser.get_cookie("sessionId")
# cookie = cookie["value"]
# print(f"{cookies}")
return sessionid # 获取token
def get_token(self):
# 是要从localStorage中获取还是要从sessionStorage中获取,具体看目标系统存到哪个中
# window.sessionStorage和直接写sessionStorage是等效的
# 一定要使用return,不然获取到的一直是None
# get的Item不一定就叫token,得具体看目标系统把token存到哪个变量中
token = self.browser.execute_script('return sessionStorage.getItem("token");')
# print(f"{token}")
return token def __del__(self):
# 退出程序时关闭浏览器
self.browser.close() if __name__ == "__main__":
obj = GetSessionAndToken()
obj.login_system()
sessionid = obj.get_sessionid()
token = obj.get_token()
print(f"sessionid为: {sessionid}\n"
f"token为: {token}")

3.3 实现效果

参考:

https://pypi.org/project/selenium/

http://www.runoob.com/jsref/prop-win-localstorage.html

https://blog.csdn.net/sinat_34209942/article/details/81235925

https://stackoverflow.com/questions/44102520/python-selenium-local-storage-returns-none

Python3+Selenium获取session和token供Requests使用教程的更多相关文章

  1. python3+selenium获取列表某一列的值

    python3+selenium获取列表某一列的值 我们在坐自动化测试时,我们可能不想单纯的想验证一个选项卡,我们让脚本随机选择一个选项进行接下来的操作.例如我们想获取列表某一列的某一个数据(随机的) ...

  2. Python3.x:selenium获取iframe内嵌页面的源码

    Python3.x:selenium获取iframe内嵌页面的源码 前言 在一些网页中经常会看到ifrmae/frame标签,iframe是嵌入式框架一般用来在已有的页面中嵌入另一个页面,当一个元素在 ...

  3. Python3 Selenium WebDriver网页的前进、后退、刷新、最大化、获取窗口位置、设置窗口大小、获取页面title、获取网页源码、获取Url等基本操作

    Python3 Selenium WebDriver网页的前进.后退.刷新.最大化.获取窗口位置.设置窗口大小.获取页面title.获取网页源码.获取Url等基本操作 通过selenium webdr ...

  4. 【原创】Selenium获取请求头、响应头

    本文仅供学习交流使用,如侵立删! Selenium获取请求头.响应头 操作环境 win10 . mac Python3.9 selenium.seleniumwire selenium是没有办法直接获 ...

  5. 用selenium获取cookies

    前言:由于登录反爬措施的越来越麻烦,甚至出现了12306这种看图识物的无敌验证码,我只能说,我选择死亡.这就衍生出了使用selenium来获取获取cookies. 实例:获取qq空间cookies,亲 ...

  6. 为什么你学不会递归?告别递归,谈谈我的一些经验 关于集合中一些常考的知识点总结 .net辗转java系列(一)视野 彻底理解cookie,session,token

    为什么你学不会递归?告别递归,谈谈我的一些经验   可能很多人在大一的时候,就已经接触了递归了,不过,我敢保证很多人初学者刚开始接触递归的时候,是一脸懵逼的,我当初也是,给我的感觉就是,递归太神奇了! ...

  7. 自动化测试: Selenium 自动登录授权,再 Requests 请求内容

    Selenium 自动登录网站.截图及 Requests 抓取登录后的网页内容.一起了解下吧. Selenium: 支持 Web 浏览器自动化的一系列工具和库的综合项目. Requests: 唯一的一 ...

  8. selenium获取cookies并持久化登陆

    selenium获取cookies并持久化登陆 需求背景: ​ 这几天需要写一个接口,用来批量上传数据,最开始考虑的是 UI 自动化,然后选值的时候自动化难以判别,最终选择 接口 自动化. ​ 然后操 ...

  9. 5月16日 python学习总结 DBUtils模块、orm 和 cookie、session、token

    一.DBUtils模块 介绍 The DBUtils suite is realized as a Python package containing two subsets of modules, ...

随机推荐

  1. IP通信基础学习第四周(上)

    IP地址现在由因特网名字与号码指派公司ICANN进行分配,它是标志一个主机(或路由器)和一条链路的接口,其编址方法有:分类的IP地址.子网的划分.构成超网. 分类两级IP地址可以记为:IP::={&l ...

  2. 'scope' is defined but never used

    错误如下: 解决办法: 1.scope这个属性在最新版本vue已经被弃用,升级成slot-scope了 ,所以属性名应该改为slot-scope. 2.如上所示,我们发现,还是有报错,原因是vetur ...

  3. ubuntu 下安装 navicat 12

    一.去官网下载navicat112_premium_cs_x64 for linux版本二.用tar解压安装包三.navicat解压即可用,直接进入解压后的目录,然后用‘./’运行start_navi ...

  4. MacOS修改用户名后变为普通用户,无法创建管理员账号

    摘要:有的时候用户修改原电脑用户名,会把该用户降为普通用户,点击下方的锁会弹出下方图示,导致无法修改任何设置 解决方案: 重启电脑Restart按Command+S进入终端terminal输入以下命令 ...

  5. 基于vue项目一键国际化通用方案: vue-i18n + i18n-vue-cli(命令行工具)

    鉴于公司有做的国际化需求,对于公司的vue项目,觉得页面还是挺多的.刚开始觉得很简单,就是把vue文件中的中文,替换成变量,提取成一个文件就可以了,谁知道人肉的提取的部分确实太痛苦了,而且容易出错.最 ...

  6. 原创《weex面向未来的架构》

    最近一直在做weex的调研工作,整理之后给公司做了一次技术分享. 分享内容如下: 1:Weex是什么? 2:  Weex目前能做什么? 3:  Weex 如何调试 4:  剖析一下Weex原理 5: ...

  7. 组装一台PRUSA I3打印机

    闲来无事,又搞了台机.这样下去顶不住了.草. 还是咸鱼购买,但是这台收到的时候比我以前任何一台都要散,几乎重新装了一台. 此处省略收到货时候的零件图,省略装机图. 不得不提的是,原机用的山寨melzi ...

  8. vscode下运行matlab记录

    Linux下安装MATLAB可参照以下链接: https://blog.csdn.net/qq_31285709/article/details/82083902 在vscode 中运行.m文件. 首 ...

  9. SAP FI中配置“特别总帐标志” SGL

    SAP FI中配置“特别总帐标志” SGL   创建时间:2018年10月6日(星期六) 下午3:42 | 分类:未分类 | 字数:396 |  SAP FI中配置“特别总帐标志” SGL 2013年 ...

  10. unittest用例执行的顺序

    unittest在执行用例(test_xxx)时,并不是按从上到下的顺序执行,有特定的顺序. 示例: import unittest class TestBdd(unittest.TestCase): ...