Angularjs以外のWebサイトでProtractorを使用する方法は?


82

AngularJSWebアプリケーション用に作成されたProtractorフレームワークを見つけました。

AngularJSを使用していないWebサイトでProtractorを使用するにはどうすればよいですか?

私は最初のテストを作成し、分度器がこのメッセージをトリガーします。

Error: Angular could not be found on the page https://www.stratexapp.com/ : retries looking for angular exceeded

回答:


75

テストが角度のないページと対話する必要がある場合は、を使用してWebdriverインスタンスに直接アクセスしますbrowser.driver

分度器のドキュメントからの例

browser.driver.get('http://localhost:8000/login.html');

browser.driver.findElement(by.id('username')).sendKeys('Jane');
browser.driver.findElement(by.id('password')).sendKeys('1234');
browser.driver.findElement(by.id('clickme')).click();

2
ただのばかげた質問、にby.id変わりましたBy.idか?
Val

7
@ Val-global.by = global.By = protractor.By; (ソース- github.com/angular/protractor/commit/...
エイタンピア

クラスおよび非角度サイトの他の手段によって要素を見つける方法は?
Easwaramoorthy K 2016

@EaswaramoorthyK by.classNameドキュメントを
Murali KG

130

別のアプローチは、browser.get(...)のbrowser.ignoreSynchronization = true に設定することです。分度器はAngularがロードされるのを待たず、通常のelement(...)構文を使用できます。

browser.ignoreSynchronization = true;
browser.get('http://localhost:8000/login.html');

element(by.id('username')).sendKeys('Jane');
element(by.id('password')).sendKeys('1234');
element(by.id('clickme')).click();

5
テストスーツ全体でコードの一貫性を保つために、このアプローチが気に入りました。
喜び2014年

4
これは、角度のない分度器を扱う場合に間違いなく最良のアプローチです。これに関するブログ投稿があり、さらにいくつかのことを説明しています。E2Eをお探しの方には、nightwatch.jsインターンcasperjswebdriverもあります
Ciro Costa

1
@AndreipageObjectsはどうですか。機能ブロックの外側で要素を宣言して実行しようとすると、NoSuchElementErrorコードスニペットが表示されます。this.buttonOnLeftSide= browser.driver.findElement(by.className( 'leftbutton')); this.iframe = 'emulatorFrame'; this.clickPlusSignOnTemplateEditor = function(){browser.driver.ignoreSynchronization = true; console.log( 'hey'); browser.driver.switchTo()。frame(this.iframe); console.log( 'iframe内'); browser.sleep(3000); buttonOnLeftSide.click(); };
ニック

私のような同じ問題を抱えている人のために、ここに置いてください。このアプローチに注意してください、それは良いですが、あなたが速く失敗したいのであれば。テストは失敗しますが、場合によってはテストが永久に実行されることがあります。
Linh Pham

送信ボタンをクリックした後、jasmine.DEFAULT_TIMEOUT_INTERVALがあります。何か案が?
ji-ruh 2016年

16

非推奨のignoreSynchronizationプロパティの代わりにwaitForAngularを使用する必要があります。

次のwaitForAngularガイダンスは、タイムアウトについてProtractorドキュメントから取得されます。

Angularの待機を無効にする方法

Angularを使用していないページに移動する必要がある場合は、 `browser.waitForAngularEnabled(false)を設定することで、Angularの待機をオフにできます。例えば:

browser.waitForAngularEnabled(false);
browser.get('/non-angular-login-page.html');

element(by.id('username')).sendKeys('Jane');
element(by.id('password')).sendKeys('1234');
element(by.id('clickme')).click();

browser.waitForAngularEnabled(true);
browser.get('/page-containing-angular.html');

その動作はバグが多い
Muneem Habib 2018

2

非角度サイトでテストするには、同期を削除する必要があります。そのためには、以下を使用します。

browser.ignoreSynchronisation = true;
browser.get('url');

2

場合によっては、エラーを回避するために両方の値を追加する必要があります。

 browser.driver.ignoreSynchronization = true;
 browser.waitForAngularEnabled(false); 

それらをspec.jsファイルに追加できます。

describe('My first non angular class', function() {
    it ('My function', function() {
        browser.driver.ignoreSynchronization = true;
        browser.waitForAngularEnabled(false);

または、@ Mridulの提案に従って、config.jsファイルに追加します。

exports.config = {directConnect:true、フレームワーク: 'jasmine'、

  onPrepare: function () {
         browser.driver.ignoreSynchronization = true;// for non-angular set true. default value is false 
         browser.waitForAngularEnabled(false);   // for non-angular set false. default value is true  
       },

2番目のアプローチでは、角度のあるスクリプトがないことを前提としています。
Sameera DeSilva19年

1

個人的には、DOM要素が時間内に適切に読み込まれなかったため、提案されたソリューションでは成功しませんでした。

browser.waitとbrowser.isElementPresentを含む、その非同期動作を処理する多くの方法を試しましたが、どれも満足のいくものではありませんでした。

トリックは、onPrepareのメソッドからProtractorが返すPromisesを使用することでした。

onPrepare: () => {

    browser.manage().window().maximize();

    browser.waitForAngularEnabled(true).then(function () {
        return browser.driver.get(baseUrl + '/auth/');
    }).then(function () {
        return browser.driver.findElement(by.name('login')).sendKeys('login');
    }).then(function () {
        return browser.driver.findElement(by.name('password')).sendKeys('password');
    }).then(function () {
        return browser.driver.findElement(by.name('submit')).click();
    }).then(function () {
        return true;
    });

    return browser.driver.wait(function () {
        return browser.driver.getCurrentUrl().then(function (url) {
            return /application/.test(url);
        });
    }, 10000);
},

https://github.com/angular/protractor/blob/master/spec/withLoginConf.jsに触発されました


1
trueではなくbrowser.waitForAngularEnabled(false)にすべきではありませんか?
onluiz

1

以下のスニペットを.jsスペックファイルに追加します

beforeAll(function() {
    browser.waitForAngularEnabled(false);
});

1

conf.jsファイルに次のコードを追加します

   onPrepare: function () {
       browser.ignoreSynchronization = true;      
   }


0

角度のないアプリケーションの場合は、config.jsファイルで以下のスニペットを使用してください-

browser.ignoreSynchronization = true;

角度のあるアプリケーションの場合-

browser.ignoreSynchronization = false;

0

私はAngular、Reactに似たFEフレームワークであるaureliaウェブアプリに取り組んでいます。この中で私は自動化のために分度器を使用しています。

私のプロジェクトのどれを技術スタック:-

  • 分度器
  • Typescript
  • ページオブジェクトモーダル
  • きゅうり
  • チャイ
  • ノード
  • npm
  • VSコード(IDE)

主な変更は構成ファイルでのみ発生します。それが役立つ場合は、githubにコードを追加できます。これは、プロジェクトで使用している構成ファイルで、私に最適です。私のワードプレスにもいくつかのブログを投稿しました。それがお役に立てば幸いです。

const reporter = require('cucumber-html-reporter');
exports.config = {
    SELENIUM_PROMISE_MANAGER: false,
    directConnect: true,
    specs: ["./e2e/features/*/EndToEnd.feature"],
    format: 'json:cucumberReport.json',
    framework: 'custom',
    frameworkPath: require.resolve('protractor-cucumber-framework'),
    cucumberOpts: {
        strict: true,
        format: 'json:cucumberReport.json',
        keepAlive: false,
        require: [
            './e2e/hooks/*.ts',
            './e2e/stepDefinition/*/*.ts',
        ],
       tags: '@Regression'
    },
    beforeLaunch: function () {
        require('ts-node/register')
    },
    onPrepare: async () => {
        await browser.waitForAngularEnabled(false);
        await browser.ignoreSynchronization == true;
        await browser.manage().window().maximize();
        await browser.manage().timeouts().implicitlyWait(10000);
     },
    onComplete: async () => {
         var options = {
            theme: 'bootstrap',
            jsonFile: './reports/cucumberReport.json',
            output: './reports/cucumberReport.html',
            reportSuiteAsScenarios: true,
            launchReport: false,
            screenshotsDirectory: './reports/screenshots',
            storeScreenshots: true,
            metadata: {
                "Test Environment": "SAND-DEV-1",
                "Platform": "Windows 10",
            }
        };
        reporter.generate(options);
    },
};

-5

分度器の代わりに、Testcafeのe2eテストに使用できます。
長所:

  • ES2016構文
  • 追加の依存関係、構成、ブラウザプラグインは必要ありません
  • 柔軟なセレクター
  • 簡単なセットアップ

6
親愛なる@mlosev、これは質問に直接答えません。問題は「プロテクターの使い方...」であり、「プロテクターの代わりにどのライブラリを使用すべきか」ではありません:-)
Abdelkrim 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.