describe('my homepage', function() {
var ptor = protractor.getInstance();
beforeEach(function(){
// ptor.ignoreSynchronization = true;
ptor.get('http://localhost/myApp/home.html');
// ptor.sleep(5000);
})
describe('login', function(){
var email = element.all(protractor.By.id('email'))
, pass = ptor.findElement(protractor.By.id('password'))
, loginBtn = ptor.findElement(protractor.By.css('#login button'))
;
it('should input and login', function(){
// email.then(function(obj){
// console.log('email', obj)
// })
email.sendKeys('[email protected]');
pass.sendKeys('shakalakabam');
loginBtn.click();
})
})
});
上記のコードは戻ります
Error: Error while waiting for Protractor to sync with the page: {}
そして、これがなぜなのかわからない、ptorがページを正しくロードする、失敗する要素の選択のようだ。
SSHMSHへ:
ありがとう、あなたのほぼ正しい、そして私に正しい哲学を与えたので、キーはptor.sleep(3000)がptorがプロジェクトと同期するまで各ページを待機させることです。
同じエラーメッセージ(Angular 1.2.13)が表示されました。テストの開始が早すぎたため、ProtractorはAngularがロードされるのを待ちませんでした。
分度器の設定ファイルを誤って設定したようです。 ng-app
ディレクティブはBODY要素では定義されていませんが、子孫では、angularルート要素を定義するセレクタに合わせて、分度器設定ファイルのrootElement
プロパティを調整する必要があります:
// protractor-conf.js
rootElement: '.my-app',
hTMLが次の場合:
<div ng-app="myApp" class="my-app">
ChromeDriverを使用していますが、通常、最初のテストで上記のエラーが発生します。私はこのようにそれを回避することができました:
_ptor.ignoreSynchronization = true;
ptor.get(targetUrl);
ptor.wait(
function() {
return ptor.driver.getCurrentUrl().then(
function(url) {
return targetUrl == url;
});
}, 2000, 'It\'s taking too long to load ' + targetUrl + '!'
);
_
基本的に、あなたはブラウザの現在のURLがあなたが求めているものになり、これが起こるのを2秒待つことを待っています。おそらく_ignoreSynchronization = false
_を後で切り替えて、おそらくptor.wait(...)
でラップしたいでしょう。ただ疑問に思う、ptor.sleep(5000);
のコメントを外すのは役に立ちませんか?
編集:Promise/Deferredのいくつかの経験の後、正しいこれを行う方法は次のようになることに気付きました:
_loginBtn.click().then(function () {
ptor.getCurrentUrl(targetUrl).then(function (newURL){
expect(newURL).toBe(whatItShouldBe);
});
});
_
変更の場合(つまり、現在のAngularJSがアクティブになっているページから別のページに移動し、AngularJSライブラリをリロードして初期化する必要があることを意味する場合)、少なくとも私の経験では、 ptor.sleep(...)
呼び出しを回避する方法はありません。上記は、同じAngularページにとどまっているが、ハッシュタグの後のURLの部分を変更している場合にのみ機能します。
私の場合、次のコードでエラーが発生しました。
describe("application", function() {
it("should set the title", function() {
browser.getTitle().then(function(title) {
expect(title).toEqual("Welcome");
});
});
});
これを行うことで修正しました:
describe("application", function() {
it("should set the title", function() {
browser.get("#/home").then(function() {
return browser.getTitle();
}).then(function(title) {
expect(title).toEqual("Welcome");
});
});
});
つまり、テストしたいページに移動するのを忘れていたため、ProtractorはAngularを見つけるのに苦労していました。ど!
分度器設定ファイル で定義されているexports.config
オブジェクトのrootElement
paramは、ng-app
ディレクティブを含む要素と一致する必要があります。これは要素を一意に識別する必要はありません。ディレクティブがdiv
にある場合は、私の場合のように 'div'で十分です。
referenceConf.js
から:
// Selector for the element housing the angular app - this defaults to
// body, but is necessary if ng-app is on a descendant of <body>
rootElement: 'div',
私は分度器を始めました。それ以外の点では優れた egghead.io講義 を見て、彼は凝縮されたexports.config
を使用しています。 rootElement
のデフォルトはbody
であるため、提供された参照構成のコピーで開始しない場合でも、構成の何が悪いのかについてのヒントはありません。
分度器がページと同期するのを待っているときにエラーが発生しました:{}
メッセージはあまり手がかりを与えません。
私はこれをやめなければなりませんでした:
describe('navigation', function(){
browser.get('');
var navbar = element(by.css('#nav'));
it('should have a link to home in the navbar', function(){
//validate
});
it('should have a link to search in the navbar', function(){
//validate
});
});
これを行うには:
describe('navigation', function(){
beforeEach(function(){
browser.get('');
});
var navbar = element(by.css('#nav'));
it('should have a link to home in the navbar', function(){
//validate
});
it('should have a link to search in the navbar', function(){
//validate
});
});
主要な差分:
beforeEach(function(){
browser.get('');
});
これが誰かを助けることを願っています。
使用している場合
browser.restart()
仕様書で何度か、同じエラーがスローされます。使用してみてください
browser.restart()を待つ
私はこのエラーを受け取っていました:
失敗:分度器がページと同期するのを待機中にエラーが発生しました: "window.angularは未定義です。これは、これが非角形ページであるか、テストに分度器のブートストラップを妨げる可能性のあるクライアント側ナビゲーションが含まれている可能性があります。 http://git.io/v4gXM 詳細については」
解決策は、page.navigateTo()
の前にpage.getTitle()
を呼び出すことでした。
前:
import { AppPage } from './app.po';
describe('App', () => {
let page: AppPage;
beforeEach(() => {
page = new AppPage();
});
it('should have the correct title', () => {
expect(page.getTitle()).toEqual('...');
})
});
後:
import { AppPage } from './app.po';
describe('App', () => {
let page: AppPage;
beforeEach(() => {
page = new AppPage();
page.navigateTo();
});
it('should have the correct title', () => {
expect(page.getTitle()).toEqual('...');
})
});