2014-09-16 4 views
2

Я пытаюсь прокрутить таблицу, используя Protractor, чтобы увидеть, содержит ли строка элемент select. Затем выберите 1 из двух конкретных опций. Пока тест «проходит», но на самом деле ничего не выбрано. Мои последние попытки ниже.Транспортир - зацикливание через таблицу, чтобы выбрать опцию из списка

it('should loop through table and select an option if listbox is available', 
function() { 
    var table= element(by.xpath("//table[@id='tableID']")); 
    var count = table.length; 
    var currentType = ""; 

    for (var i = 1; i <= count; i++) { 
     tableSelect(i); 
    } 

    function tableSelect(i) { 
     it('should loop through this table and associate', function() { 
      expect(table.isDisplayed()).toBe(true); 

      if (element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]")).isDisplayed()) { 

       if (element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]//select[matches(@ng-change,'listChange()')]")).isDisplayed()) { 

        var varOne = element(by.xpath("//table[@id='tableID']/" + 
         "tbody/tr[" + i + "]/td[4]/div/span/span")).getText(); 

        if (currentType != "Moretext" || varOne.Length < 6) { 
         element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + 
             "]/td[6]/div/span/div/select")). 
          element(by.cssContainingText('option', 
            'This is option A')).click(); 
        } 
        else { 
         element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]/td[6]/div/span/div/select")).element(by.cssContainingText('option', 'This is option B')).click(); 
        } 
       } 
       else if (element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]/td[1]/div/span/span")).isDisplayed()) { 
        currentType = element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]/td[1]/div/span/span")).getText(); 

       } 
      } 
     }); 
    } 

    var saveBtn = elem(by.id('saveButton')); 
    expect(associateBtn.isDisplayed()).toBe(true); 
    expect(associateBtn.isEnabled()).toBe(true); 
    saveBtn.click(); 
}); 

Это попытка # 2:

element.all(by.repeater('row in datarows')).then(function(rows) { 
    for (var i = 1; i <= rows.length; ++i) { 
     if (element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]//select[matches(@ng-change,'listChange()')]")).isDisplayed()) { 

      var varOne = element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]/td[4]/div/span/span")).getText(); 

      if (currentType != "MoreText" && varOne.Length < 6) { 
       element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]/td[6]/div/span/div/select")).element(by.cssContainingText('option', 'This is option A')).click(); 
      } 
      else { 
       element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]/td[6]/div/span/div/select")).element(by.cssContainingText('option', 'This is option B')).click(); 
      } 
     } 
     else if (element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]/td[1]/div/span/span")).isDisplayed()) { 
      currentType = element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]/td[1]/div/span/span")).getText(); 
     } 
    } 
}); 

Это последняя попытка:

var varOne = ""; 
var varTwo = ""; 

element.all(by.xpath("//table[@id='tableID']/tbody/tr")).then(function (rows) { 
    for (var i = 1; i < (rows.length); i++) { 

     console.log('rowcount = ' + i); 

     element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]")).isDisplayed().then(function (visible) { 
      if (visible) { 
       element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]//select[@ng-change='listChange()']")).isDisplayed().then(function (visible) { 
        if (visible) { 
         element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]/td[4]/div/span/span")).getText().then(function (monthText) { 
          varTwo = monthText; 

          console.log(varTwo); 
         }); 

         if (varOne != "Revolving" || varTwo.length < 6) { 
          element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]/td[6]/div/span/div/select")).element(by.cssContainingText('option', 'Exclude: Duplicate Account')).click(); 
         } 
         else { 
          element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]/td[6]/div/span/div/select")).element(by.cssContainingText('option', 'Include in Ratios')).click(); 
         } 
        } 
        else { 
         element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]/td[1]/div/span/span")).isDisplayed().then(function (visible) { 
          if (visible) { 
           element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]/td[1]/div/span/span")).getText().then(function (currText) { 
            varOne = currText; 
            console.log(varOne); 
           }); 
          } 
         }); 
        } 
       }); 
      } 
     }); 
    } 
}); 

ответ

2

код как

if (element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]")).isDisplayed()) { 

Не будет работать, потому что это всегда оценивается как истинный, поскольку обещание Object является правдивым на Javascript booleans.

Вы должны следовать за обещание:

var elm = element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]")); 
elm.isDisplayed().then(function(visible) { 
    if (visible) { 
    // logic here 
    } 
}); 

Предполагая, что элемент присутствует, если нет то isDisplayed потерпит неудачу на уровне WebDriver, так что вы можете проверить isPresent вместо isDisplayed

+0

Я пробовал это, и похоже, что я ближе. Но я получаю эту ошибку: «Ошибка: ни один элемент не найден с использованием локатора: By.xpath (« // table [@ id = «tableID»]/tbody/tr [10]/tr [6]/div/span/div/select [@ ng-change = 'listChange()'] ". Это имеет смысл, потому что в этой строке нет элемента выбора. И в этом случае он должен перейти к другой части условия. По крайней мере, я так и думал. – Nacho

+0

Это тот случай, когда вы должны использовать isPresent вместо isDisplayed. –

+0

. Я действительно изменил ispresent, и он проходит, но ничего не выбирает. – Nacho

0

вот что Я привык, наконец, заставить его работать. Я нахожу вызов функции внутри цикла for, а внутри функции - код, который делает тяжелый подъем.

it('should loop through table and select an option from each listbox available', function() { 
    var varOne = ""; 
    var varTwo = ""; 

    element.all(by.xpath("//table[@id='tableID']/tbody/tr")).then(function (rows) { 
     for (var i = 1; i < (rows.length); i++) { 
      console.log('count = ' + i); 
      selectWithinTable(i); 
     } 

     function selectWithinTable(i) { 
      element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]")).isDisplayed().then(function(visible) { 
       if (visible) { 
        element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]//select[@ng-change='listChange()']")).isDisplayed().then(function(visible) { 
         if (visible) { 
          element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]/td[4]/div/span/span")).getText().then(function(someText) { 
           varTwo = someText; 
           console.log(varTwo); 
           console.log(varTwo.length); 
          }); 

          if (varOne != "Revolving" || varTwo === "") { 
           element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]/td[6]/div/span/div/select")).element(by.cssContainingText('option', 'This is option A')).click(); 
          } 
          else { 
           element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]/td[6]/div/span/div/select")).element(by.cssContainingText('option', 'This is option B')).click(); 
          } 
         } 
         else { 
          element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]/td[1]/div/span/span")).isDisplayed().then(function(visible) { 
           if (visible) { 
            element(by.xpath("//table[@id='tableID']/tbody/tr[" + i + "]/td[1]/div/span/span")).getText().then(function (moreText) { 
             varOne = moreText; 
             console.log(varOne); 
            }); 
           } 
          }); 
         } 
        }); 
       } 
      }); 
     } 
    }); 

    element(by.id('buttonID')).isDisplayed().then(function(visible) { 
     if(visible) { 
      element(by.id('buttonID')).isEnabled().then(function(enabled) { 
       if (enabled) { 
        element(by.id('buttonID')).click(); 
       } 
      }); 
     } 
    }); 
}); 
+0

Эта строка неверна: 'if (element (by.id ('buttonID')). isDisplayed() && element (by.id ('buttonID')). isEnabled()) {' вы снова не выполняете обещания с '.then' –

+0

@ Leo Gallucci Да, я заметил, что сразу после того, как я разместил его, я с тех пор редактировал выше. Я работаю в папке проекта. – Nacho

Смежные вопросы