昨天做得不太好,今天再来一次,我发现,只要写得多,一定会有发现。
1、加入本地目录,不要一直登录。
# 定义Edge浏览器的用户数据目录edge_user_data_dir = r"C:\Users\Administrator\AppData\Local\Microsoft\Edge\User Data\Default"# 设置Edge选项edge_options = Options()edge_options.use_chromium = True# 向Edge浏览器传递启动参数edge_options.add_argument(f"--user-data-dir={edge_user_data_dir}")
2.如果有登录按钮才登录,否则就不登录了。
参考代码
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC# 初始化Edge浏览器
edge_options = Options()
edge_options.add_argument('--headless') # 可选:如果需要在无头模式下运行
edge_options.add_argument('--disable-gpu') # 可选:在无头模式下防止GPU错误
driver = webdriver.Edge(options=edge_options)# 设置超时时间,例如10秒
timeout = 10# 导航到目标URL
driver.get('https://huixie.iflyrec.com/list')# 定位元素,使用类名查找
try:login_register_button = WebDriverWait(driver, timeout).until(EC.presence_of_element_located((By.CLASS_NAME, 'btn-login-register')))print("元素找到,执行下一步操作...")# 如果你想点击这个元素,可以添加以下代码login_register_button.click()
except TimeoutException:print("元素未找到,超时了!")# 清理资源
driver.quit()
3、换一种思路,如何有工作台了,则提示已经登录,否则,则登录过程。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC# 初始化Edge浏览器
edge_options = Options()
edge_options.add_argument('--headless') # 可选:如果需要在无头模式下运行
edge_options.add_argument('--disable-gpu') # 可选:在无头模式下防止GPU错误
driver = webdriver.Edge(options=edge_options)# 设置超时时间,例如10秒
timeout = 10# 导航到目标URL
driver.get('https://huixie.iflyrec.com/list')# 定位元素,使用类名和包含的文本
try:dashboard_element = WebDriverWait(driver, timeout).until(EC.presence_of_element_located((By.XPATH, '//div[@class="item-wrap-name" and contains(text(), "工作台")]')))print("元素找到,已登录!")
except TimeoutException:print("元素未找到,可能未登录!")# 清理资源
driver.quit()
4.至此,完成进入界面,无论新建或原来的文档,根据实际
5.切换到最后一个窗口,即准备自动化工作的窗口。
def switch_to_last_window(driver):try:# 获取所有窗口句柄window_handles = driver.window_handles# 遍历窗口句柄,定位到最后一个打开的标签页for handle in window_handles:driver.switch_to.window(handle) # 切换到当前循环的窗口# 此时已经位于最后一个标签页,可以执行相应操作print("当前页面的URL是:", driver.current_url)return Trueexcept Exception as e:print(f"移动到最后一页,发生错误:{e}")
6。判断是否有返回主页的按钮,用以最后的返回。
def is_back_icon(driver):# 等待页面加载完成WebDriverWait(driver, 30).until(js_condition)# 等待反馈元素变得可交互back_icon_element = WebDriverWait(driver, 30).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.svg-icon.pointer.icon-back-icon'))# 或者使用By.CLASS_NAME)if back_icon_element:print("出现了返回主页按键,可以工作了")return True,back_icon_element
7.初步测试,很成功
def autocomplete_tasks1():if switch_to_last_window(driver):is_back_icon(driver)
8.我先把所有的问题都改成h1了,很方便浏览。原来直接使用p样式,简直是坑人。
9.取出h1样式的内容及下一级内容,返回相关参数,用以下一步操作。
我试着先取出所有的h1级的问题及是否回答过的内容。该问题如果回答过,会有一个当时提出问题的内容。如
这是取出的代码:
def get_level1_and_level3_info(driver):# 定义等待元素出现的超时时间timeout = 10# 定位 my-menus 下的所有 level1 节点level1_nodes = WebDriverWait(driver, timeout).until(EC.presence_of_all_elements_located((By.XPATH, '//div[@class="my-menus"]//div[@class="el-tree-node is-expanded is-focusable level1"]')))# 提取 level1 和 level3 的信息results = []for level1_node in level1_nodes:level1_text = level1_node.find_element(By.XPATH, './/div[@class="el-tree-node__content"]').textlevel1_data_key = level1_node.get_attribute('data-key')# 查找 level1 节点下的 level3 节点try:level3_text = level1_node.find_element(By.XPATH, './/div[@class="el-tree-node__children"]').text# level3_data_key = level3_node.get_attribute('data-key')except NoSuchElementException:level3_text = None# level3_data_key = Noneresults.append({"node":level1_node,"level1_text": level1_text,"data_key": level1_data_key,"level3_text": level3_text,# "level3_data_key": level3_data_key})return results
10.能点击
def autoco