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模式

 

posted @ 2019-06-06 10:51  pathbreaker  阅读(925)  评论(0)    收藏  举报