量角器:访问返回Object的属性

时间:2018-02-13 09:41:06

标签: javascript angular protractor javascript-objects


我有以下问题: 我的HTML代码锁定如

<div *ngFor="let device of viewModel.devices; let i=index">
    <input type="radio" name="devices" [value]="device" [(ngModel)]="viewModel.selectedDevice">
        My content...
</div>

重要的部分是&#34; ngModel&#34;返回一个对象(在typescript中):

class Device {
    constructor(public name: string, public kind: DeviceKind) {

}}

我现在想要获得属性&#34; name&#34;和&#34; DeviceKind&#34; (这是一个枚举)存储在ngModel中 我设法得到了&#34; ngModel&#34;以下列方式的所有设备的内容(有点难看):

element.all(by.xpath("//*[@id='deviceList']/div/input")).then(function (items) {
  items.forEach(function (item) {
      item.getAttribute("ng-reflect-model");   // TODO: How to access the returned object properties
});

(id位于更高的div元素中)。此代码返回所有对象&#34; [object Object]&#34;。 (如果我编写console.log(item.getA ...),或检查浏览器DOM)

我的问题是:如何访问返回的对象属性?有可能吗?
我试过像:

item.getAttribute("ng-reflect-model").name
item.getAttribute("ng-reflect-model").then(function(name){...}



更新
我试着让它更简单:
我的法师现在包含以下代码行:

<div id="tempTest">{{selectedDeviceName}}</div>

我的测试包含以下代码:

expect(element(by.id('tempTest')).getText()).toEqual('XXXXXX');  // To test if element really exists
var value = element(by.id('tempTest')).evaluate('selectedDeviceName');

结果是:unknown error: Cannot read property '$eval' of undefined

我尝试了一个更简单的评估(应该工作,不确定):

element(by.id('tempTest')).evaluate('4+3');

之后我打印出请求以及回复:
请求:

POST /session/b0eb1b5a-3d96-4350-9029-01377249b251/execute HTTP/1.1
accept: application/json; charset=utf-8
{"script":"try { return (function (element, expression) {\n  return angular.element(element).scope().$eval(expression);\n}).apply(this, arguments); }\ncatch(e) { throw (e instanceof Error) ? e : new Error(e); }","args":[{"element-6066-11e4-a52e-4f735466cecf":"0.34935142695585064-12","ELEMENT":"0.34935142695585064-12"},"4+3"]}

响应:

{"sessionId":"b0eb1b5a-3d96-4350-9029-01377249b251","status":13,"value":{"message":"unknown error: Cannot read property '$eval' of undefined\n  (Session info: chrome=59.0.3071.125)\n  (Driver info: chromedriver=2.30.477700 (0057494ad8732195794a7b32078424f92a5fce41),platform=Windows NT 10.0.16299 x86_64)"}}

它似乎试图获取元素的范围,但失败了。

1 个答案:

答案 0 :(得分:1)

对于量角器/ selenium getAttribute() api,它只能返回字符串值或null,不能返回一个对象。所以你在代码中使用了错误的方法。

如果你想获得Angularjs的ng-model中的值,有两个选择:

选项1 使用量角器api element().evaluate(),仅适用于Protractor 5.0及更高版本
有关详细信息,请查看量角器官方API文档。

选项2 将javascript注入浏览器以获取值,适用于任何Protracor版本

var script = 'return angular.element(arguments[0]).scope().$eval(arguments[1]);';
browser.executeScript(script, element(by.xxx(...)).getWebElement(), 'viewModel.devices')