Comments (6)
@RichardYou
最近也在做埋点相关的事情,其实这里面最难而且还没解决的问题就是元素的定位。。。是的,这件事情最难最关键的就是“元素定位”,实现元素定位时,需要考虑的指标主要有下面几个:
- 可用性:每一个元素,都可以生成唯一的选择器
- 唯一性:生成出来的选择器,可以唯一定位这个元素
- 长度:生成的选择器的长度(单纯从技术角度说,肯定是越短越好)
- 查找速度:根据选择器查找元素的速度
- 代码量:实现这个功能的代码量多少
根据业务需求,上面几个指标,我们可以选择性能去满足一些,而不是全部,因为上面的指标有时会互相抵消。
https://github.com/fczbkk/css-selector-generator-benchmark里面是一份对多个css-selector-generator
库的性能分析报告,其实目前基本上能考虑到的实现方式,都在里面有了。目前我们公司的埋点都是基于xpath实现的,css-selector之类的方案我也看过,也是基于元素层级和属性定位的。实际上还是没有解决 dom结构频繁变动下和复杂业务场景下的定位问题。
比如:多个操作按钮根据权限展示的都不一样,这种交互复杂的场景下埋点就很容易失效。
尤其是web页面会频繁更新改版。基于层级的方案不怎么靠谱。
不过最近在做的尝试是:解析源码ast,给jsx和vue的template中的element加id。直接修改源文件。目前已经做出来demo,博主可以参考一下
完全赞同你的观点,根据xpath、css选择器,本质上无法解决页面dom变化导致定位失效的问题。而且这种埋点方案无法理解上下文,比较适合作为简单页面(比如建站工具生成的网页,且不会频繁变化的情况下)的辅助。像你说的那种根据源码,添加id的方式是非常好的思路,如果页面是自己可控的话,用你的这种方案肯定是优秀很多的。还有一些情况,比如做sdk的,可能无法侵入别人的代码,我觉得只能尽最大努力提高元素定位的准确率和稳定性,并且在失效的情况下能够告警,其他的思路目前还没有想到。。
from blog_comment_repo.
最近也在做埋点相关的事情,其实这里面最难而且还没解决的问题就是元素的定位。。。
from blog_comment_repo.
@RichardYou
最近也在做埋点相关的事情,其实这里面最难而且还没解决的问题就是元素的定位。。。
是的,这件事情最难最关键的就是“元素定位”,实现元素定位时,需要考虑的指标主要有下面几个:
- 可用性:每一个元素,都可以生成唯一的选择器
- 唯一性:生成出来的选择器,可以唯一定位这个元素
- 长度:生成的选择器的长度(单纯从技术角度说,肯定是越短越好)
- 查找速度:根据选择器查找元素的速度
- 代码量:实现这个功能的代码量多少
根据业务需求,上面几个指标,我们可以选择性能去满足一些,而不是全部,因为上面的指标有时会互相抵消。
https://github.com/fczbkk/css-selector-generator-benchmark里面是一份对多个css-selector-generator
库的性能分析报告,其实目前基本上能考虑到的实现方式,都在里面有了。
from blog_comment_repo.
@RichardYou
最近也在做埋点相关的事情,其实这里面最难而且还没解决的问题就是元素的定位。。。是的,这件事情最难最关键的就是“元素定位”,实现元素定位时,需要考虑的指标主要有下面几个:
- 可用性:每一个元素,都可以生成唯一的选择器
- 唯一性:生成出来的选择器,可以唯一定位这个元素
- 长度:生成的选择器的长度(单纯从技术角度说,肯定是越短越好)
- 查找速度:根据选择器查找元素的速度
- 代码量:实现这个功能的代码量多少
根据业务需求,上面几个指标,我们可以选择性能去满足一些,而不是全部,因为上面的指标有时会互相抵消。
https://github.com/fczbkk/css-selector-generator-benchmark里面是一份对多个css-selector-generator
库的性能分析报告,其实目前基本上能考虑到的实现方式,都在里面有了。
目前我们公司的埋点都是基于xpath实现的,css-selector之类的方案我也看过,也是基于元素层级和属性定位的。实际上还是没有解决 dom结构频繁变动下和复杂业务场景下的定位问题。
比如:多个操作按钮根据权限展示的都不一样,这种交互复杂的场景下埋点就很容易失效。
尤其是web页面会频繁更新改版。基于层级的方案不怎么靠谱。
不过最近在做的尝试是:解析源码ast,给jsx和vue的template中的element加id。直接修改源文件。目前已经做出来demo,博主可以参考一下
from blog_comment_repo.
@RichardYou
最近也在做埋点相关的事情,其实这里面最难而且还没解决的问题就是元素的定位。。。是的,这件事情最难最关键的就是“元素定位”,实现元素定位时,需要考虑的指标主要有下面几个:
- 可用性:每一个元素,都可以生成唯一的选择器
- 唯一性:生成出来的选择器,可以唯一定位这个元素
- 长度:生成的选择器的长度(单纯从技术角度说,肯定是越短越好)
- 查找速度:根据选择器查找元素的速度
- 代码量:实现这个功能的代码量多少
根据业务需求,上面几个指标,我们可以选择性能去满足一些,而不是全部,因为上面的指标有时会互相抵消。
https://github.com/fczbkk/css-selector-generator-benchmark里面是一份对多个css-selector-generator
库的性能分析报告,其实目前基本上能考虑到的实现方式,都在里面有了。目前我们公司的埋点都是基于xpath实现的,css-selector之类的方案我也看过,也是基于元素层级和属性定位的。实际上还是没有解决 dom结构频繁变动下和复杂业务场景下的定位问题。
比如:多个操作按钮根据权限展示的都不一样,这种交互复杂的场景下埋点就很容易失效。
尤其是web页面会频繁更新改版。基于层级的方案不怎么靠谱。
不过最近在做的尝试是:解析源码ast,给jsx和vue的template中的element加id。直接修改源文件。目前已经做出来demo,博主可以参考一下完全赞同你的观点,根据xpath、css选择器,本质上无法解决页面dom变化导致定位失效的问题。而且这种埋点方案无法理解上下文,比较适合作为简单页面(比如建站工具生成的网页,且不会频繁变化的情况下)的辅助。像你说的那种根据源码,添加id的方式是非常好的思路,如果页面是自己可控的话,用你的这种方案肯定是优秀很多的。还有一些情况,比如做sdk的,可能无法侵入别人的代码,我觉得只能尽最大努力提高元素定位的准确率和稳定性,并且在失效的情况下能够告警,其他的思路目前还没有想到。。
嗯,这种方案的确有局限性,只能公司内部用用。不仅是定位,检查工具,圈点工具也要跟上。
from blog_comment_repo.
好文章
from blog_comment_repo.
Related Issues (20)
- Android埋点技术分析 | UncleChen的博客 HOT 9
- JS埋点技术分析 | UncleChen的博客
- 使用Play框架编写Web应用 | UncleChen的博客
- Android埋点技术分析 | UncleChen的博客
- Android混合开发之——WebView中使用原生组件替换标签元素 | UncleChen的博客
- 使用React.js开发Chrome插件 | UncleChen的博客 HOT 2
- 使用Play框架和React编写Web应用 | UncleChen的博客
- 如何实现网页和Chrome插件之间的通信 | UncleChen的博客 HOT 2
- JS埋点技术分析 | UncleChen的博客 HOT 1
- Spark学习之本地环境搭建和模板工程 | UncleChen的博客
- SpringBoot自定义请求参数校验 | UncleChen的博客 HOT 2
- Spring中三大JSON框架的使用 | UncleChen的博客
- Jackson自定义反序列化Deserializer | UncleChen的博客 HOT 2
- Java核心技术学习总结-基础 | UncleChen的博客
- Android地理位置服务解析 | UncleChen的博客
- 理解Spring中的事务 | UncleChen的博客
- Android反编译技术总结 | UncleChen的博客
- Android6.0权限适配之WRITE_EXTERNAL_STORAGE(SD卡写入) | UncleChen的博客
- App动态配置探讨 | UncleChen的博客
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from blog_comment_repo.