selenium使用Chrome登录缓存进行免登录的方法,利用浏览器的cookie/Session直接获取登录状态,绕过登录环节

1:背景

写自动登录脚本时会遇到阿里云的只能验证,如下图所示

历史解决方法是采用execute_cdp_cmd模式绕过阿里云验证

driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
            "source": """
                       Object.defineProperty(navigator, 'webdriver', {
                         get: () => false
                       })
                      """
        })

但是本月开始(6月初),阿里云智能验证升级了验证模式,导致该方法失效了,因此需要思考其他的登录方式

2:新登录方法

service = Service('C:\Program Files\Google\Chrome\Application\chromedriver.exe')
        self.time = time  # 初始化self.time属性为time模块
        option = webdriver.ChromeOptions()  # 登录后复制浏览器信息
        option.add_argument(
            r"user-data-dir=C:\Users\Administrator\AppData\Local\Google\Chrome\User Data")  # 浏览器路径User Data路径
        self.driver = webdriver.Chrome(service=service, options=option)

(1)service设定个驱动指定位置(方便快速找到驱动,节省自动化用例执行时间)

(2)找到自己谷歌存放个人信息的路径,如上述代码里的C:\Users\Administrator\AppData\Local\Google\Chrome\User Data就是我的路径

3:完整代码示例

# coding:utf-8

import unittest
import time
import requests
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service



class LoadTest(unittest.TestCase):
    def setUp(self) -> None:
        service = Service('C:\Program Files\Google\Chrome\Application\chromedriver.exe')
        self.time = time  # 初始化self.time属性为time模块
        option = webdriver.ChromeOptions()  # 登录后复制浏览器信息
        option.add_argument(r"user-data-dir=C:\Users\Administrator\AppData\Local\Google\Chrome\User Data")  # 浏览器路径User Data路径
        self.driver = webdriver.Chrome(service=service, options=option)

    def tearDown(self) -> None:
        self.time.sleep(2)  # 执行用例结束后等待2秒
        self.driver.quit()  # 执行完用例关闭浏览器

    def test_sign(self):

        self.driver.get('https://www.XXXX.com/')
        self.driver.switch_to.window(self.driver.window_handles[-1])  # 定位到最新打开窗口
        self.time.sleep(2)

        self.time.sleep(1)
        element = self.driver.find_element(By.XPATH,"/html[1]/body[1]/div[2]/div[2]/div[1]/div[3]/div[2]/div[1]/div[2]/div[1]/div[1]/img[1]") or self.driver.find_element(By.XPATH,"//p[@class='task_memberLink']")
        assert element is not None, "签到失败"

if __name__ == '__main__':
    unittest.main()

上述示例代码是一个网站进行签到的逻辑,采用的是直接访问目标网站,且读取浏览器中之前登陆过该网站的缓存,达到打开浏览器时就是登录状态的效果;因此该代码能成功的前提条件就是先在启动该代码的浏览器上【手动登录成功一次】,然后不要退出登录。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值