Final version: Fixed date selection logic and verified full flow

This commit is contained in:
2026-04-18 17:21:38 +08:00
parent f87d005232
commit e15ae99db8
2 changed files with 268 additions and 24 deletions
+49 -24
View File
@@ -110,38 +110,62 @@ class ReportAutomation:
logger.info(f"访问统计页面: {self.secsion_stats_url}")
await page.goto(self.secsion_stats_url)
# 等待页面加载完成,以“导出报表”按钮为准
# 等待页面加载完成
logger.info("等待统计页面加载...")
await page.wait_for_load_state("networkidle")
export_btn = page.get_by_role("button", name="导出报表")
await export_btn.wait_for(state="visible", timeout=20000)
logger.info(f"设置查询日期范围: {self.start_date}{self.end_date}")
# 严格按照参考文件 secsion_export.py 的逻辑
try:
# 找到所有的日期输入框
inputs = page.locator("input")
count = await inputs.count()
date_input_indices = []
for i in range(count):
val = await inputs.nth(i).input_value()
if "-" in val and len(val) >= 10:
date_input_indices.append(i)
if len(date_input_indices) >= 2:
# 填入开始日期
await inputs.nth(date_input_indices[0]).click()
await inputs.nth(date_input_indices[0]).fill(self.start_date)
await inputs.nth(date_input_indices[0]).press("Enter")
# 两个日期输入框都叫“请选择日期”,用 nth 区分
start_input = page.get_by_role("textbox", name="请选择日期").nth(0)
end_input = page.get_by_role("textbox", name="请选择日期").nth(1)
async def set_date(input_box, date_str: str):
logger.info(f"尝试设置日期: {date_str}")
# 1. 点击输入框
await input_box.click()
# 填入结束日期
await inputs.nth(date_input_indices[1]).click()
await inputs.nth(date_input_indices[1]).fill(self.end_date)
await inputs.nth(date_input_indices[1]).press("Enter")
else:
logger.warning("未找到足够的日期输入框,尝试使用默认日期导出")
# 2. 先尝试直接填值 + Enter (参考文件逻辑)
try:
# 由于是 readonly,fill 可能会超时,这里设置较短超时
await input_box.fill(date_str, timeout=2000)
await input_box.press("Enter")
await page.wait_for_timeout(200)
except Exception:
logger.info("直接填值失败或超时,将尝试点击日历单元格")
# 3. 若没有生效,则打开日历点击“日”单元格 (参考文件逻辑)
val = await input_box.input_value()
if val != date_str:
logger.info(f"值未同步({val} != {date_str}),执行日历单元格点击")
# 确保日历已弹出
await input_box.click()
day = str(int(date_str.split("-")[2]))
# 参考文件使用 cell 角色
# page.get_by_role("cell", name=day).click()
# 考虑到可能有多个月份显示,取最后一个弹出的
await page.get_by_role("cell", name=day).last.click()
await page.wait_for_timeout(500)
await set_date(start_input, self.start_date)
await set_date(end_input, self.end_date)
# 等待数据请求完成
logger.info("等待数据请求完成...")
await asyncio.sleep(2)
# 截图确认日期设置后的状态
logger.info("保存日期设置确认截图: date_setting_check.png")
await page.screenshot(path="date_setting_check.png")
except Exception as e:
logger.warning(f"填充日期时遇到问题: {str(e)}")
logger.error(f"日期选择逻辑执行失败: {str(e)}")
await page.screenshot(path="date_error.png")
raise e
# 点击导出报表并捕获下载
logger.info("点击导出报表...")
@@ -149,7 +173,8 @@ class ReportAutomation:
await export_btn.click()
download = await download_info.value
filename = f"commodity_export_{datetime.now().strftime('%Y%m%d_%H%M%S')}.xlsx"
# 使用服务器建议的文件名
filename = download.suggested_filename
save_path = os.path.join(self.download_dir, filename)
await download.save_as(save_path)