在规范内从.getAttribute返回值

时间:2018-12-11 14:45:19

标签: xpath protractor

我在pageObject类中有一个函数:

async getSingleIdFromDrawerUsing(test1, test2) {
    await browser.wait(async () => {
      return await element(by.xpath('//h3[.="' + test1 + '"]/..' +
        '//something//div[@attr1"' + test2 + '"]')).getAttribute('attr2')
        .then(async (value) => {
          const item = value;
          console.log(item);
          return await item;
      });
    });
  }

根据我从console.log可以看到的信息,此功能可以完美地工作,但是当我进入规范文件时,却无法定义。

这是我的规格以及我在做什么:

it('should click into widget from drawer and verify URL has correct Id', async () => {
    const actualReportId = await pagePbject.getSingleIdFromDrawerUsing('test1', 'test2');
    console.log(actualReportId);
    await pagePbject.clickIntoIdFromDrawer('test1', 'test2');
    expect(await browser.getCurrentUrl()).toBe(pagePbject.routeUrl + actualReportId);
});

这是我从规范运行中得到的输出:

spits out correct Id from console.log inside the pageObject class
undefined (this is from the spec)
    × should click into test1 test2 widget from the drawer
      - Expected 'http://localhost:49158/url/id' to be 'http://localhost:49158/url/undefined'.

我必须做错了事,但我无法弄清楚

1 个答案:

答案 0 :(得分:0)

我不确定您为什么在功能中甚至需要browser.wait()。您应该可以执行以下操作:

async getSingleIdFromDrawerUsing(test1, test2) {
    return element(by.xpath('//h3[.="' + test1 + '"]/..' +
        '//something//div[@attr1"' + test2 + '"]')).getAttribute('attr2');
}

如果这不起作用,您可以解决本机Promise:

getSingleIdFromDrawerUsing(test1, test2) {
    return new Promise(resolve => {
        element(by.xpath('//h3[.="' + test1 + '"]/..' +
            '//something//div[@attr1"' + test2 + '"]')).getAttribute('attr2')
            .then(value => {
                resolve(value);
            }
    }
}

在两个示例中,您都将以相同的方式调用它:

const actualReportId = await pageObject.getSingleIdFromDrawerUsing('test1', 'test2');