2014-09-13 10 views
5

'daki sütunda bulunup bulunmadığını nasıl kontrol ederim Bir tablonun bir sütununda bir adın görüntülendiğini iddia ediyorum. Bir adın var olup olmadığını görmek için bir sütunun metni boyunca yinelenen bir inResults işlevi yazdım. İşte çalıştığım şey:Metnin İletki

Sayfa nesnesi:

this.names = element.all(by.repeater('row in rows').column('{{row}}')); 

this.inResults = function(nameString) { 
    var foundit = ''; 
    this.names.each(function(name) { 
     name.getText().then(function(it) { 
      console.log(it); // each name IS printed... 
      if(it == nameString) { 
       console.log('it\'s TRUE!!!!'); // this gets printed... 

       foundit = true; 
      } 
     }); 
    }); 
    return foundit; // returns '' but should be true? 
}; 

Spec bekliyoruz: foundit 'ın değeri olduğu gibi beklendiği gibi

expect(friendPage.inResults('Jo')).toBeTruthy(); 

Hem konsol ifadeleri yazdırmak ... ama benim bekliyoruz başarısız hala ''. Bunu birkaç yolla denedim ve hiçbiri çalışmıyor. Neyi kaçırıyorum? this.This yapmak

+0

Ana sorun burada javascript'in eşzamansız davranışı, işlev, for döngüsünü yürütmeden önce değeri döndürür. –

cevap

3

Ben filtreyi kullanmak öneriyoruz: http://angular.github.io/protractor/#/api?view=ElementArrayFinder.prototype.filter

this.inResults = function(nameString) {  
    return this.names.filter(function(name) { 
    return name.getText().then(function(text) {   
     return text === nameString; 
    }); 
    }).then(function(filteredElements) { 
    // Only the elements that passed the filter will be here. This is an array. 
    return filteredElements.length > 0; 
    }); 
}); 

// This will be a promise that resolves to a boolean. 
expect(friendPage.inResults('Jo')).toBe(true); 
+0

Güzel çözüm! Teşekkürler bayım. – Brine

2

Kullanım haritası dönecektir bir bir dizideki değerleri çözümleyeceğini ertelenmiş, bu nedenle varsa bu:

this.inResults = function(nameString) { 
    var foundit = ''; 
    mappedVals.then(function (textArr) { 
    // textArr will be an actual JS array of the text from each node in your repeater 
    for(var i=0; i<textArr.length; i++){ 
     if(it == textArr[i]) { 
      console.log('it\'s TRUE!!!!'); // this gets printed... 
      foundit = true; 
     } 
    } 
    return foundit; 
    }); 
} 
:

this.mappedVals =element.all(by.repeater('row in rows').column('{{row}}')).map(function (elm) { 
    return elm.getText(); 
}); 

Böyle çözecektir

Ve benzeri dosya Spec o kullanın

friendPage.inResults('Jo').then(function(findIt){ 
    expect(findIt).toBeTruthy(); 
}); 
+0

'map()' gerekli değil, 'getText()' 'element.all()' sonucunun sonucuna çağrılabilir - bir dizi metinleri çözme sözü verir. – alecxe

6

Bunu çözmenin daha iyi/daha temiz bir yol olduğunu düşündüğümü tasarlıyorum. Daha az karmaşıktır ve yöntemde locator/css kodu gerektirmez. Ben benim protractor_example project on GitHub bu ekledik

expect(friendPage.inResults('Jo')).toBeTruthy(); 

friend.page.js

// locator 
this.friendName = function(text) { return element.all(by.cssContainingText('td.ng-binding', text)) }; 

// method 
this.inResults = function(name) { 
    return this.friendName(name).then(function(found) { 
     return found.length > 0; 
    }); 
}; 

friend.spec.js ...