Html 量角器AngularJS CSS选择器查找多个元素

Html 量角器AngularJS CSS选择器查找多个元素,html,css,angularjs,protractor,Html,Css,Angularjs,Protractor,我是CSS新手,正在尝试避免在量角器AngularJS测试自动化中使用xpath。我正在尝试获取列表中的一个特定元素,我正在获取该元素,但量角器告诉我,为定位器找到了不止一个元素。在未来,我希望避免这种情况,因为我并不总是想在名单上排在第一位。我对CSS和我要去的地方的确切方式有点困惑,我找到的文档也很模糊。我试图抓住营销场所的元素,但在某个时候也需要抓住下面的其他元素。最上面的代码是AngularJS和我目前如何抓取文本。提前谢谢 var-iPlanLevel=element(by.css(

我是CSS新手,正在尝试避免在量角器AngularJS测试自动化中使用xpath。我正在尝试获取列表中的一个特定元素,我正在获取该元素,但量角器告诉我,为定位器找到了不止一个元素。在未来,我希望避免这种情况,因为我并不总是想在名单上排在第一位。我对CSS和我要去的地方的确切方式有点困惑,我找到的文档也很模糊。我试图抓住营销场所的元素,但在某个时候也需要抓住下面的其他元素。最上面的代码是AngularJS和我目前如何抓取文本。提前谢谢

var-iPlanLevel=element(by.css(“类型(2)的第n个div>类型(2)的第n个div>类型(1)的第n个div>span”).getText()。然后(函数(文本){
console.log(文本);
}
);



林德曼大街88号

多特蒙德44137



营销场所 .property-group.meduim 2016年12月31日


您是否能够编辑正在测试的HTML?如果是这样的话,在营销场所范围内添加标签将非常有用。假设您添加name=“MarketingVincement”,则可以执行以下操作:

// Element by css selector shorthand($ = by.css())
var marketingVenue = $('[name="marketingVenue"]');

// Child selector using css selector shorthand
var marketingChild = marketingVenue.$('[name="childBeneathMarketingVenue]');

// Child selector using a variable and element(el.locator())
var marketingChildSelector = $('[name="childBeneathMarketingVenue"]');
var marketingChild = marketingVenue.element(marketingChildSelector.locator());
如果您不能编辑HTML,您仍然可以使用上面的代码,但是使用更长、更脆弱的css选择器

要清除多个元素的警告,您必须获取所有元素都是select.first或.get(x)数组中的特定元素

// Get all elements with a tag using shorthand $$ element.all(by.css(x))
var marketingVenues = $$('[name="marketingVenues"]');
var firstMarketingVenue = marketingVenues.first();
var specificMarketingVenue = marketingVenues.get(12); // Get the 13th element from the array
您还可以使用此函数仅获取可见元素,假设您的html有一些隐藏元素和一些可见元素

// Pass a string css selector to get the first visible element of that selector
function getVisibleElements(selector){
    var allElementsOfSelector = element.all(by.css(selector));
    var displayedElement = allElementsOfSelector .filter(function(elem) {
        return elem.isDisplayed('cannot find' + ' ' + selector);
    }) // Add '.first();' here if you want just the first visible
    return displayedElement ;
}

var visibleMarketingVenues = getVisibleElements('[name="marketingVenues"]');
var marketingVenue = visibleMarketingVenues.first();
var fifthMarketingVenue = visibleMarketingVenues.get(4);
对于您的特定选择器,如果您没有编辑html的权限,您可能正在考虑在页面本身发生任何更改时更改选择器,因为div选择器非常脆弱。您当前的选择器可能类似于:

var marketingVenue = $$('.property-group').get(0).$('span');

请告诉我:您的输入和期望的结果是什么?换句话说,您事先知道并可以依靠什么,
marketingvention
text?谢谢。@Alecxe我正在获得此订阅(MarketingVincement),然后检查订阅级别是否有其所有可用的应用程序。例如:用户具有MarketingVince订阅访问权限,因此可以使用以下应用程序:预订、媒体、搜索。订阅级别会发生变化,其他元素(如Dortmund)也不会发生变化,Dortmund是每个用户订阅级别的酒店名称。有七种不同的订阅级别。我只需要抓住文本营销场所所在的元素。您所看到的是订阅级别,当具有不同订阅级别的不同用户登录时,订阅级别会发生更改。在获得订阅级别(MarketingVincement)后,我会使用expects检查订阅中包含的内容。通常不鼓励编辑HTML以支持测试。为了胜利而分离关注点,对吗?不管怎样,我只是希望我的测试不会在每次添加新的跨度时失败!