2015-09-03 62 views
0

我正在測試我們的web應用程序。我們的整個應用程序是通過一個iframe,爲了訪問它,你必須登錄。Casper JS -cant在iframe中登錄網站

現在我試圖測試登錄頁面(這是在iframe中)。我可以訪問沒有和問題的表單和按鈕,但儘管當我點擊用Casper JS提交時url被更改,頁面實際上並沒有改變。

我試過各種超時,waitFor的等。有沒有人有任何想法可能會阻止頁面?

網站: witkit.com

測試:

var routine = { 
    login: function(email, pass, test) { 
     casper.then(function() { 
      this.withFrame(0, function() { 
       this.waitUntilVisible('form#login-form', function() { 
        this.fill('form#login-form', { 
         email: email, 
         password: pass 
        }, false); 
       }); 
      }); 
     }); 
     casper.then(function(){ 
      casper.withFrame(0, function() { 
       this.click("#modalButtonLogin"); 
      }); 
     }); 
    } 
}; 



casper.test.begin('Logs in', function(test) { 

    casper.start("https://web.witkit.com/#"); 

    casper.then(function(test) { 
     routine.login('*******@witkit.com', '*******', test); 
    }) 

    .wait(3000, function(){ 
     test.assertUrlMatch(this.getCurrentUrl(), 'https://web.witkit.com/#kit/176637403872624641'); 
    }) //this passes 

    casper.wait(10000, function(){ 
     this.withFrame(0, function() { 
      this.echo(this.getHTML()); // this shows login page html 
     }); 
    }) 

    .waitForSelector('.wkKitTitle', function() { 
     // this will never show 
    }) 

    .run(function() { 
     test.done(); 
    }); 

}); 
+1

我記得在某些時間前工作的地方有一個限制做任何類型的iFrame內登錄。我懷疑,如果你直接進入頁面,你可以很好地登錄,但是當它在一個iFrame中(間接)執行時,它什麼也不做?你見過這個線程:http://stackoverflow.com/questions/11439927/how-can-i-http-authentication-login-with-javascript-for-an-iframe – mwilson

+0

我可以填寫任何值的形式,這'test.assertUrlMatch'仍然通過。所以它不是真的登錄。 –

+0

當你嘗試用this.click(「#modalButtonLogin」)登錄時,問題很可能出現。您是否嘗試驗證該按鈕是否實際點擊?您可能必須先獲取iframe的ID,然後在iframe內部單擊該按鈕 - 請參閱http://stackoverflow.com/questions/1452871/how-can-i-access-iframe-elements-with -javascript –

回答

1

的主要問題是,你的iframe#Content尚未在DOM當您正在執行的登錄,由於某些原因需要一段時間來加載。

爲了解決這個問題,您必須在執行登錄之前以及在顯示登錄頁面html之前使其等待iframe#Content(超時20秒)。順便說一句,我還傾向於使用iframe ID作爲第一個參數時調用this.withFrame而不是索引的可讀性和容忍的頁面更改。

我對代碼進行了更改並進行了測試。它似乎現在工作:

var routine = { 
    login: function(email, pass, test) { 
     casper.then(function() { 
      this.withFrame("Content", function() { 
       this.waitUntilVisible('form#login-form', function() { 
        this.fill('form#login-form', { 
         email: email, 
         password: pass 
        }, false); 
       }); 
      }); 
     }); 
     casper.then(function(){ 
      casper.withFrame("Content", function() { 
       this.click("#modalButtonLogin"); 
      }); 
     }); 
    } 
}; 



casper.test.begin('Logs in', function(test) { 

    casper.start("https://web.witkit.com/#"); 

    casper.waitForSelector('iframe#Content', function(test) { 
     routine.login('*******@witkit.com', '*******', test); 
    }, function onTimeout(){}, 20000) 

    .wait(3000, function(){ 
     test.assertUrlMatch(this.getCurrentUrl(), 'https://web.witkit.com/#kit/176637403872624641'); 
    }) //this passes 

    casper.waitForSelector('iframe#Content', function(test) { 
     this.withFrame('Content', function() { 
      this.echo(this.getHTML()); // this shows login page html 
     }); 
    }, function onTimeout(){}, 20000) 

    .waitForSelector('.wkKitTitle', function() { 
     // this will never show 
    }) 

    .run(function() { 
     test.done(); 
    }); 

});