昨天做得不太好,今天再来一次,我发现,只要写得多,一定会有发现。
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 True
except 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"]').text
level1_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 = None
results.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