在接口测试的过程中,经常会遇到有些接口需要在登录的状态下才能请求,否则会提示
请登录
,那么怎样解决呢?
上一篇文章我们介绍了Cookie绕过登录,其实这就是保持登录状态的方法之一。
另外一种方式则是通过session进行会话保持。
session(会话)
session,即会话。那么什么又是会话?我们来看一下会话的生存周期就能大致明白,如下:
开始:客户端(通常是浏览器)–>发送第一个请求–>某应用服务器,彼此成功建立连接,即创建会话;
会话中:客户端接着请求该应用服务器的其他资源;
结束:关闭客户端(通常是浏览器)或者会话超时,会话结束。
会话保持
会话保持,可以通俗的理解为使同一用户发送的相关联的请求处于同一个会话中不被断开。比如使用session成功地登录了某个网站,则在再次使用该session对象请求该网站的其他网页时,都会默认使用该session中之前保存的cookie等参数去请求,而不需要再次登录。
session会话保持大致原理如下:
-
客户端应用第一次请求该应用服务器时,服务器会创建一个session,该session对象中会存储特定的用户会话所需的属性及配置信息(如用户信息或登录状态等),并保存在服务器中。
-
创建session时,会赋予其一个session ID,该session ID会被置于set-cookie中随着请求返回给客户端,并保存在本地的cookie中。
-
后续,客户端请求本应用中其他资源时,服务器就会收到cookie中的session ID,并根据ID在内存中查找之前创建的session对象,如果能找到且未过期,则说明是来自同一户用的请求。
python进行session会话保持
在接口自动化测试中,某些情况下可以使用session会话保持机制来保持登录状态,这样就不需要每次清求接口都需要先登录。
接下来,我们以查看TesterHome网站上个人的通知消息、个人信息为例,来说明在python接口自动化测试中怎样利用session保持登录状态。
注意:
-
这里我先尝试请求登录接口构造session,然后再利用该session去请求其他接口,仍然提示需先登录,说明该网站此种方式行不通。
-
因为登陆后跳转到了首页,所以这里我们可以利用请求首页接口构造session,然后就可以利用该session去请求其他接口了。
1,首先,Fiddler抓包获取登录成功后请求首页接口时的cookie
2,拿到cookie,利用请求首页接口构造session对象。
import requestsheaders = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36","cookie": \'如上面截图所示获取的cookie,即登录成功后跳转时,请求首页接口https://testerhome.com/时的cookie\'}# 构造一个全局session对象S = requests.session()# 使用session对象即S模拟登录成功后请求首页接口,更新Sh_url = "https://testerhome.com/"h_res = S.get(url=h_url, headers=headers).text
这一步会得到的session对象
S
中就包含了登录成功后的cookie等信息了,再使用该session对象去请求其他接口就不需要再次登录了。
3,使用上一步得到的session对象,查看个人通知消息、个人信息接口。
# 使用session对象S请求个人通知消息接口n_url = "https://testerhome.com/notifications/personal"n_res = S.get(url=n_url).textprint(n_res)# 使用session对象S请求个人信息接口s_url = "https://testerhome.com/setting"s_res = S.get(url=s_url).textprint(s_res)
请求个人信息接口,执行结果如下:
4,完整代码如下:
import requestsheaders = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36","cookie": \'如上面截图所示获取的cookie,即登录成功后跳转时,请求首页接口https://testerhome.com/时的cookie\'}# 构造一个全局session对象S = requests.session()# 使用session对象即S模拟登录成功后请求首页接口,更新Sh_url = "https://testerhome.com/"h_res = S.get(url=h_url, headers=headers).text# 使用session对象S请求个人通知消息接口n_url = "https://testerhome.com/notifications/personal"n_res = S.get(url=n_url).textprint(n_res)# 使用session对象S请求个人信息接口s_url = "https://testerhome.com/setting"s_res = S.get(url=s_url).textprint(s_res)
总结
session与cookie是不同的机制。
相同点:两者都能记录用户的状态,且都是由服务端生成。
不同点:cookie是存储在本地客户端的,而session则存储在服务端。
两者之间存在联系:session会话保持机制需要依赖cookie,因为session ID是存储在cookie中的。