1. 登录为验证码或者其他不好进行UI操作的情况的登录情况,且无法直接使用token或者cookie的方式进行跳过登录的情况,需要先手动登录一次保存好登录信息,之后免登录
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import json
import time
from time import sleep
# 1. 配置Chrome(保留登录上下文)
chrome_options = Options()
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"]) # 隐藏Selenium的自动化标识,避免被网站检测到是机器人操作
driver = webdriver.Chrome(options=chrome_options) # 用自定义配置初始化Chrome浏览器驱动
# 2. 打开登录页,等待你手动登录
driver.get("https://app.qtest.com")
input("请在浏览器中完成登录,登录成功后按回车键继续…")
# 3. 保存所有登录上下文(核心:完整获取,不遗漏任何字段)
login_info = {
"cookies": driver.get_cookies(), # 保存所有Cookie(含TDC_token等)
"local_storage": {},
"session_storage": {}
}
# 3.1 保存LocalStorage所有键值对
local_storage_keys = driver.execute_script("return Object.keys(localStorage);")
for key in local_storage_keys:
login_info["local_storage"][key] = driver.execute_script(f"return localStorage.getItem('{key}');")
# 3.2 保存SessionStorage所有键值对
session_storage_keys = driver.execute_script("return Object.keys(sessionStorage);")
for key in session_storage_keys:
login_info["session_storage"][key] = driver.execute_script(f"return sessionStorage.getItem('{key}');")
# 4. 写入本地JSON文件(持久化保存)
with open("qimi_login_info.json", "w", encoding="utf-8") as f:
json.dump(login_info, f, ensure_ascii=False, indent=2)
print("登录信息已完整保存到qimi_login_info.json")
driver.quit()
sleep(3)
# 1. 配置Chrome(禁止新窗口、保留上下文)
chrome_options = Options()
chrome_options.add_argument("–disable-popup-blocking") # 禁止弹窗
chrome_options.add_argument("–new-window=0") # 禁止新窗口
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"]) # 隐藏自动化标识
driver = webdriver.Chrome(options=chrome_options)
# 2. 先进入目标域名上下文(关键:避免Storage禁用错误)
driver.get("https://app.qimi.com")
time.sleep(2)
# 3. 读取本地保存的登录信息
with open("qimi_login_info.json", "r", encoding="utf-8") as f:
login_info = json.load(f)
# 4. 注入所有登录上下文(按顺序:Cookie → LocalStorage → SessionStorage)
# 4.1 注入Cookie(逐个添加,确保完整)
for cookie in login_info["cookies"]:
# 修复Cookie的expiry类型(避免Selenium报错)
if "expiry" in cookie and isinstance(cookie["expiry"], float):
cookie["expiry"] = int(cookie["expiry"])
driver.add_cookie(cookie)
# 4.2 注入LocalStorage
for key, value in login_info["local_storage"].items():
driver.execute_script(f"localStorage.setItem({json.dumps(key)}, {json.dumps(value)});")
# 4.3 注入SessionStorage
for key, value in login_info["session_storage"].items():
driver.execute_script(f"sessionStorage.setItem({json.dumps(key)}, {json.dumps(value)});")
print("所有登录信息已注入,正在进入目标页面…")
# 5. 访问目标页面(同一窗口,上下文不丢失)
driver.get("https://app.test.com/Home")
# 6. 验证是否登录成功(显式等待,避免空白页误判)
try:
# 等待首页关键元素加载(替换为你页面的实际元素)
WebDriverWait(driver, 15).until(
EC.presence_of_element_located((By.XPATH, '//*[contains(text(),"首页") or contains(@class,"user-name")]'))
)
print("免登录成功!已进入Home页面")
except Exception as e:
print(f"免登录失败,原因:{e}")
driver.save_screenshot("login_fail.png")
# 保持浏览器打开
input("按回车键关闭浏览器…")
driver.quit()
2. 直接使用cookie信息登录:这种情况会存在cookie过期的情况,所以最好使用前刷新为最新的cookie,或者通过一次登录的方式将cookie写入,然后直接读取
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time
# 1. 配置Chrome(隐藏自动化标识,避免被检测)
chrome_options = Options()
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_argument("–start-maximized")
driver = webdriver.Chrome(options=chrome_options)
# 2. 关键:先进入目标域名上下文(Cookie与域名绑定,必须先访问域名)
driver.get("http://116.62.1")
driver.maximize_window ()
time.sleep(2)
# 3. 注入有效PHPSESSID Cookie(完全匹配图片中的Cookie参数)
driver.add_cookie({
"name": "PHPSESSID",
"value": "375bf3dad54ca92454b881e3811e", # 从图片中复制的有效值
"domain": "116.62.1", # 图片中的域名
"path": "/", # 图片中的路径
"secure": False, # 图片中是HTTP请求,设为False
"httpOnly": False, # 图片中未标记HttpOnly
"expires": 1769588829 # 图片中过期时间对应的时间戳(可选,浏览器会自动处理)
})
# 4. 访问目标页面(例如图片中的编辑页)
target_url = "http://116.62.1/shop/personal/index.html"
driver.get(target_url)
# 5. 验证是否免登录成功(等待页面关键元素加载)
try:
# 示例:等待页面加载完成(可替换为登录后才会出现的元素,如用户名、编辑按钮)
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, '//*[contains(text(),"编辑") or @class="ueditor"]'))
)
print("免登录成功!已进入目标页面")
print(f"当前页面URL:{driver.current_url}")
except Exception as e:
print(f"免登录失败:{e}")
driver.save_screenshot("login_fail.png")
# 保持浏览器打开
input("按回车键关闭浏览器…")
driver.quit()



