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