2014-02-21 3 views
0

Я пытаюсь написать тест транспортира, который выбирает элемент из настраиваемого раскрывающегося меню. Единственная проблема заключается в том, что при попытке щелкнуть элемент, отличный от последнего в списке, он зависает и выдает время. Когда я удаляю вызов метода click(), он работает нормально. Поскольку все эти вызовы выполняются асинхронно, я также не вижу способа остановки цикла, когда он находит элемент. Мой код выглядит следующим образом:Тест на проталкивание зависает при нажатии на элементе

var it = null; 
    for(var i = 1; i <= totalNumberOfAccounts; i++) { 
     var listItemLocator = '//div[@id="payment-accounts"]/div/ul/li[' + i + ']/label/div/div[2]/div[2]/span[2]'; 
     var item = browser.driver.findElement(protractor.By.xpath(listItemLocator)); 
     item.getText().then(function(value) { 
      if(value === accountNumber) { 
       it = item; 
      } 
      console.log(value); 
     }) 
     .then(function clickOption() { 
      console.log('Clicking...'); 
      if (it) { 
       console.log('Clicking desired item'); 
       it.click(); 
       console.log('Clicked..'); 
      } 
     }) 
    } 

Я также попробовал этот подход:

this.selectRichSelectOption = function (selector, item) { 

    var selectList = browser.driver.findElement(selector); 
    selectList.click(); 

    var desiredOption = ''; 
    var i = 1; 
    selectList.findElements(protractor.By.tagName('li')) 
     .then(function findMatchingOption(options) { 

      console.log(options); 

      options.some(function (option) { 

       console.log('Option:'); 
       console.log(option); 
       var listItemLocator = '//div[@id="payment-accounts"]/div/ul/li[' + i + ']/label/div/div[2]/div[2]/span[2]'; 
       console.log(listItemLocator); 
       var element = option.findElement(protractor.By.xpath('//label/div/div[2]/div[2]/span[2]')); 
       console.log('Element:'); 
       console.log(element); 
       i++; 

       element.getText().then(function (value) { 
        console.log('Value: ' + value); 
        console.log('Item:'); 
        console.log(item); 
        if (item === value) { 
         console.log('Found option..'); 
         desiredOption = option; 
         return true; 
        } 
        return false; 
       }); 
      }); 
     }) 
     .then(function clickOption() { 
      console.log('Click option'); 
      console.log(desiredOption); 
      if (desiredOption) { 
       console.log('About to click..'); 
       desiredOption.click(); 
      } 
     }); 
}; 

Результатом этого является то, еще более странно. Теперь внезапно вызов метода getText() возвращает пустую строку. Но когда я пытаюсь получить, например, атрибут класса, я возвращаю правильное значение. Откуда ушло значение «Текст»?

Может кто-нибудь, пожалуйста, помогите мне?

+0

Я не совсем понимаю вашу проблему, на каких браузерах вы тестировали? Я встретил [проблему с Firefox с опциями] (https://github.com/angular/protractor/issues/480), и есть другие с выпадающими списками в целом. – glepretre

+0

Я проверил тест на Chrome. Нормальное падение вниз прекращается. Мы используем настраиваемый раскрывающийся список, который создается из нескольких div и тегов ul. В общем, это не очень большая проблема, так как вы можете достичь элементов, используя xpath. Используя обычный API Selenium (а не webdriver), я действительно могу добиться того, чего хочу, перейдя через элементы с помощью xpath. С Selenium Webdriver API это выглядит немного сложнее. Поскольку они используют цепочку асинхронных вызовов, чтобы иметь возможность перемещать элементы. – Tranquilized

+0

Проблема, с которой я в настоящее время сталкиваюсь, заключается в том, что всякий раз, когда я просматриваю параметры и пытаюсь получить текстовое значение, вызывая getText(), он кажется пустым. Поэтому мое сравнение не находит элемент, который я хочу выбрать из раскрывающегося списка. – Tranquilized

ответ

0

Это похоже на проблему с загрузкой страницы. После выбора страница полностью не загружается.

Попробуйте использовать браузер.sleep (timeInMs);

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