如何从webelement获取定位器值?

时间:2015-09-11 17:32:38

标签: javascript selenium protractor

我想从javascript中获取selenium webelement使用的选择器的值。

如果我有这个对象: var el = browser.driver.findElement(by.id('testEl'));

我想获得该文本'testEl'并在其他地方使用它。我不关心选择器类型是什么(通过id,通过css等),只是文本是什么。

在量角器中,我可以这样做: console.log(el.locator().value); 这将返回文本'testEl'。

但是只有selenium非量角器选择器,我被告知.value()不是函数。

有没有办法拉出这个定位器/选择器值?

修改

目标:从selenium webElement

中抓取定位器文本

用途:用于getVisibleElement等函数

情况:对某个页面进行处理,某个选择器可能存在未知数量的元素,有些是隐藏的,有些则不是(但隐藏在它们上方的区域,在该元素的特定部分上没有隐藏的标记可供使用),我想得到可见的那些。

在量角器中:

function getVisibleElementByPageObject(protractorWebElement){
    var allElementsOfSelector = element.all(by.css(protractorWebElement.locator().value));
    var displayedElement = allElementsOfSelector .filter(function(elem) {
        return elem.isDisplayed('cannot find' + ' ' + protractorWebElement.locator().value);
    }).first();
    return displayedElement ;
}

var exampleEl = $('[name="test"]');
var visibleExampleEl = getVisibleElementByPageObject(exampleEl);

我想获取定位器,以便如果我更改了选择器的内容,我只需要在一个地方更改它 - 声明元素的页面对象。

我可以使用var来存储字符串,并在我声明元素或尝试使用上述内容的任何时候传递它,但这只是意味着使用设置页面对象的新标准。在硒中访问定位器非常方便,就像上面的量角器一样。

1 个答案:

答案 0 :(得分:0)

您不需要从webElement获取定位器,您应该在第一次使用它时找到该元素。如果您的页面对象尚未设置,那么您做错了。

在webdriver.js中,他们展示了这个例子:

*     var link = element.findElement(firstVisibleLink);
*
*     function firstVisibleLink(element) {
*       var links = element.findElements(By.tagName('a'));
*       return webdriver.promise.filter(links, function(link) {
*         return links.isDisplayed();
*       }).then(function(visibleLinks) {
*         return visibleLinks[0];
*       });
*     }

所以你应该能够:

var firstElement = function(locator) {
    return browser.driver.findElement(locator);
};
var firstVisible = function(locator) {
    var elements = browser.driver.findElements(locator);
    return browser.driver.promise.filter(elements, function(el) {
        return el.isDisplayed();
    }).then(function(visibleElements) {
        return visibleElements[0];
    });
};

var testLocator = by.css('[name="test"]');
var E1 = firstElement(testLocator);
var E1v = firstVisible(testLocator);