Protractor как ждать элемент правильно ?

Всем привет! Я только осваиваю автоматизацию и Protractor.
Цель такая, я хочу проверять все элементы на наличие, так как делать browser.sleep это зло.
Вот немного кода:

var some.object = function (){

this.element_by_xpath = function(xpath) {
    var EC = protractor.ExpectedConditions;
    var el = element(by.xpath(xpath));
    browser.wait(EC.presenceOf(el), 10000);
    return el;    
}       
this.element_by_id = function(id) {
    var EC = protractor.ExpectedConditions;
    var el = element(by.id(id));
    browser.wait(EC.presenceOf(el), 10000);
    return el;    
}       


this.get_text_by_id = function (id){
    return this.element_by_id(id).getText()
};   

this.get_text_by_xpath = function (xpath){
    var res = this.element_by_xpath(xpath).getText();
    return res;
};
};    

Проблема в том что если this.element_by_xpath или this.element_by_id все работает т.е. если нету элемента ждем 10 секунд. Но если работает this.get_text_by_id или this.get_text_by_xpath проверки такой уже нету (хотя эелемента нет, 10 секунд не ждем и тест падает). Как ждать элемент правильно?

visibilityOf помогло
вместо
browser.wait(EC.presenceOf(el), TIMEOUT);
сделал
browser.wait(EC.visibilityOf(el), TIMEOUT);

к стати дебаг через Phph Storm меня удовлетворяет, я делаю брейкпоинт * чтоб увидеть какой текст будет возварщен в переменной res после .getText(), но вместо текста вижу чтото типа ElementFinder, почему же так

this.get_text_by_xpath = function (xpath){

    var res = this.element_by_xpath(xpath).getText()
    if (res.length>1){
  •       return res;
     }
     else{
         res = this.element_by_xpath(xpath).getText()
    
  •      return res;
    };
get_text_by_xpath = function (xpath) {
    return element(by.xpath(xpath)).getText().then((text)=> {
          console.log(`XPATH: ${xpath} , returned text: ${text}`) // можно поставить брейкпоинт на этой строке
          return text
    }
}

В отличии от других selenium webdriver языковых биндингов, JavaScript selenium возвращает специальные Promise-объекты на каждые выполненные действия. Используя их, можно установить свой коллбек на успешное выполнение команды, и исключительные ситуации.

1 лайк

Спасибо! (я догадывался о том что нужно юзать .then но не знал как точно)

У нас проблемы с промисами / Habr - здесь подробно рассматривается работа с промисами, хоть и не в контексте тестирования. Но имхо, async/await использование гибчее и понятнее: 6 Reasons Why JavaScript Async/Await Blows Promises Away (Tutorial) | HackerNoon