2016-12-15 8 views
1

この基本テストを一貫して行う方法を理解しようとしています。分度器配列決定の基本テスト。ログイン後にテストを実行

describe('home page', function() { 

    beforeEach(function() { 
     browser.driver.get('https://localhost:0000/xxxx/'); 
    }); 

    it('should have a title', function() { 
     var userName = browser.driver.findElement(by.id('userid_inputtext')).sendKeys('userNameXX'); 
     var passWord = browser.driver.findElement(By.id("password_inputtext")).sendKeys("passWordXX"); 
     var login = browser.driver.findElement(By.id('sign_in_button')); 

     login.click(); 

     browser.driver.getCurrentUrl(); 
     browser.driver.getTitle().then(function (title) { 
      expect(title).toEqual('Webpage Title'); 
     }); 
    }); 

}); 

ログインページは角度ではありませんが、ログイン後に角度アプリを読み込みます。今、私のテストは、ある時を過ぎています。問題は、ログインページのタイトルを取得することがあり、ホームページのタイトルを取得することがあることです(ログイン後にホームページのタイトルを一貫してテストしたい場合があります)。

私は約束とブラウザを使用して遊んでいます。ちょっと待ってくださいが、実際にこれを釘付けにしていません。どんな助言も素晴らしいだろう!

+0

'.click()'メソッドは有効ではありませんか? –

+0

それはその中に 'login.click()'の下にコードを置くと、まだログインページのタイトルをつかんでいます。 –

答えて

2

私が考えることができるいくつかの事柄 - 分度器APIのメソッドのほとんどは非同期であり、約束を返します。ログインページで

あなたlogin.click()一度、あなたのホームページがロードに時間がかかり、そのためのような、次の非同期メソッド - browser.getCurrentUrl & browser.getTitleが最初に呼ばれています。あなたが指摘しているように、これは一貫して起こりません。

また、変数を要素ロケータに割り当ててから、それらにアクションを実行する必要があります。あなたはロケータを格納するためにページオブジェクトを使うべきです。 Official Protractor Style Guide

browser.getCurrentUrlもまた解決しなければならない約束を返します。

describe('home page', function() { 

beforeEach(function() { 
    browser.driver.get('https://localhost:0000/xxxx/'); 
}); 

it('should have a title', function() { 
    var userName = browser.driver.findElement(by.id('userid_inputtext')); 
    userName.clear(); 
    userName.sendKeys('userNameXX'); 

    var passWord = browser.driver.findElement(By.id("password_inputtext")); 
    passWord.clear(); 
    passWord.sendKeys("passWordXX"); 

    var login = browser.driver.findElement(By.id('sign_in_button')); 

    browser.driver.wait(login.click(),5000,'homePage should be loaded within 5 secs'); // would throw an error if the page takes more than 5 secs to load 

// you could also use `browser.driver.sleep(500)` but not advisable as sleeps slow the tests down! 

    browser.driver.getCurrentUrl().then(function (url) { 
     expect(url).toEqual('homePage url'); 
    }); 
    browser.driver.getTitle().then(function (title) { 
     expect(title).toEqual('Webpage Title'); 
    }); 
}); 

}); 

また、あなたのログインページが非角度であるから、あなたはbrowser.ignoreSynchronizationを使用することです正しい方法でテストを書いて、使用できます:あなたは正しい方法でbrowser.waitを使用する必要があり、この問題を解決するために

分度器のapiメソッドをよりクリーンな方法で実行します。

describe('home page', function() { 

beforeEach(function() { 
    browser.get('https://localhost:0000/xxxx/'); 
}); 

it('should have a title', function() { 
    browser.ignoreSynchronization = true; // set it to true for non-angular pages(loginPage) 
    var userName = element(by.id('userid_inputtext')); 
    userName.clear(); 
    userName.sendKeys('userNameXX'); 

    var passWord = element(By.id("password_inputtext")); 
    passWord.clear(); 
    passWord.sendKeys("passWordXX"); 

    var login = element(By.id('sign_in_button')); 

    browser.wait(login.click(),5000,'homePage should be loaded within 5 secs'); 
    browser.ignoreSynchronization = false; // set it to false for angular pages(homePage) 

    browser.getCurrentUrl().then(function (url) { 
     expect(url).toEqual('homePage url'); 
    }); 
    browser.getTitle().then(function (title) { 
     expect(title).toEqual('Webpage Title'); 
    }); 
}); 

}); 

お知らせbrowser.driverオブジェクトにアクセスする必要がない、あなたは直接分度器のメソッドを使用することができます!

+0

確かに 'browser.wait()'は最初の引数として関数を受け入れます。したがって、 'browser.wait(login.click、5000)'、 'browser.wait(login.click.bind(login)、5000)'です。 –

+0

実際に私に矛盾した結果をもたらしたのは、電子メール/ユーザー名がログインページに入力された後に読み込まれるアニメーションでした。 –

関連する問題