我有一个页面,其中包含向下滚动时可见的元素。我试图执行一个测试,以确保元素不存在,直到滚动到元素的底部,但我似乎无法弄清楚如何从一个调用传递大小({{1} })到下一个调用(elementIdSize()
)的滚动偏移量。不可否认,我的大脑还没有得到"承诺"过去简单的电话链。
我试过这样的事情:
scroll()
我希望使用传入的选择器来获取元素,在this.browser
.setViewportSize({width: 1000, height: 600})
.element(selector)
.then(function(e) {
console.log('then element: ', e);
element = e;
})
.elementIdSize(element.id)
.then(function(size) {
console.log('Size: ', size);
})
.call(callback);
中设置元素,然后在元素的ID上调用then()
,但是{{ 1}}永远不会从elementIdSize()
来电设置,而我回来的对象似乎也不是我想要获得的。我觉得这是我在这里缺少的一些简单的知识,这将使所有这些和#34;点击"。
我使用API here来查找Webdriver调用,但文档没有提供太多详细信息。
答案 0 :(得分:1)
重要的是要了解一旦执行链,所有参数都将得到解决。这意味着一旦你基本执行了第一个命令就不能再改变它们了。在您的示例中,您在promise回调中设置元素变量的值。当你这样做时,elementIdSize已经读取了元素变量(并且可能引发了错误)。
正确的方法是执行具有参数的命令,这些参数将在以后解析或完成例程。您还可以使用操作命令而不是原始协议命令在WebdriverIO中保存命令。因此,首先使用getSize而不是call元素,然后调用elementIdSize。这是getSize的工作; - )
我不确定你到底想要做什么,但这里应该是代码:
this.browser
.setViewportSize({width: 1000, height: 600})
.getElementSize(selector).then(function(size) {
console.log('size of element "' + selector + " is', size);
// now as we have the size execute the scroll in a then callback
return this.scroll(0, 600 + size.height);
})
// this get executed once we we did the scrolling since
// the getSize promise is only then fulfilled once the promise
// within the then function is resolved
.isVisible(otherElem).should.be.eventually.be(true, 'element was visible after scrolling')
.call(callback);
(作为旁注:我们已经在使用WebdriverIO v4,它将允许同步执行命令,因此不再有承诺令人头痛; - )