Перейти к содержимому

Фотография

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


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 8

#1 Don_Vito

Don_Vito

    Новый участник

  • Members
  • Pip
  • 6 сообщений

Отправлено 12 мая 2018 - 19:56

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


  • 0

#2 Don_Vito

Don_Vito

    Новый участник

  • Members
  • Pip
  • 6 сообщений

Отправлено 13 мая 2018 - 08:09

Оказалось что элемент все же есть, но почему то не всегда работает getText()  - возвращает пустую строку, но вот такой фикс сработал:

 

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;
        };
 
на 2 проход уже норм, незнаю почему так...
Есть может идеи у кого

  • 0

#3 MissLeman

MissLeman

    Постоянный участник

  • Members
  • PipPipPip
  • 152 сообщений


Отправлено 14 мая 2018 - 13:05

мой ответ будет из разряда "у больного болит голова, если не поможет нурофен, придется делать лоботомию", но все же

 

1 - элемент может быть present, но не visible, что будет видно по ошибке с которой падает тест.

 

но ждалка типа

browser.wait(EC.visibilityOf(el), timeout

вообще полезная штука в хозяйстве, заводите.

 

2 - getText() не работает с элементами типа text area (и по-моему с некоторыми другими, сходу не припомню), надо getAttribute(value), это есть в спеке трактора.

 

Напишите, пожалуйста, эти расхождения у вас с одним и тем же элементом или с разными? Какую ошибку показывает тест при падении?

 

З.Ы. а - кажется, не совсем правильно поняла вопрос. в общем постою послушаю.


  • 0

#4 Don_Vito

Don_Vito

    Новый участник

  • Members
  • Pip
  • 6 сообщений

Отправлено 14 мая 2018 - 20:15

мой ответ будет из разряда "у больного болит голова, если не поможет нурофен, придется делать лоботомию", но все же

 

1 - элемент может быть present, но не visible, что будет видно по ошибке с которой падает тест.

 

но ждалка типа

browser.wait(EC.visibilityOf(el), timeout

вообще полезная штука в хозяйстве, заводите.

 

2 - getText() не работает с элементами типа text area (и по-моему с некоторыми другими, сходу не припомню), надо getAttribute(value), это есть в спеке трактора.

 

Напишите, пожалуйста, эти расхождения у вас с одним и тем же элементом или с разными? Какую ошибку показывает тест при падении?

 

З.Ы. а - кажется, не совсем правильно поняла вопрос. в общем постою послушаю.

 

visibilityOf помогло, убрал костыль в виде еще одной попытки считать текст через if-else

к стати дебаг через 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;
        };

  • 0

#5 Don_Vito

Don_Vito

    Новый участник

  • Members
  • Pip
  • 6 сообщений

Отправлено 14 мая 2018 - 21:40

 

мой ответ будет из разряда "у больного болит голова, если не поможет нурофен, придется делать лоботомию", но все же

 

1 - элемент может быть present, но не visible, что будет видно по ошибке с которой падает тест.

 

но ждалка типа

browser.wait(EC.visibilityOf(el), timeout

вообще полезная штука в хозяйстве, заводите.

 

2 - getText() не работает с элементами типа text area (и по-моему с некоторыми другими, сходу не припомню), надо getAttribute(value), это есть в спеке трактора.

 

Напишите, пожалуйста, эти расхождения у вас с одним и тем же элементом или с разными? Какую ошибку показывает тест при падении?

 

З.Ы. а - кажется, не совсем правильно поняла вопрос. в общем постою послушаю.

visibilityOf помогло, убрал костыль в виде еще одной попытки считать текст через if-else

к стати дебаг через 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;
        };
 
 
неужели .then вешать 

 


  • 0

#6 MissLeman

MissLeman

    Постоянный участник

  • Members
  • PipPipPip
  • 152 сообщений


Отправлено 15 мая 2018 - 07:40

А у вас в принципе работает что-то типа

 

var el = element(by.xpath("...."));

browser.wait(EC.presenceOf(el), 10000);

browser.wait(EC.visibilityOf(el), 10000);

el.getText();

?


  • 0

#7 Don_Vito

Don_Vito

    Новый участник

  • Members
  • Pip
  • 6 сообщений

Отправлено 16 мая 2018 - 20:24

А у вас в принципе работает что-то типа

 

var el = element(by.xpath("...."));

browser.wait(EC.presenceOf(el), 10000);

browser.wait(EC.visibilityOf(el), 10000);

el.getText();

?

да элемент ждем правильно, т.е. или он сразу есть - все ок, или же таймер 10 сек буде рабоать. Тут подсказали использовать в дебагере .then (JavaScript selenium возвращает специальные Promise-объекты на каждые выполненные действия.)

как то так:

 

get_text_by_xpath = function (xpath) {

return element(by.xpath(xpath)).getText().then((text)=> {

console.log(`XPATH: ${xpath} , returned text: ${text}`) // можно поставить брейкпоинт на этой строке

return text } }


  • 0

#8 MissLeman

MissLeman

    Постоянный участник

  • Members
  • PipPipPip
  • 152 сообщений


Отправлено 17 мая 2018 - 08:46

 

Блин, совсем забыла, что getText() это промис.

Эта функция (по крайней мере мной) используется в основном в экспектах, типа expect element.getText().toBeEqual(smth) , а там оно через промис внутри реализовано


  • 0

#9 igorek812

igorek812

    Новый участник

  • Members
  • Pip
  • 1 сообщений
  • ФИО:Рыков Игорь


Отправлено 28 мая 2018 - 11:12

а еще лучше использовать async/await 

 

async get_text_by_xpath(xpath) {

    const text = await element(by.xpath(xpath)).getText();

  console.log('text = ', text);

  return text

}
 

а далее вы уже вызываете функцию сл. образом:

const text = await get_text_by_xpath('тут ваш xpath');


  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных