Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

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

protractor
webdriver
javascript
Теги: #<Tag:0x00007fedb72d86b8> #<Tag:0x00007fedb72d8578> #<Tag:0x00007fedb72d8438>

(Vitalii Oleksandrovich) #1

Всем привет! Я только осваиваю автоматизацию и 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 секунд не ждем и тест падает). Как ждать элемент правильно?


(Vitalii Oleksandrovich) #2

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;
    };

(Oleksandr Khotemskyi) #3
get_text_by_xpath = function (xpath) {
    return element(by.xpath(xpath)).getText().then((text)=> {
          console.log(`XPATH: ${xpath} , returned text: ${text}`) // можно поставить брейкпоинт на этой строке
          return text
    }
}

(Oleksandr Khotemskyi) #4

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


(Vitalii Oleksandrovich) #5

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


(Sergei Chipiga) #6

https://habr.com/company/mailru/blog/269465/ - здесь подробно рассматривается работа с промисами, хоть и не в контексте тестирования. Но имхо, async/await использование гибчее и понятнее: https://hackernoon.com/6-reasons-why-javascripts-async-await-blows-promises-away-tutorial-c7ec10518dd9