2016-04-26 85 views
10

最近,我发现被添加到文档量角器一个新的定位器 - 的by.js()什么是量角器/ WebDriverJS中的by.js定位器?

定位通过评估一个JavaScript的表达,这可以是一个函数或字符串的元素。

我明白这是什么定位器提供,但我错过了真实使用情况下当此定位可能是有用的。何时应该使用by.js而不是其他内置定位器,如by.css

回答

12

我觉得用例是获取使用核心JavaScript函数的元素,只要css和其他元素定位器不会帮助或没有我们可以使用的属性。场景 -

  1. 如果你使用它传递给browser.executeScript然后by.js核心JavaScript函数获取元素可以用来取代它。

例子: -

假设,如果你要得到的是在顶部出现两者之间的元素,你可以得到这样说 -

var ele = element(by.js(function(){ 
    var ele1 = document.getElementById('#ele1'); 
    var ele2 = document.getElementById('#ele2'); 
    var val = ele1.compareDocumentPosition(ele2); 
    if(val === 4) return ele1; 
    else return ele2; 
})); 
  • 如果你想使用它的CSS值,如颜色,字体等获得元素...虽然filter可以在这种情况下使用,但by.js也支持它。
  • 如果元件不通过CSS的xpath或任何其他定位器访问,例如伪元素具有动画或过渡。
  • 例子: -

    假设,如果有其中有:before:after过渡元素 -

    .element:before { 
        color: rgb(255, 0, 0); 
    } 
    

    要验证元素的颜色,我们可以使用by.js传递一个JavaScript语句获取元素 -

    var ele = element(by.js(function(){ 
        return window.getComputedStyle(document.querySelector('.element'), ':before'); 
    })); 
    expect(ele.getCssValue('color')).toEqual('rgb(255, 0, 0)'); 
    

    希望它有帮助。

    +0

    有趣的用例,现在我可以想象我可以在哪里使用'by.js'。谢谢! – alecxe

    +1

    好点!喜欢关于computedStyle的笔记! –

    5

    我认为这种情况非常渺茫,但是当客户端上的数据通过硒不可用(或不可靠)时,我可以看到这种情况正在使用。

    文档页面上的例子包括对offsetWidth参考:

    spans[i].offsetWidth > 100 
    

    用于背景:

    var wideElement = element(by.js(function() { 
        var spans = document.querySelectorAll('span'); 
        for (var i = 0; i < spans.length; ++i) { 
        if (spans[i].offsetWidth > 100) { 
        return spans[i]; 
        } 
        } 
    })); 
    expect(wideElement.getText()).toEqual('Three'); 
    

    另外,也有可能是用例,如果有一个第三方API上窗口或其他可以帮助定位元素的服务。

    相关问题