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);

我希望使用传入的选择器来获取元素,在 中设置元素then(),然后调用elementIdSize()元素的 ID,但是var element从来没有从element()调用中设置,并且我返回的对象似乎没有无论如何,我想得到什么。我觉得这是我在这里缺少的一些简单的知识,它将使所有这些“点击”。

我在这里使用 API 来查找 Webdriver 调用,但文档没有提供太多细节。

4

1 回答 1

1

重要的是要了解,一旦您执行链,所有参数都将得到解决。这意味着一旦您基本上执行了第一个命令,您就不能再更改它们了。在您的示例中,您在 promise 回调中设置元素变量的值。在你这样做的时候,elementIdSize 已经读取了元素变量(并且可能抛出了一个错误)。

正确的方法是执行具有参数的命令,这些参数稍后会在 then 或 finish 例程中得到解决。您还可以使用操作命令而不是原始协议命令将命令保存在 WebdriverIO 中。所以只需使用getSize,而不是先调用element,再调用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,它允许同步执行命令,所以不再有承诺头痛 ;-))

于 2015-09-16T22:59:28.657 回答