

在自动化下载亚马逊后台(以紫鸟浏览器运行)的各类报表(如 AU/US 站点的 Amazon Fulfillment Reports - All Orders)时,常面临两个核心问题:
1、日期动态计算:每周任意一天运行流程,均需要自动定位并下载上上周日(Start)至 上周六(End)的数据。例如:2026-08-27(周四)运行,需自动定位 2026-08-16 ~ 2026-08-22
2、Shadow DOM 穿透与不可输入框:亚马逊后台的日期选择组件通常位于多层 #shadow-root (open) 嵌套之下,传统的 XPath 或物理点击容易失效或无法聚焦输入


采用 “Python 动态计算日期 + JavaScript 穿透 Shadow DOM 直接赋值” 的组合方案,既保证了日期的精准性,又避免了复杂的 UI 自动化点击逻辑。
1. Python 动态日期算法
# 使用提醒:
# 1. xbot包提供软件自动化、数据表格、Excel、日志、AI等功能
# 2. package包提供访问当前应用数据的功能,如获取元素、访问全局变量、获取资源文件等功能
# 3. 当此模块作为流程独立运行时执行main函数
# 4. 可视化流程中可以通过"调用模块"的指令使用此模块
import xbot
from xbot import print, sleep
from . import package
from .package import variables as glv
from datetime import datetime, timedelta
def week_data_parse(site="AU"):
"""
计算上上周日 至 上周六的日期范围
:param site: 站点类型,默认 AU ('%d/%m/%Y'),US 站点为 '%m/%d/%Y'
:return: (start_date_str, end_date_str)
"""
today = datetime.now()
# today.weekday(): 周一为 0 ... 周日为 6
# 修正公式:计算当前日期距离【上周六】相差的天数
days_to_last_saturday = (today.weekday() + 1) % 7 + 1
last_saturday = today - timedelta(days=days_to_last_saturday)
last_last_sunday = last_saturday - timedelta(days=6)
# 根据站点动态配置日期格式(AU: 日/月/年,US: 月/日/年)
date_format = '%m/%d/%Y' if site.upper() in ['US', 'CA'] else '%d/%m/%Y'
start_str = last_last_sunday.strftime(date_format)
end_str = last_saturday.strftime(date_format)
print(f"[{site}站点] 计算结果:上上周日【{start_str}】 ~ 上周六【{end_str}】")
return start_str, end_str
def main(args):
week_data_parse()运行以上代码可以得到我们想要的结果 打印如下:
[AU站点] 计算结果:上上周日【16/08/2026】 ~ 上周六【22/08/2026】
2. JS 穿透 Shadow DOM 修改日期
通过影刀指令【执行 JS 脚本】,传入 Python 计算好的变量 start_dmy_mdy 与 end_dmy_mdy。
RPA主流程如下:
JS代码如下:
function clickOnKatOption(element, start_dmy_mdy) { const shadowHosts = document.querySelectorAll('#root kat-date-range-picker');
shadowHosts.forEach(shadowHost => {
const shadowRoot1 = shadowHost.shadowRoot;
const katDatePicker = shadowRoot1.querySelector('kat-date-picker[kat-aria-label="Start date"]');
if (katDatePicker) {
// 直接设置日期选择器的值为 formatted_date_dmy
katDatePicker.setAttribute('value',start_dmy_mdy);
} else {
console.log("未找到匹配的 kat-date-picker 元素");
}
});
return null;
}
⚡ 极速高效:绕过弹窗、翻月等 UI 点击流程,一步完成赋值,效率提升 5-10 倍。
🎯 100% 稳定:不依赖屏幕分辨率、物理坐标或窗口置顶,彻底杜绝元素定位异常。
🔓 穿透隔离:通过原生 .shadowRoot 链式调用,轻松突破 CSS 样式阻断与只读(Readonly)限制。
容器检索:querySelectorAll('#root kat-date-range-picker') — 全局定位亚马逊 Web Component 根节点。
DOM 穿透:shadowHost.shadowRoot — 读取 open 状态节点,越过 Shadow DOM 隔离层。
精准定位:querySelector('kat-date-picker[kat-aria-label="..."]') — 匹配 Start date 与 End date 组件。
直接赋值:katDatePicker.setAttribute('value', ...) — 避开交互组件,直改底层属性。
场景 1:Web Components 隔离结构 — 页面存在 <kat-date-picker> 等深层包裹元素,传统 XPath/CSS 无法穿透。
场景 2:只读/禁用键盘输入框 — 元素带 readonly 属性,模拟键盘输入无效,仅能通过脚本直接灌入数据。
场景 3:高稳定性 RPA 流程搭建 — 避免因页面缩放、网络微小延迟、弹窗遮挡或坐标偏移导致的任务中断。
跨站点日期格式兼容:
1.AU / UK / EU 站点:常用格式为 DD/MM/YYYY(例如 16/08/2026)。
2.US / CA 站点:常用格式为 MM/DD/YYYY(例如 08/16/2026)。
3.编写 RPA 流程时,建议将站点类型设为入参,由 Python 动态生成对应格式。
通用性复用:
1.该“Python + JS 穿透”模式同样适用于亚马逊后台其他所有基于相同 Web 组件的报表下载,如 Reimbursements、Removal Shipment、Inventory Event、Daily Inventory History、Aged Inventory Surcharge、Monthly Storage Fees 等。