前言

最近在使用 Selenium 时, 遇到的一个问题是由于使用了 SSO 集中鉴权, 会使用微软的two-step authentication code, 导致没有办法实现自动化登录。并且非常无奈的是,找了一大圈人,没有能帮忙解决的,按道理这种登录的问题应该是已经有成熟的经验和 case 了。最终只能靠自己的,打算使用 cookie 来暂时解决,先往下进行。

获取 cookies

打算先写一个简单的函数来获取 cookies, 然后保存在本地,后续直接调用 cookies,这样就只需要一次登录就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import pytest
import time
import json
from selenium import webdriver
from selenium.webdriver.common.by import By

class Testloginforge(object):
def setup_method(self, method):
self.driver = webdriver.Chrome()
self.driver.set_window_size(1536, 870)
self.driver.get("https://targer_url")
self.vars = {}

def teardown_method(self, method):
self.driver.quit()

def test_get_login_cookies(self):
login_email = input("Please input your login email: ")
self.driver.find_element(By.ID, "email").send_keys(login_email)
login_password = input("Please input your password: ")
self.driver.find_element(By.ID, "i0118").send_keys(login_password)
self.driver.find_element(By.ID, "idSIButton9").click()
two_step_code = input("Please input your 2-step code: ")
self.driver.find_element(
By.ID, "idTxtBx_SAOTCC_OTC").send_keys(two_step_code)
self.driver.find_element(By.CSS_SELECTOR, ".button-text").click()
# 由于会存在二次重定向,所以需要重新访问一下目标地址
self.driver.get("https://targer_url")
current_cookies = self.driver.get_cookies()
with open('cookies.json', 'w') as f:
json.dump(current_cookies, f)

if __name__ == "__main__":
pytest.main(["-s", __file__])

使用 cookies 登录

1
2
3
4
5
6
7
8
9
def test_login_with_cookies(self):
with open('cookies.json', 'r') as f:
cookies = json.load(f)
for cookie in cookies:
self.driver.add_cookie(cookie)
self.driver.get("https://targer_url")
current_cookies = self.driver.get_cookies()
with open('cookies.json', 'w') as f:
json.dump(current_cookies, f)

这里遇到的一个问题是,一开始直接先加载了 cookies,然后就报错了 selenium.common.exceptions.InvalidCookieDomainException: Message: invalid cookie domain, 搜索了一下发现是,默认 selenium 驱动 chrome 打开的域名为 data 的白页面,所以使用 cookies 之前需要先访问一下目标地址,可以看到在setup_method 里一定修改每次都优先打开目标地址,然后再加载 cookies。

相关参考:invalid cookie domain

后记

最近肯定会和 selenium 打很多交道,可以好好学习记录一下,整理一下个人的笔记,毕竟好记性不如烂笔头。