自动化工具 用了那么多 UI 自动化框架,为什么没有人尝试直接用 js 来做呢?

Karaser · April 25, 2019 · Last by simonpatrick replied at April 29, 2019 · 2899 hits

直接把脚本注入在平台上面,异步跑就好了呀,最近在做Vue的项目,感觉这个想法很容易可以实现呀。

共收到 24 条回复 时间 点赞

楼主你觉得selenium是怎么操作页面的呢?

simple 回复

贴主说 直接使用

Karaser #3 · April 25, 2019 作者
simple 回复

我觉得是不一样的
1、selenium使用一个其他语言再调用浏览器驱动,在注入js代码的方式,效率应该是被诟病最多的问题,也是因为中间有一个驱动,所以几个操作需要多次的访问,特别是查找元素和等待,呆呆坐在电脑面前的各位应该体验过吧。
2、是数据问题,也是定位元素这个UI最根本的问题,在用selenium的时候使用是通过元素路径或者元素层级关系定位的,但是如果结合现在前端框架使用数据驱动,双向绑定的特性,我觉得定位到一个元素的位置比路径的方式好太多了。
3、兼容问题,依赖于selenium版本和浏览器driver的版本,让测试组疏通版本问题就一直很费劲,我觉得直接用原生js,直接写在项目里面,在项目里面开一个路由的方式,会好很多吧。

Karaser 回复

个人认为这种跟项目代码强耦合的做法是不值得提倡的。

不是有类似的工具吗, cypress

最老的selenium就是用的js 后来吸收了webdriver才改成现在的模式

jest也能做UI验证,但是成本高,并且耦合,最终放弃。

Karaser #8 · April 25, 2019 作者
simple 回复

提倡的发展方向不是将测试融入开发吗?弱化测试团队的概念。我觉得UI自动化就能当做前端的单元测试来看来,也挺好的。

Karaser #9 · April 25, 2019 作者
81—1 回复

我觉得是大家被耦合都搞怕了,什么框架都是为了解耦感觉有点盲目呢,解耦的缺点很明显的摆在了面前,咱们不能为了解耦而解耦吧~

Karaser 回复

现实是有点规模的公司,测试都是独立团队。很难反向推动开发为了测试而去动代码结构,也不会让测试有权限动代码,毕竟能力参差不齐,能做的是从测试自己的角色出发,去做更多的扩展测试。

你可以百度下为什么selenium弃用js而是用webdriver

用vue测试vue页面势必会有侵入,如果侵入肯定是不行的,除非你是工具性、框架性的小产品的测试
楼主可以看下puppeteer,也是纯js的

建议楼主做个 demo 出来分享下,这样讨论起来也更具体?

Karaser #14 · April 26, 2019 作者
陈恒捷 回复

好,有空弄出来和大家分享。

Karaser #15 · April 26, 2019 作者
槽神 回复

没有啥是肯定不行的,试试才知道😁

期待demo出来,浏览器测试是可以按这个思路的

Karaser 回复

实现上是没啥不可行的,但是你要考虑,会不会因为你的测试代码侵入导致被测应用的正确性问题

TestCafe

cypress

那跟mock没区别啊

因为JS的安全机制,不允许跨域访问资源,selenium可以绕过这个安全机制。https://www.douban.com/note/201511627/

Karaser #23 · April 29, 2019 作者
hchengmx 回复

跨域机制是浏览器的不是JS的噢。另外你可能理解错了,在本应用里面测试是不需要跨域的,最多只是在本应用的同源不同路由而已。如果确实有跨域的验证需求,现在HTTP,JS,Nginx都有解决方案的~

个人觉得这个做法是可行的.
https://www.cypress.io/ 这个UI测试的,其实用在本机测试使用Mock会有比较好的效果.

我自己个人的感受,看了angular或者vue这种 model和view自动绑定的前端,其实在运行层上面完全可以进行model和view绑定。
上面有点玄乎,举个例子来说:

  1. 页面的某个输入框 model 的名字是 name, 那么你的测试数据里面如果有一个属性也是name, 那么默认应该就是这个属性name的值就应该输入到这个model名字是name的框中
  2. 大部分控件的默认操作就一种,输入框就是input
  3. 结合以上两点,在运行UI测试的时候也可以做到model和view 绑定,已java为例子,给一个对象实例,他有变量名,有变量的值, 通过这个变量名可以找到这个变量名在page中定义的定位元素,就可以直接操作了, 最后的测试用例其实就是变成类似:
login(String processNameList<Pages> pages, TestData data)

这个样子了. data中包含所有需要测试的数据,变量名自动到Page里面去寻找这个流程需要的页面元素,selenium里面的常用操作都可以在写测试用例的时候都需要知道,只要知道数据是什么就可以了。

可以参考老帖子: https://testerhome.com/topics/2788
这个就是当时看了angular想到的, 甚至通过解析页面元素 model这样的东西,可以把生成一部分PageObject 类。然后在反射关联页面的model和测试的数据,页面,定位,数据都可以分开,model对业务系统来说是稳定的,页面元素变来变去,只要改pageobject就可以,页面操作什么都可以不用改,因为大部分都使用默认操作,默认操作封装在框架就好。

最后只能说没有什么用,因为其实大部分的测试越封装,效果就越不好,太多的概念分层都不如直接写selenium原生的api好用,什么稳定不稳定,自己没试过怎么有感受内,类似于在json对象里面找一个元素,如果在学习了一段时间后,还是要花很长时间才会用,什么框架都不管用。

具体的是可以参考: https://github.com/ideasfortester/mixed-first

还有一点其实个人觉得如果有类似于的埋点系统的话,完全可以把页面操作的所有动作都记录下来,直接通过埋点系统来完成录制回放。不过不好的地方就是这些都变成开发的事情了, 要测试做什么。 所以我也被fire了。 嗨找工作真难!

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up