ここに興味深い設定があります。
Iframe内に別のAngularアプリをロードするAngularアプリがあります。 iframed-in AngularアプリをProtractorでテストすることに興味があります。
分度器は最初のAngularアプリが読み込まれるのを待っていますが、iframeを
ptor.switchTo().frame('experience');
Protractorがアサーションを作成する前にiframed Angularアプリを待機していないことがわかります。追加してみました
ptor.waitForAngular();
運が悪かったのでiframeに切り替えた後。誰かがここで何が起こっているのか考えがありますか?
ありがとう!
それが役立つ場合は、ChromeのSaucelabssshトンネルを介してテストを実行しています。 iframedアプリのリソースが要求され、ダウンロードされているのを確認できるため、トンネリングが機能していることがわかります。
分度器でiframeをテストするのは少し注意が必要です。何が起こっているのかを理解するのに、しばらく時間がかかり、多くの忍耐が必要でした。これがお役に立てば幸いです。
ProtratorはWebdriverJSに基づいて構築されているため、パッケージ全体を使用してiframeをテストできます。分度器でテストを開始するとき、最初に行うことは分度器のインスタンスを取得することです。
var ptor = protractor.getInstance();
ただし、iframe内にあるものをテストするには、ptorではなくptor.driverが必要になります。
var driver = ptor.driver;
次に、テストの作成を開始すると、iframeが見つかり、それに切り替えて、「driver」でテストし、最初のフレームに戻ります。
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');
});
});
分度器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();
最新の分度器APIドキュメント5.4.1によると、iframeへの切り替えは非常に簡単です。
await browser.switchTo().frame(element(by.xpath('//iframe')).getWebElement());
コンテキストが指定されたiframeに切り替わり、実行するすべてのコマンドがiframeで実行されます。ネストされたiframeに切り替えることもできます。親iframeに戻すには:
driver.switchTo().parentFrame();