Angular 1.2.x更新为1.3.x,导致网页PhantomJsDriver(GhostDriver)渲染失败

Angular 1.2.x update to 1.3.x, cause failure in PhantomJsDriver (GhostDriver) rendering of a webpage

在我们将客户端 Angular 版本从 1.2.8 更新到 1.3.5(或尝试其他 1.3.x 版本之后),SUT 网页之一开始呈现失败(网页根本没有呈现),错误:

[ERROR - 2015-03-22T08:28:04.332Z] Session [5b8fa230-d06d-11e4-b704-1530b0109512] - page.onError - msg: Error: Requested keys of a value that is not an object. at keys ([native code]) at extend (http://localhost:9920/services/our-product/bower_components/angular/angular.js:411:29) at setSettings (http://localhost:9920/services/our-product/scripts/scripts.min.js:2:51263) at a (http://localhost:9920/services/our-product/scripts/scripts.min.js:2:25657)

用人类的语言来说:方法Object.keys()失败了,它是从angular.extend()方法调用的。

我们使用 PhantomJsDriver 1.2.0 version,我们从 PhantomJs 1.9.7 开始,并尝试通过更新到 2.0 版本来解决它,但没有成功。

找到原因。

Object.keys()return对象属性数组,必须接收对象作为参数,如:Object.keys(obj)。 Object.keys() 未在 Angular.extend 的早期版本中使用,并在 1.3.x 版本之一中引入。

是什么原因造成的? 一方面,我们的服务器端将空对象作为字符串发送,而不是正确的空对象定义:

"personData": "{}",

而不是:

"personData": {},

因此,Object.keys() 无法解析它,它没有收到正确的对象。因此渲染失败。因为 Object.keys() 仅在 Angular 1.3.x 中引入,之前它没有引起任何问题。

有趣的是 Chrome,例如,成功 "understanding" 它是一个空对象,但是 PhantomJsDriver 不是。而这又引出了另一个有趣的点——这个问题在Safari中也被重现,原因是相同的JS渲染引擎PhantomJs和Safari共享——WebKit