2016-07-19 2 views
0

Использование Protractor, моя цель - нажать кнопку обновления, указав уникальное значение имени.Невозможно найти элементы внука того же дедушки и бабушки с помощью Protractor

<div class="Employee"> 
    <div class="address"> 
    <button class="street" value="update"/> 
    </div> 
    <div class="profile"> 
    <div class="name" value="Joe Smith"/> 
    </div> 
</div> 
<div class="Employee"> 
    <div class="address"> 
    <button class="street" value="update"/> 
    </div> 
    <div class="profile"> 
    <div class="name" value="Jane Smith"/> 
    </div> 
</div> 

Так уже пробовал искать элементы всех 'работника, чтобы найти все родитель, а затем фильтрации, чтобы найти элемент, который «Сотрудник» имеет особый ребенок с значением «Джейн Смит». Затем используйте этот родительский элемент, чтобы нажать кнопку «Обновить».

element.all(by.css('[class="Employee"]')).filter(function (elem,index) { 
    if(elem.element(by.css('[value="Jane Smith"]')).isPresent()){ 
    return elem 
    } 
}).then(function (elem) { 
    elem[0].element(by.css('[value="update"]')).click() 
}) 

Проблема заключается в том, что в «если» заявление, оно всегда приравнивания к истине, и я не знаю, почему.

Возможно, есть другой подход к решению этого без использования XPaths в этой среде постоянно меняются

ответ

0

относительно вашей, если заявление, он должен выглядеть следующим образом:

elem.element(by.css('[value="Jane Smith"]')).isPresent()) 
    .then(function (result) { 
     if (result) { } //true 
     else { } 
    } 
1

Я не использую filter очень часто с нашим приложением так любопытное выстрел в темноте, но я полагаю, вам нужно дополнительный return заявление. Смотрите, если это работает для вас:

element.all(by.css('[class="Employee"]')).filter(function (elem,index) { 
    return elem.element(by.css('[value="Jane Smith"]')).isPresent().then(function(val) { 
     return val == true; // or val === true if you prefer 
    }); 
}).then(function (items) { 
    console.log(items.length) // just to check the number is what you expect 
    items[0].element(by.css('[value="update"]')).click() 
}); 
1

Продлить @Gunderson's correct answer.

Проблема в том, что в выражении «if» она всегда приравнивается к истине, и я не знаю, почему.

Это потому, что isPresent() метод, как и почти все в транспортир возвращает обещание которое «truthy» по умолчанию. Вам нужно решить обещание фактически получить реальную ценность.

Кроме того, я хотел бы улучшить локатор и так, как вы позиционирующий внутренний элемент - вы можете использовать first() и просто цепьelement вызова, нет необходимости в then() в этом случае:

$$(".Employee").filter(function (elem) { 
    return elem.$('[value="Jane Smith"]').isPresent().then(function(isPresent) { 
     return isPresent; 
    }); 
}).first().$('[value="update"]').click(); 

Make обязательно изучите документацию, чтобы лучше понять концепцию обещаний и поток управления, который является механизмом под капотом, поддерживающим очередь обещаний и разрешающий их.


Обратите внимание, что вы могли бы подойти к нему с XPath expression и в одной строке - хотя это не вполне читаемым, глядя хрупкими и более трудно поддерживать:

var updateButton = element(by.xpath("//div[@class='Employee' and div[@class='profile']/div[@class='name']/@value = 'Jane Smith']/div[@class='address']/button[@value='update']")); 
updateButton.click(); 
Смежные вопросы