You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python Selenium在网页逐个搜索作业并点击对应报告链接

Python + Selenium 自动化作业搜索与报告点击问题解决

问题背景

我用Python结合Selenium开发自动化任务,需求是:根据预设的每日作业列表,在网页的作业运行表格(含日期、作业名、状态、报告链接列)中逐个搜索当天运行的作业名称,然后点击对应的报告链接。但目前搜索环节一直找不到目标作业,任务卡在这一步。

现有代码问题分析

1. 作业列表整理逻辑错误

获取当天作业的代码中,running_jobs的元素是逗号分隔的字符串(比如["job1,job2,job3,job4"]),而非拆分后的单个作业名列表。后续遍历会把整个字符串当成一个元素,无法正确获取单个作业名称。

2. Selenium部分的核心问题

  • 每次循环作业都重新打开浏览器窗口,低效且易出错
  • 错误地用for j in job遍历作业名字符串,会把作业名拆成单个字符逐个搜索,完全不符合需求
  • 用time.sleep(5)硬等页面加载,稳定性差,无法适配页面加载速度波动
  • XPATH仅匹配作业名,未结合日期过滤当天作业,可能误匹配历史作业

修复方案

  1. 先将逗号分隔的作业字符串拆分为单个作业名列表
  2. 提前初始化浏览器,全程复用一个实例,避免重复打开
  3. 用显式等待替代硬sleep,确保元素加载完成后再操作
  4. 优化XPATH,结合当天日期定位目标作业行,再精准找到对应报告链接
  5. 所有作业处理完成后统一关闭浏览器

完整修复代码

第一步:整理当天作业列表

import datetime

job_details = {
    "RTR": {
        "ROWH100929": {"Monday": ["job1,job2,job3,job4"],
                       "Tuesday": ["job1,job2"],
                       "Wednesday":["job1,job2"],
                       "Thursday":["job1,job4"],
                       "Friday": ["job1,job2"]},                       
    },
    "TCR": {
        # 补充你的作业详情
    },                       
    "MAA": {
        # 补充你的作业详情
    }
}

day = datetime.datetime.today().strftime('%A')
today_jobs = []
# 拆分逗号分隔的作业字符串,整理成单个作业名的列表
for site, machines in job_details.items():
    for machine, jobs in machines.items():
        if day in jobs:
            job_str_list = jobs[day]
            for job_str in job_str_list:
                today_jobs.extend([job.strip() for job in job_str.split(',')])

print(f"当天待处理作业:{today_jobs}")

第二步:Selenium自动化搜索与点击

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
from selenium.common.exceptions import NoSuchElementException, TimeoutException
import datetime

# 仅初始化一次浏览器
options = webdriver.ChromeOptions()
options.add_argument('--incognito')
options.add_argument("--lang=en")
s = Service("C:/Users/Public/DXS/drivers/chromedriver.exe")
driver = webdriver.Chrome(service=s, options=options)
driver.maximize_window()
driver.get("https://nlp.ope.applis.fr/ope/runsIndex.html")

today_date = datetime.date.today().strftime('%Y/%m/%d')
wait = WebDriverWait(driver, 10)  # 显式等待最长10秒

# 遍历当天所有作业
for job_name in today_jobs:
    try:
        # 结合日期和作业名定位目标行(根据网页实际结构调整列的位置)
        job_row = wait.until(
            EC.presence_of_element_located(
                (By.XPATH, f"//tr[td[text()='{today_date}'] and td[contains(text(),'{job_name}')]]")
            )
        )
        print(f"找到作业:{job_name}")
        
        # 定位该行的报告链接(根据实际链接文本调整)
        report_link = job_row.find_element(By.XPATH, ".//a[contains(text(),'Report')]")
        report_link.click()
        print(f"已点击{job_name}的报告链接")
        
        # 若报告在新窗口打开,可添加窗口切换逻辑(按需启用)
        # driver.switch_to.window(driver.window_handles[-1])
        # 处理报告页面后切回原窗口
        # driver.switch_to.window(driver.window_handles[0])
        
    except TimeoutException:
        print(f"超时未找到作业:{job_name}")
    except NoSuchElementException:
        print(f"未找到作业:{job_name} 或对应的报告链接")

# 所有任务完成后关闭浏览器
driver.quit()

注意事项

  • 根据网页实际表格结构,调整XPATH中的列位置(比如日期列、作业名列的索引)
  • 如果报告链接的文本不是"Report",需对应修改XPATH中的文本匹配规则
  • 显式等待能有效避免页面加载延迟导致的元素找不到问题,比硬sleep更稳定

内容的提问来源于stack exchange,提问作者Mittu BR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 12:35:21