Можно ли использовать цикл for для теста DRY транспортира? *var подходит к undefined*

Цель: я хочу сделать цикл по блоку it, который проверяет соответствие текста элемента.

Ошибка: Error: No element found using locator: by.cssContainingText(".submenu li a", "undefined")

Вопрос. Как написать цикл for для проверки нескольких элементов списка? Кроме того, как мне сделать var title видимым для внутреннего it block

Для этого примера: у меня есть 2 теста, которые я хочу СУШИТЬ с помощью цикла следующий пример теста - это просто псевдокод, который не работает, рабочий тест ниже.

var config = require('../../protractor.conf.js').config;

describe('this Homepage Body Tests', function(){

  browser.driver.get(config.homepageUrl);

  describe('sub navigation functionality', function () {
    //creates teh array of strings for this sample
    var title = ['find a store', 'clinic'];


    for(var i = 0; i < title.length; i++){

      it("should open find a" + title[i] + "page", function(){

        browser.driver.sleep(2000);
        browser.ignoreSynchronization = true;
        var link = element(by.cssContainingText('.submenu li a', title[i]));
        expect(link.getText()).toEqual(title[i]);


      });
    };
 });

});

HTML:

  <div class="submenu">
    <ul>
        <li><a >find a store</a>
        </li>
        <li><a>clinic</a>
        </li>

    </ul>
  </div>

Пример рабочих тестов:

it("should open find a store page", function(){

  browser.driver.sleep(2000);
  browser.ignoreSynchronization = true;

  var title = 'find a store';
  var link = element(by.cssContainingText('.submenu li a', title));


  expect(link.getText()).toEqual(title);


});

it("should open find a clinic page", function(){

  browser.driver.sleep(2000);
  browser.ignoreSynchronization = true;

  var title = 'clinic';

  var link = element(by.cssContainingText('.submenu li a', title));


  expect(link.getText()).toEqual(title);


});

Обновление:

it("should open find a store page", function(){

      browser.driver.sleep(2000);
      browser.ignoreSynchronization = true;

      var string = 'find a store';
      var main = '.main';
      var link = element(by.cssContainingText('.submenu li a', string));


      expect(link.getText()).toEqual(string);
      //I WANT OT CLICK ON THAT TOO!
      link.click().then(function() {

        browser.driver.sleep(3000);
        var title = element(by.cssContainingText(main, string));
        expect(title.getText()).toBe(string);
      });

    });

person Armeen Harwood    schedule 02.12.2014    source источник


Ответы (1)


Здесь element.all() + map() поможет:

var titles = element.all(by.css('.submenu li a')).map(function (elm) {
    return elm.getText();
});

expect(titles).toBeArrayOfStrings();
expect(titles).toEqual(['find a store', 'clinic']);

К вашему сведению, вот соответствующий запрос функции:

Также см:

person alecxe    schedule 02.12.2014
comment
Отмечено правильно независимо. Я могу задать новый вопрос, если потребуется - person Armeen Harwood; 02.12.2014
comment
@MatthewHarwood Некоторое время я буду AFK, пожалуйста, спросите отдельно, спасибо. В любом случае, я проверю новый вопрос позже. - person alecxe; 02.12.2014
comment
stackoverflow .com/questions/27258609/ @alecxe - person Armeen Harwood; 02.12.2014