使用Webdriver.io移动到元素的底部

时间:2015-09-15 14:31:02

标签: meteor cucumber webdriver-io meteor-cucumber

我有一个页面,其中包含向下滚动时可见的元素。我试图执行一个测试,以确保元素不存在,直到滚动到元素的底部,但我似乎无法弄清楚如何从一个调用传递大小({{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调用,但文档没有提供太多详细信息。

1 个答案:

答案 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,它将允许同步执行命令,因此不再有承诺令人头痛; ​​ - )