Selenium如何模拟点击不加载跳转页 提取商品prodNum参数
Angular电商站点商品prodNum参数提取方案
以下方案均不需要实际加载商品详情页,采集效率和直接读取DOM一致:
方案1:拦截导航事件抓跳转地址(兼容性最高)
点击商品前先注入JS脚本拦截所有页面跳转行为,将目标URL存储到全局变量后直接阻断导航,完全不会触发新页面加载:- 列表页DOM加载完成后,先执行以下注入脚本:
window.__targetUrl = null; // 拦截location赋值跳转 const originLocation = Object.getOwnPropertyDescriptor(window, 'location'); Object.defineProperty(window, 'location', { set(val) { window.__targetUrl = val; }, get() { return originLocation.get.call(this); } }); // 拦截单页应用路由跳转 const originPush = history.pushState; history.pushState = (_, __, url) => window.__targetUrl = url; const originReplace = history.replaceState; history.replaceState = (_, __, url) => window.__targetUrl = url;- 正常定位商品元素执行点击操作,此时跳转被拦截,不会触发页面加载
- 读取
window.__targetUrl值,解析URL参数提取prodNum即可,提取后重置window.__targetUrl = null即可处理下一个商品
方案2:直接读取Angular绑定的数据源(效率最高)
Angular框架会把DOM绑定的数据直接挂在元素属性上,不需要触发点击就能拿到完整商品数据:- 针对AngularJS(1.x版本):定位商品元素后执行脚本
const item = angular.element(元素DOM).scope().item,prodNum字段直接存在item对象中 - 针对Angular 2+版本:直接读取元素的
__ngContext__属性,遍历该数组内存储的组件、数据对象,找到带prodNum/prodNumber字段的对象即可拿到值
- 针对AngularJS(1.x版本):定位商品元素后执行脚本
方案3:插桩clickOnItem函数拿入参
不需要查找函数原定义位置,直接在全局重写该函数拦截入参:const originClick = window.clickOnItem; window.clickOnItem = (item, idx) => { window.__currentItem = item; // 不执行原函数逻辑,避免跳转 }触发商品点击后直接读取
window.__currentItem即可拿到完整商品数据,prodNum为该对象的内置字段。
实操提示:如果站点开启了CSP、代码混淆程度较高,优先使用方案1,只要点击后存在跳转行为就可以100%抓到目标地址,无额外性能消耗。
内容的提问来源于stack exchange,提问作者DonCarleone
相关产品推荐
相关产品推荐

