2013-12-06 7 views
12

У меня здесь интересная установка.Транспортир: тестирование углового приложения в iframe

У меня есть приложение с угловым выражением, которое загружает другое угловое приложение внутри iframe. Я заинтересован в тестировании iframed-in Angular app с помощью Protractor.

транспортир ждет первого углового приложения для загрузки, но когда я переключаю IFRAME с

ptor.switchTo().frame('experience'); 

Я могу видеть, что транспортир не ждет фреймов углового приложения, прежде чем делать утверждение. Я пробовал добавить

ptor.waitForAngular(); 

После переключения на iframe без везения. У кого-нибудь есть идеи, что здесь происходит?

Спасибо!

Если это помогает, я выполняю свои тесты через туннель Saucelabs ssh в Chrome. Я могу сказать, что туннелирование работает, потому что я вижу ресурсы для запрошенного и загружаемого приложения iframed.

ответ

20

Тестирование iframe с транспортиром немного сложно. Мне потребовалось время и много терпения, чтобы понять, что происходит. Надеюсь, это поможет!

Protrator построен на WebdriverJS, поэтому вы можете использовать весь пакет для тестирования iframes. Когда вы начинаете испытывать с транспортиром, то первое, что вам сделать, это получить экземпляр транспортира:

var ptor = protractor.getInstance(); 

Но чтобы проверить, что у вас есть внутри фрейма вы будете нуждаться в ptor.driver вместо PTOR!

var driver = ptor.driver; 

Затем, когда вы начнете писать тест, вы найдете IFRAME, вы переключитесь на него, вы проверить его с «водителем», и вы переключитесь обратно к исходному кадру.

ptor.switchTo().frame(driver.findElement(protractor.By.xpath('xpath-to-iframe'))); 

// Test iframe with driver 
driver.findElement(protractor.By.xpath('some-sort-of-input')).sendKeys('username'); 
driver.findElement(protractor.By.xpath('other-sort-of-input')).sendKeys('password'); 
driver.findElement(protractor.By.xpath('other-sort-of-button')).click(); 

// Switch back to Default Content 
ptor.switchTo().defaultContent(); 

// And WAIT for angular!! 
ptor.waitForAngular(); 

код, который следует это общий пример того, что я уже упоминал выше:

describe('Protractor iframe Test', function(){ 

    var ptor, driver; 

    beforeEach(function(){ 
    ptor = protractor.getInstance(); 
    driver = ptor.driver; 
    }); 

    it('should test the iframe', function(){ 

    ptor.switchTo().frame(driver.findElement(protractor.By.xpath('xpath-to-iframe'))); 

    // Test iframe with driver 
    driver.findElement(protractor.By.xpath('some-sort-of-input')).sendKeys('username'); 
    driver.findElement(protractor.By.xpath('other-sort-of-input')).sendKeys('password'); 
    driver.findElement(protractor.By.xpath('other-sort-of-button')).click(); 

    // At this point, you can expect() things to happen to the iframe app 

    // Switch back to Default Content 
    ptor.switchTo().defaultContent(); 

    // And WAIT for angular!! 
    ptor.waitForAngular(); 

    // Then you can keep testing (or expecting something!) 
    expect('this answer').toBe('useful'); 

    }); 

}); 
8

С транспортиром 2.5.1 Ответ @ lthilon был дает ошибку «Недопустимый Локатор».

следующий синтаксис решил, что хотя:

var driver = browser.driver; 
    var loc = by.tagName('iframe'); 
    var el = driver.findElement(loc); 
    browser.switchTo().frame(el); 

    driver.findElement(by.tagName('body')).sendKeys('my test string'); 

    browser.switchTo().defaultContent(); 
    browser.waitForAngular(); 
+0

, наконец, после многих поисков, это решение работает для меня. Спасибо –