Angular 为什么WebElement上的“click()”失败?
我正在使用量角器进行角度测量。我的页面模型中的内容如下:Angular 为什么WebElement上的“click()”失败?,angular,selenium,protractor,Angular,Selenium,Protractor,我正在使用量角器进行角度测量。我的页面模型中的内容如下: export interface TileElement { idx: number; icon: string; title: string; element: WebElementPromise; } getModels() { //used as wfc.getModels() below. return $$('mat-card').map((e, idx) => { // e.cli
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[]>;
}
但是,执行失败,出现异常
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)
失败:this.getId(…)。then不是函数
TypeError:this.getId(…)。then不是函数
在WebElement。[序列化](C:\workspace\GDSR\GDSR frontends\node\u modules\selenium webdriver\lib\webdriver.js:1992:25)
在convertValue(C:\workspace\GDSR\GDSR frontends\node\u modules\selenium webdriver\lib\webdriver.js:152:48)
在C:\workspace\GDSR\GDSR frontends\node\u modules\selenium webdriver\lib\webdriver.js:187:17
在forEachKey(C:\workspaces\GDSR\GDSR frontends\node\u modules\selenium webdriver\lib\webdriver.js:177:9)
位于C:\workspace\GDSR\GDSR frontends\node\u modules\selenium webdriver\lib\webdriver.js:183:5
在新的承诺()
在convertKeys(C:\workspace\GDSR\GDSR frontends\node\u modules\selenium webdriver\lib\webdriver.js:182:10)
在convertValue(C:\workspaces\GDSR\GDSR frontends\node\u modules\selenium webdriver\lib\webdriver.js:156:10)
在toWireValue(C:\workspaces\GDSR\GDSR frontends\node\u modules\selenium webdriver\lib\webdriver.js:128:26)
在Driver.schedule(C:\workspaces\GDSR\GDSR frontends\node\u modules\selenium webdriver\lib\webdriver.js:802:23)
如上所示,如果我执行等待$('mat-card')。单击()代码>它按预期工作。如果我在映射回调中执行单击
,它也会工作
问题是为什么它不能与以前选择的WebElement一起工作?我不想在每次操作之前都要选择元素
作为一种解决方法,我将e.locator()
作为interfacet的一部分进行附加,因此在执行过程中,我将执行wait元素(item.locator)。单击()
使单击发生,但这似乎是错误的。在黑暗中拍摄,如果只返回elementFinder怎么办
element: e
而不是
element: e.getWebElement()
不要将e.getWebElement()
传递到element
,只需直接传递e
getWebElement()
返回WebDriverJ的WebElement
,而不是由量角器引入的ElementFinder
,wfc.getModels()是什么?和模型[0]。元素在第一个代码段中。好的。。。我现在得到那个角色了。。我需要澄清的最后两个困惑是:1)wait$('mat-card')。单击();它按预期工作。如果我执行“单击内部映射”回调,它也会工作。
听起来两次单击都有效,但问题是为什么单击()在WebElement上失败?
和2)记住标题,问题实际上是单击,我可以看到错误显示this.getId(…).then不是一个函数
我在这里缺少了什么?您什么都没有缺少,当我尝试等待模型[0]时,会弹出一个确切的错误。元素。单击()
。前一行是测试id是否存在,但它是调试的一部分,不是主逻辑,可以使用。长话短说-我不能单击WebElement上的,返回map
函数,超出该函数的执行范围。在映射解析之后,它就像WebElement从驱动程序上下文中失效/分离一样。这可能是出于设计,但我不知道——即使如此,在这种情况下,它也会抛出有意义的错误。事实上,我在过去曾经尝试过,thios会在PromiseRejectCallback中导致stackoverflow(lol)异常:C:\workspaces\GDSR\GDSR frontends\node\u modules\selenium webdriver\lib\promise.js:2123返回新的ctor(解析器); ^ RangeError:PromiseRejectCallback:C:\workspace\GDSR\GDSR frontends\node\u modules\selenium webdriver\lib\promise.js:1999 fullyResolved(partialValue)中的最大调用堆栈大小超出了异常值。然后(
Sergey建议了这一点,无论出于何种原因,它都会引发堆栈溢出。
element: e.getWebElement()