0

我正在使用带角度应用的量角器。我的页面模型中的内容如下:

export interface TileElement {
  idx: number;
  icon: string;
  title: string;
  element: WebElementPromise;
}
  getModels() { //used as wfc.getModels() below.
    return $$('mat-card').map((e, idx) => {
      // e.click();
      return {
        idx,
        icon: e.$('mat-card-content div:nth-child(1)').getText(),
        title: e.$('mat-card-content div:nth-child(2)').getText(),
        element: e.getWebElement()
      };
    }) as Promise<TileElement[]>;
  }

如您所见,我尝试将WebElementto 作为结果的一部分进行传播,以便调用者稍后可以实际使用它做一些有用的事情 - 在我的情况下单击。我这样用

await wfc.goToPage(); //works fine
const models = await wfc.getModels(); //works as expected - getModels from snippet above
console.log(await models[0].element.getId()); //prints some number eg 0.6760710380568453-1
console.log(await models[0].element.click()); //fails
//await $('mat-card').click(); this actually works

但是,执行失败并出现异常

Failed: this.getId(...).then is not a function
TypeError: this.getId(...).then is not a function
    at WebElement.[serialize] (C:\workspaces\GDSR\gdsr-frontends\node_modules\selenium-webdriver\lib\webdriver.js:1992:25)
    at convertValue (C:\workspaces\GDSR\gdsr-frontends\node_modules\selenium-webdriver\lib\webdriver.js:152:48)
    at C:\workspaces\GDSR\gdsr-frontends\node_modules\selenium-webdriver\lib\webdriver.js:187:17
    at forEachKey (C:\workspaces\GDSR\gdsr-frontends\node_modules\selenium-webdriver\lib\webdriver.js:177:9)
    at C:\workspaces\GDSR\gdsr-frontends\node_modules\selenium-webdriver\lib\webdriver.js:183:5
    at new Promise (<anonymous>)
    at convertKeys (C:\workspaces\GDSR\gdsr-frontends\node_modules\selenium-webdriver\lib\webdriver.js:182:10)
    at convertValue (C:\workspaces\GDSR\gdsr-frontends\node_modules\selenium-webdriver\lib\webdriver.js:156:10)
    at toWireValue (C:\workspaces\GDSR\gdsr-frontends\node_modules\selenium-webdriver\lib\webdriver.js:128:26)
    at Driver.schedule (C:\workspaces\GDSR\gdsr-frontends\node_modules\selenium-webdriver\lib\webdriver.js:802:23)

如上所示,如果我这样做await $('mat-card').click();,它会按预期工作。如果我执行click内部映射回调,它也会起作用。

问题是为什么它不能与以前选择的 WebElement 一起使用?我不想在每次操作之前都选择元素。

作为一种解决方法,我将附加e.locator()作为我的接口的一部分,所以在执行过程中我正在做await element(item.locator).click()点击发生,但这似乎是错误的。

4

2 回答 2

0

在黑暗中拍摄,如果您只返回 elementFinder 会怎样

element: e

代替

element: e.getWebElement()
于 2021-04-07T13:39:44.957 回答
0

而不是传递e.getWebElement()element,直接传递e

getWebElement()返回WebElementWebDriverJS 的一个,而不是ElementFinderProtractor 引入的

于 2021-04-13T15:48:55.223 回答