从iframe切换回Angular App对我不起作用

时间:2018-07-16 09:03:11

标签: javascript angular selenium iframe protractor

我已经尝试了很多在堆栈溢出中使用protractorjs切换到iframe的示例,到目前为止,这些示例对我来说都没有用。我希望其他人遇到了这个问题,也许可以为我提供一些见识。

我的问题:我可以填写WorldPay iframe上的所有字段,然后单击“提交”,但是当切换回角度应用程序时,我找不到任何元素。

请参阅下面的示例代码示例,该示例代码在代码的最后一行返回“未找到元素” ...

browser.waitForAngular();
browser.ignoreSynchronization=true;
browser.switchTo().frame(element(by.tagName('iframe')).getWebElement());
element(by.css("input[data-worldpay='name']")).sendKeys("MR TEST ACCOUNT");
element(by.css("input[data-worldpay='number']")).sendKeys("5555555555554444");
element(by.css("input[data-worldpay='exp-month']")).sendKeys("02");
element(by.css("input[data-worldpay='exp-year']")).sendKeys("2022");
element(by.css("input[data-worldpay='cvc']")).sendKeys("123");
element(by.id("_el_button_save")).click();
browser.switchTo().defaultContent();

browser.waitForAngular();
browser.ignoreSynchronization=false;
element(by.id("button_confirm")).click();  

我尝试过的其他事情

  • 我也尝试过使用browser.waitForAngularEnabled(false),然后使用browser.waitForAngularEnabled(true),这导致了同样的问题
  • 我尝试过切换到defaultContent之后等待再次启用角度/将ignoreSynchronization设置为false
  • 代替使用“ browser.switchTo()。defaultContent();”使用“ browser.switchTo()。frame(element(by.tagName('button_confirm'))。getWebElement());”产生相同的结果

2 个答案:

答案 0 :(得分:0)

通过等待iframe的陈旧解决了问题。即使页面已更改,也许iframe仍位于元素的顶部。无论如何,此代码都是解决方案……

// 4) Check for example with Protractor expectedConditions if the iframe is gone
var EC = protractor.ExpectedConditions;
// Waits for the ifram to be no longer present on the dom.
browser.wait(EC.stalenessOf($('iframe')), 5000);

由于此帖子而获得的积分... Detecting Whether An Iframe Is Angular Or Not With Protractor

答案 1 :(得分:0)

尝试

(function() {
    'use strict';

    angular.module('Admin.pages.masters', ['ui.select', 'ui.bootstrap', 'ngSanitize'])
      // .run(function($rootScope){
      //   $rootScope.arr = ['System Admin','System Manager', 'System User'];
      // })  
      .config(routeConfig);

    /** @ngInject */
    function routeConfig($stateProvider, $httpProvider) {
      //localStorageServiceProvider.setStorageType('localStorage');
      //console.log(localStorage.getObject('userData'));
      $httpProvider.interceptors.push('authInterceptor');
      $stateProvider
        .state('main.master', {
          url: '/master',
          template: '<ui-view autoscroll="true" autoscroll-body-top></ui-view>',
          abstract: true,
          title: 'Masters',
          sidebarMeta: {
            icon: 'icoMasters',
            order: 2,
          },
          authenticate: true,
          params: { // <-- focusing this one
            authRoles: ['System Admin', 'System Super Admin'] // <-- roles allowed for this module
          }
        })
        .state('main.master.license', {
          url: '/license',
          template: '<ui-view autoscroll="true" autoscroll-body-top></ui-view>',
          title: 'Customer License',
          sidebarMeta: {
            order: 0,
          },
          authenticate: true,
          params: { // <-- focusing this one
            authRoles: ['System Admin', 'System Super Admin'] // <-- roles allowed for this module
          }
        })

代替

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

我认为您没有成功切换回默认内容。