Python3+Selenium获取session和token供Requests使用教程
最近在弄一个UI自动化项目但发现页面存在表单太多,然而表单的数据都是用接口进行封装的。表单中涉及的接口都存在token,于是想起JMeter中可以通过后置处理器获取数据; 想着python+selenium模拟登录应该也可以获取token、session及其他数据。
程序实现
1.系统状况
登录系统后,查看存储状况如下图所示,sessionid和token分别存储在sessionStorage的sessionId和token两个变量中

2.代码实现
#! /usr/bin/python3 # coding:utf-8 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 import json class GetSessionAndToken(): def __init__(self): self.browser = webdriver.Chrome() # 登录系统,具体到自己系统时需要自行修改 def login_system(self): # 登录用户名密码,改成目标系统用户名密码 username = "cc" password = "Aa123456" # 登录页面url,改成目标系统登录页面 url = "http://49.4.68.71:20005/ow/#/login" self.browser.get(url) # 显性等待,直到用户名控件加载出来才进行下一步 WebDriverWait(self.browser, 20, 0.5).until(EC.presence_of_element_located((By.XPATH, "//*[@placeholder='账号']"))) # 填写用户名 self.browser.find_element_by_xpath("//*[@placeholder='账号']").send_keys(username) # 填写密码 self.browser.find_element_by_xpath("//*[@placeholder='密码']").send_keys(password) time.sleep(3) def input_code(self): code = input("请输入验证码:") # code = self.get_auth_code(*self.auth_picture_loc) self.browser.find_element_by_xpath("//*[@placeholder='验证码']").send_keys(code) # 点击登录 self.browser.find_element_by_xpath("//*[@id='app']/div/div[1]/div[1]/form/div[4]/div/button/span").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字符类型为str token = self.browser.execute_script('return sessionStorage.getItem("rbacToken");') # str类型置换为dict token = json.loads(token) # print(f"{token}") # print(token) print(type(token)) print(token['token']) return token # def __del__(self): # # 退出程序时关闭浏览器 # self.browser.close() if __name__ == "__main__": obj = GetSessionAndToken() obj.login_system() obj.input_code() obj.get_token() # sessionid = obj.get_sessionid() # token = obj.get_token() # print(f"sessionid为: {sessionid}\n" # f"token为: {token}")
3.实现效果

由于测试系统存在的验证码不好识别,于是就是直接定义一个提示输入验证码的方法“input_code”。对po分层来说可单独将对应的方法进行拆分,可参考“python+selenium自动化—Page Object模式”
浙公网安备 33010602011771号