Final version: Fixed date selection logic and verified full flow
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user