Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从webelement获取定位器值?_Javascript_Selenium_Protractor - Fatal编程技术网

Javascript 如何从webelement获取定位器值?

Javascript 如何从webelement获取定位器值?,javascript,selenium,protractor,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(

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

如果我有目标:
var el=browser.driver.findElement(by.id('testEl')

我想得到文本“testEl”并在其他地方使用它。我不关心选择器类型是什么(按id、按css等),只关心文本是什么

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

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

有没有办法拉出此定位器/选择器值

编辑:

目标:从selenium Web元素中获取定位器文本

用法:用于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来存储字符串,并在任何时候声明元素或尝试使用类似上面的东西时传递该字符串,但这只意味着使用设置页面对象的新标准。像上面的量角器一样,在selenium中访问定位器将非常方便。

您不需要从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);

注意,对于非角度站点,您仍然可以使用
量角器
——它只是selenium javascript绑定的包装器!我实际上是在量角器中运行这一切。对于站点的非角度部分,我必须使用selenium选择器,因为在量角器选择器上执行操作需要角度选择器。据我所知,selenium web元素没有locator().value选项。据我回忆,您不必使用
driver.findElement()
,并且可以继续使用量角器的
元素()
在非角度站点上。唯一重要的区别是同步被关闭。每当我尝试在此页面上使用量角器元素时,我都会在窗口中找不到有关角度的错误。
Selenium元素没有此问题,所以我一直在使用它们。有什么原因不能将定位器存储在变量中并以这种方式重用吗?