2014-11-25 5 views
6

Я нахожусь на своем третьем дне, работая с Транспортером, и я постоянно сталкиваюсь с стенами Брис, ожидая, когда страницы загрузятся и появятся элементы. Этот тестовый пример, в частности, стал уродливым, и я хотел бы решить проблемы, не полагаясь на сон.Подождите, пока элемент изменит свое значение (текст)

Я в настоящее время «вне земли AngularJS»

it('it should reflect in both the field and the title when the personnel name is changed', function() { 
    var inputField, personnelHeader, personnelName; 
    personnelName = element(By.css(".overlay.editnameoverlay")).click(); 
    personnelHeader = element(By.id("personnel_name_header")); 
    inputField = element(By.css("input[name='newvalue']")); 
    inputField.clear(); 
    inputField.sendKeys("Test 123"); 
    element(By.css("input[name='ok_button']")).click(); 
    // browser.driver.sleep(2000); This test only works with this sleep added 
    browser.wait(function() { 
    console.log("Waiting for header to change..."); 
    return personnelHeader.getText().then(function(text) { 
     return text === "Test 123"; 
    }); 
    }, 5000); 
    return expect(personnelHeader.getText()).toBe(personnelName.getText()); 
}); 

Так что тест здесь меняет имя в поле ввода. отправляет его и ждет изменений, которые будут отражены в заголовке модального. Проблема заключается в том, что без browser.driver.sleep (2000) Я получаю сообщение об ошибке говорящего

Stacktrace: 
    StaleElementReferenceError: stale element reference: element is not attached to the page document 

Как я могу идти о решении этого в данном конкретном случае?

ответ

6

Когда вы используете Protractor для проверки на неглавные страницы, вы сами по себе ожидаете, когда элементы будут готовы к взаимодействию.

StaleElementReferenceError, вероятно, самые бесполезная ошибка селена, это происходит, когда элемент был удален из DOM, но все еще в кэше или иначе, я также suffered этой проблеме, когда начался с транспортир и даже tried to convince он должен быть повторен автоматически транспортир стороны.

Решение для меня всегда явно ждать элемент появляться на странице с помощью custom functionwaitReady() что browser.wait для элементов готовности, то есть: ждет элемента, чтобы быть готовым к взаимодействию:

expect($('#login_field').waitReady()).toBeTruthy(); 

во-первых интегрировать этот фрагмент в коде: https://gist.github.com/elgalu/2939aad2b2e31418c1bb

не только пользовательский waitReady() ждет элемента, но она также глотает любой несвязанный бесполезный ошибку WebDriver как StaleElementReferenceError и будет просто повторить вплоть до нахождения элемент или он будет тайм-аут.

Так waitReady() каждый элемент до взаимодействия, то есть до того clear() или sendKeys() или click() ...

// TODO: Move to Page Objects module 
var personnelNameElm = $(".overlay.editnameoverlay"); 
var personnelHeaderElm = $("#personnel_name_header"); 
var inputFieldElm = $("input[name='newvalue']"); 
var okBtnElm = $("input[name='ok_button']"); 

it('it should reflect in both the field and the title when the ' + 
    'personnel name is changed', function() { 

    expect(personnelNameElm.waitReady()).toBeTruthy(); 
    personnelNameElm.click(); 
    expect(inputFieldElm.waitReady()).toBeTruthy(); 
    inputFieldElm.clear().sendKeys("Test 123"); 
    expect(okBtnElm.waitReady()).toBeTruthy(); 
    okBtnElm.click(); 

    browser.wait(function() { 
    console.log("Waiting for header to change..."); 
    // Using waitReady() before getText() avoids Stale element errors 
    return personnelHeaderElm.waitReady().then(function() { 
     return personnelHeaderElm.getText().then(function(text) { 
     return text === "Test 123"; 
     }); 
    }); 
    }, 5000); 

    expect(personnelHeaderElm.getText()).toEqual(personnelNameElm.getText()); 
}); 
8

Из документации для Expect Conditions:

var EC = protractor.ExpectedConditions; 
// Waits for the element with id 'abc' to contain the text 'foo'. 
browser.wait(EC.textToBePresentInElement($('#abc'), 'foo'), 5000); 
Смежные вопросы