原因:
测试时,老是登录,真是麻烦。所有以必要让他自己登录。
原理:特定元素出现后,保存cookies,注意名称要个性化。当然登录后要及时更新。
以下代码测试通过,多余代码忽略。因为我还要搞其他的。
import tkinter as tk
import random
from tkinter import filedialog
from datetime import datetime
import pyperclip
import os
import re
from tkinter import messagebox
from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.common.exceptions import NoSuchElementException,ElementClickInterceptedException
from selenium.common.exceptions import WebDriverException
import json
import time
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import configparser
def js_condition(driver):
"""自定义等待条件函数,检查JavaScript返回值"""
return driver.execute_script("return document.readyState") == "complete"
def open_edge_browser(url):
global driver
# 设置Edge选项
edge_options = Options()
edge_options.use_chromium = True
# 向Edge浏览器传递启动参数
edge_options.add_argument('--disable-extensions') # 禁用浏览器扩展
edge_options.add_argument('--disable-gpu') # 禁用GPU硬件加速
# 初始化Edge浏览器驱动(假设msedgedriver.exe已添加到PATH)
driver = webdriver.Edge(options=edge_options)
# 定义 cookies 文件路径
cookies_file_path = 'aigccookies.txt'
# 检查 cookies 文件是否存在
if os.path.exists(cookies_file_path):
# 如果存在,读取文件内容
with open(cookies_file_path, 'rb') as file:
cookies = file.read()
# 将 cookies 加载到 WebDriver 中
driver.execute_cdp_cmd("Network.setCookies", {
"cookies": eval(cookies) # 使用 eval 解析 cookies 数据
})
# 接下来可以访问需要登录的页面,如果 cookies 有效,将实现免登录
driver.get(url) # 替换为实际的目标网页 URL
driver.maximize_window()
# 保存 cookies
cookies = driver.get_cookies()
with open('aigccookies.txt', 'w') as file:
file.write(str(cookies))
print("aigccookies已更新")
return driver
else:
print("Cookies 文件不存在,无法实现免登录。")
try:
# 打开网页
driver.get(url)
# 设置显式等待,等待页面加载完成
# 这里使用了多个条件来确保页面加载完成:
# 1. `EC.presence_of_element_located((By.TAG_NAME, 'body'))` 确保body标签存在,基本的HTML结构已加载。
# 2. `EC.visibility_of_element_located((By.ID, 'someId'))` 可以替换为页面上某个关键元素的ID,确保该元素不仅加载而且可见。
# 3. `EC.javascript_returned_value(True)` 可以用来执行JavaScript检查`document.readyState`是否为"complete