量角器:在Iframe中测试Angular App

Jos*_*ner 16 selenium angularjs angularjs-e2e protractor

我在这里有一个有趣的设置.

我有一个Angular应用程序在iframe中加载另一个Angular App.我有兴趣用Protractor测试iframed-in Angular应用程序.

量角器正在等待加载的第一个Angular应用程序,但当我切换iframe时

ptor.switchTo().frame('experience');
Run Code Online (Sandbox Code Playgroud)

我可以看到Protractor在进行断言之前没有等待iframed Angular应用程序.我试过添加

ptor.waitForAngular();
Run Code Online (Sandbox Code Playgroud)

切换到iframe没有运气.任何人都有任何想法在这里发生了什么?

谢谢!

如果它有帮助,我正在通过Chrome上的Saucelabs ssh隧道运行我的测试.我可以说隧道工作正常,因为我看到iframed应用程序的资源被请求和下载.

Ith*_*lon 22

用量角器测试iframe有点棘手.我花了一段时间和很多耐心来理解发生了什么.我希望这有帮助!

Protrator是基于WebdriverJS构建的,因此您可以使用整个包来测试iframe.当您开始使用量角器进行测试时,首先要做的是获得量角器的实例:

var ptor = protractor.getInstance();
Run Code Online (Sandbox Code Playgroud)

但要测试你在iframe中的内容,你需要ptor.driver而不是ptor!

var driver = ptor.driver;
Run Code Online (Sandbox Code Playgroud)

然后,当你开始编写测试时,你找到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();
Run Code Online (Sandbox Code Playgroud)

下面的代码是我上面提到的一般例子:

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');

  });

});
Run Code Online (Sandbox Code Playgroud)


ste*_*ves 18

使用量角器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();
Run Code Online (Sandbox Code Playgroud)

  • 这是对的。protractor.getInstance()不再是一个函数。 (2认同)