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