如何从 webelement 获取定位器值?

use*_*347 6 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);
Run Code Online (Sandbox Code Playgroud)

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

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

mar*_*770 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];
*       });
*     }
Run Code Online (Sandbox Code Playgroud)

所以你应该能够:

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);
Run Code Online (Sandbox Code Playgroud)