Всем привет! Я только осваиваю автоматизацию и 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()
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-объекты на каждые выполненные действия. Используя их, можно установить свой коллбек на успешное выполнение команды, и исключительные ситуации.