Protractor:在Iframe中测试非角度应用程序

Protractor: Testing non-Angular App in an Iframe

本文关键字:应用程序 测试 Iframe Protractor      更新时间:2023-09-26

我正在为我的非角度应用程序编写e2e测试,使用量角器版本3.3.0。我的应用程序在iframe中加载另一个非Angular应用程序,我正试图用Protractor为iframe编写测试。

我使用browser.driver.ignoreSynchronization=true尝试了上述操作:

1.

 var EC = protractor.ExpectedConditions;
 var button = $("div[automation-id='homescreen']")
 var isClickable = EC.elementToBeClickable(button);
 browser.wait(isClickable, 50000).then(function(){
      browser.driver.sleep(500);
      button.click();
 }) 

收到错误"Failed:unknown error:Element is not clickable at point(326624)…"

2.

var loc = by.id('myFrame');
el = browser.driver.findElement(loc)
browser.driver.switchTo().frame(el);

收到错误"失败:没有这样的元素:无法定位元素:{"方法":"css选择器","选择器":"*[id="myFrame"]"}"

甚至认为el被成功找回了。。

3.

browser.driver.switchTo().frame(0);

尝试使用索引1并收到"失败:没有这样的帧.."错误

4.

browser.driver.getAllWindowHandles()

只收到一个窗口。。。

如果这是页面上唯一的iframe,则选项3看起来很有希望。我只需要等待iframe出现,然后再切换到它:

// wait for the frame to be present
var EC = protractor.ExpectedConditions;
browser.wait(EC.presenceOf(element(by.tagName("iframe"))), 5000);
// switch to frame
browser.driver.switchTo().frame(0);

切换到Iframe

对于非角度页面

browser.driver.switchTo().defaultContent();

browser.driver.switchTo().frame("帧id或类名");

请尝试以下代码,iframe不属于angular应用

browser.ignoreSynchronization = true;
return browser.switchTo().frame(iFrameEle.getWebElement())
            .then(function(){
                // in the iframe..
            })
            .then(function(){
                // restore sync for angular
                browser.ignoreSynchronization = false;
                return browser.switchTo().defaultContent();
            });
var elem = element(by.xpath('.//div[contains(@id,''contents'') and contains(@id,''cke'')]/iframe'));
        browser.sleep(3000);
        elem.click();
        browser.switchTo().frame(elem.getWebElement());
        browser.sleep(3000);
        element(by.tagName('body')).sendKeys('test'); // entering text on iframe 
        browser.switchTo().defaultContent();
        browser.sleep(3000);

我在我的应用程序及其工作中使用了上述代码。希望它能帮助你。我首先点击iframe,然后将焦点转移到它上。

注意:当我给睡眠时间时,它只起作用。