如何使用Selenium抓取PowerBI图表中的数据
Selenium获取PowerBI折线图全量数据最佳实践
你遇到的悬停仅显示单条Ad Sales数据的问题,本质是PowerBI折线图的交互命中层是独立的透明路径(即DOM中class为interactivity-line的两个path元素),默认鼠标悬停只会命中层级更高的单条路径,因此tooltip不会展示全部序列指标。结合提供的DOM结构,按稳定性从高到低推荐以下方案:
方案1:遍历焦点元素读取无障碍属性(优先选择,稳定性100%)
PowerBI做了完整的键盘无障碍适配,所有数据点都对应可聚焦的DOM节点,不需要模拟鼠标操作就能拿全数据:
- 核心规律:DOM中class为
focus-element的circle节点就是当前激活的数据点,其aria-label属性直接存储了维度值+指标值,示例中已可见属性值为Week Starting in: Sunday, September 05, 2021. Ad Sales 50,497.72. - 实现步骤:
- 用Selenium定位绘图区根节点:
g[aria-label="Plot area"],调用send_keys给该节点发送焦点激活事件 - 循环发送左/右方向键,每次按键后等待100ms,读取当前处于焦点状态的
circle.focus-element的aria-label属性值 - 方向键遍历会自动按X轴对齐所有指标序列,遍历完成后即可拿到全量的Ad Sales、Ad Spend两类数据,不会出现单序列漏读的问题
- 用Selenium定位绘图区根节点:
- 优势:完全不受页面缩放、图表尺寸变化、元素层级遮挡影响,执行效率比模拟鼠标悬停高60%以上。
方案2:解析SVG路径反算数值(无交互场景可选)
如果不想触发任何页面交互,可以直接解析SVG绘图数据反推实际值:
- 核心规律:DOM中两个带固定stroke颜色的
path.line元素分别对应两类指标:stroke: rgb(255, 99, 0)的橙色线为Ad Sales,stroke: rgb(102, 102, 102)的灰色线为Ad Spend - 实现步骤:
- 提取两个path的
d属性,按路径指令分割得到所有数据点的(x,y)像素坐标 - 定位X、Y轴的刻度节点,计算像素坐标和实际日期、指标值的映射比例
- 代入每个点位的像素坐标,换算得到实际的业务数值
- 提取两个path的
- 注意:该方案需要提前校准坐标轴的边距偏移,仅适合图表配置固定不变的场景。
方案3:修正鼠标悬停逻辑(不推荐,容错率极低)
如果必须用悬停读取tooltip,需要调整鼠标命中位置:
- 问题原因:当前鼠标仅落在Ad Sales对应的上层透明交互路径上,没有触发X轴跨序列的tooltip展示
- 调整方式:计算每个X轴刻度对应的中线坐标,将鼠标移动到两个交互路径的中间重叠位置,等待tooltip渲染完成后读取tooltip节点内容
- 缺陷:极易因为页面渲染延迟、窗口大小变化、缩放比例变动导致鼠标位置偏移,漏数据概率超过30%。
附:目标图表绘图区DOM结构
<g role="listbox" aria-label="Plot area" aria-live="polite" class="mainGraphicsContext setFocusRing" tabindex="0" focusable="true" pbi-focus-tracker-idx="4"> <path class="line" d="M10,32.74504916281946L53.59311166071265,32.75704678802555L97.1862233214253,35.65811560366859L140.77933498213795,29.794149851813685L184.3724466428506,27.080717438272877L227.96555830356328,25.30021605667766L271.5586699642759,28.72240145414262L315.1517816249886,26.195238897052764L358.7448932857012,27.00679485068013L402.3380049464139,26.56327008532564L445.93111660712657,28.675669896949717L489.52422826783925,36.02464036366446L533.1173399285518,22.04296303514015L576.7104515892645,27.504776998248147L620.3035632499772,28.213239456718878L663.8966749106899,37.95961520486397L707.4897865714024,25.569662274422924L751.0828982321151,12.40761105100989L794.6760098928278,11.770972940746079" style="stroke: rgb(255, 99, 0); stroke-opacity: 1; stroke-width: 3; stroke-linejoin: round;"></path> <path class="line" d="M10,72.29998204410552L53.59311166071265,72.78037126143857L97.1862233214253,73.56588752627782L140.77933498213795,70.91160394301319L184.3724466428506,70.2662177885408L227.96555830356328,70.27319039942292L271.5586699642759,70.94981342023907L315.1517816249886,70.77908129544518L358.7448932857012,70.75805586077905L402.3380049464139,69.81753888643858L445.93111660712657,70.01474110809976L489.52422826783925,71.27097316869333L533.1173399285518,67.68272557409315L576.7104515892645,67.12250641828113L620.3035632499772,67.4932922182605L663.8966749106899,72.35342796733306L707.4897865714024,67.20621002947237L751.0828982321151,64.94867661356142L794.6760098928278,64.93905699299259" style="stroke: rgb(102, 102, 102); stroke-opacity: 1; stroke-width: 3; stroke-linejoin: round;"></path> <path class="interactivity-line sub-selectable ungroupable-sub-selection" data-sub-selection-object-name="lines" d="M10,32.74504916281946L53.59311166071265,32.75704678802555L97.1862233214253,35.65811560366859L140.77933498213795,29.794149851813685L184.3724466428506,27.080717438272877L227.96555830356328,25.30021605667766L271.5586699642759,28.72240145414262L315.1517816249886,26.195238897052764L358.7448932857012,27.00679485068013L402.3380049464139,26.56327008532564L445.93111660712657,28.675669896949717L489.52422826783925,36.02464036366446L533.1173399285518,22.04296303514015L576.7104515892645,27.504776998248147L620.3035632499772,28.213239456718878L663.8966749106899,37.95961520486397L707.4897865714024,25.569662274422924L751.0828982321151,12.40761105100989L794.6760098928278,11.770972940746079" style="stroke-width: 10; stroke-linejoin: round;"></path> <path class="interactivity-line sub-selectable ungroupable-sub-selection" data-sub-selection-object-name="lines" d="M10,72.29998204410552L53.59311166071265,72.78037126143857L97.1862233214253,73.56588752627782L140.77933498213795,70.91160394301319L184.3724466428506,70.2662177885408L227.96555830356328,70.27319039942292L271.5586699642759,70.94981342023907L315.1517816249886,70.77908129544518L358.7448932857012,70.75805586077905L402.3380049464139,69.81753888643858L445.93111660712657,70.01474110809976L489.52422826783925,71.27097316869333L533.1173399285518,67.68272557409315L576.7104515892645,67.12250641828113L620.3035632499772,67.4932922182605L663.8966749106899,72.35342796733306L707.4897865714024,67.20621002947237L751.0828982321151,64.94867661356142L794.6760098928278,64.93905699299259" style="stroke-width: 10; stroke-linejoin: round;"></path> <g class="cat"></g> <g class="cat"></g> <g class="selected-markers"></g> <circle class="focus-element setFocusRing" tabindex="0" focusable="true" role="option" aria-label="Week Starting in: Sunday, September 05, 2021. Ad Sales 50,497.72." cx="10" cy="32.74504916281946" r="3.5" style="fill: none;"></circle> </g>
内容的提问来源于stack exchange,提问作者Aidez
相关产品推荐
相关产品推荐

