面试时,HR会问你,开发为什么要在登录时,添加验证码。你应该怎么回答呢?
首先,验证码主要目的是识别是否是机器人登录。
其次,因为大量的自动化(爬虫)登录,会向服务器发送大量的垃圾请求,影响服务器的性能。
1、万能验证码
万能验证码是企业中最常用的方式,有的公司内网不需要输入验证码,外网ip就需要输入验证。
2、屏蔽验证码
测试环境,不需要加验证码。
3、调用接口获取验证码
手机短信验证码,这个需要去掉接口请求返回数据,读取令牌。
4、手动输入
可以在登录完,加上一个时间等待,手动输入一次,不退出去执行程序。
5、读取cookie,跳过登录
5.1 原理
平时手动上网,打开一个网站,登录一次以后,后面的页面就不需要登录.
这时因为网站可以通过cookie记录登录的状态。
所以,我们只需要登录一次,记住cookie。
以后直接设置cookie,服务器就会认为我们登录成功了,这样就可以跳过登录了
5.2 步骤
1、获取登录后的cookie
我们输入验证码时,加一个20秒的时间等待,在这期间手动输入一个验证码。
# # 1、打开浏览器
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
class TestLogin:
def test_login_function(self):
# 2、输入网址,打开登录界面
driver = webdriver.Firefox()
driver.implicitly_wait(5)
driver.get("https://svr-6-9010.share.51env.net/accounts/login/")
# 3、输入用户名
driver.find_element_by_id("id_login").send_keys("changcheng1211")
# 4、输入密码
driver.find_element_by_id("id_password").send_keys("zhaodahai")
# 5.输入验证码
# 假如我们现在没有万能验证码,如何登录
# 输入验证码时,加一个20秒的时间等待,在这期间手动输入一个验证码。
time.sleep(20)
# 6、点击登录按钮
driver.find_element_by_class_name("primaryAction").submit()
# 在登录两秒,确保服务器返回了响应结果,获取并打印登录成功后的cookie信息
time.sleep(2)
print(driver.get_cookies())
# [{'name': 'csrftoken', 'value': 'kdA8P4wzJEz02SlxZQiNwRxXPohU5YJvqJMdcoLHfCcM6uRRCZGraWrSqZULTf5Y', 'path': '/', 'domain': 'svr-6-9010.share.51env.net', 'expiry': 1749554027, 'secure': False, 'httpOnly': False}, {'name': 'sessionid', 'value': '9zitnrp4qgijk43buh7es73gg8pu1jwx', 'path': '/', 'domain': 'svr-6-9010.share.51env.net', 'expiry': 1719314027, 'secure': False, 'httpOnly': True}]
2.登录成功后,将里面的cookie替换掉,并修改过期时间,让cookie永不过期,其实只能保障在测试的这段时间不过期,
import time
import allure
from selenium.webdriver.common.by import By
import allure
class TestLogin:
@allure.feature('登录模块')
def test_skip_login(self,driver):
driver.get('https://svr-6-9010.share.51env.net/accounts/login/')
# 1.在test_login5.py中获取的cookies信息
# csrftoken 和sessionid 的值是动态变化的,时间长了也会过期,
cookies = [{'name': 'csrftoken', 'value': 'r6APJ7wcyV36jbZtCiSmaQoeKM8NAPwr0zZ842ycGR4u8nRNDQRfnrABhvsWmoLT', 'path': '/', 'domain': 'svr-6-9010.share.51env.net', 'expiry': 1749624505, 'secure': False, 'httpOnly': False}, {'name': 'sessionid', 'value': 'f0xgxwylq2m92ku2c2pjcjhck0atco5n', 'path': '/', 'domain': 'svr-6-9010.share.51env.net', 'expiry': 1719384505, 'secure': False, 'httpOnly': True}]
# 2.打开首页后,设置cookie信息
for cookie in cookies:
# 3.cookie是有有效期的,我们需要改一下有效期,让它永远不过期
if 'expiry' in cookie.keys():
cookie['expiry'] = int(time.time()) + 36000
driver.add_cookie(cookie)
# 3.重新打开页面,相当于重新发送了一个带着登录成功cookie的请求,这时,服务器就以为你登录过了,就会返回登录后的界面
driver.get('https://svr-6-9010.share.51env.net/accounts/login/')
time.sleep(1)
driver.find_element(By.LINK_TEXT,'我的媒体').click()
print(driver.get_cookies())
因为验证码的目的就是为了防止机器自动登录,所以任何绕过验证码的方式都不是万能的。有些网站用不了这种方法。