angularjs가 아닌 웹 사이트에서 Protractor를 사용하는 방법은 무엇입니까?


82

AngularJS 웹 응용 프로그램 용으로 만들어진 Protractor 프레임 워크를 찾았습니다.

AngularJS를 사용하지 않는 웹 사이트에서 Protractor를 어떻게 사용할 수 있습니까?

첫 번째 테스트를 작성했고 Protractor가이 메시지를 트리거합니다.

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

답변:


75

테스트가 각도가 아닌 페이지와 상호 작용해야하는 경우 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/… )
Eitan Peer

클래스 및 각도가 아닌 사이트의 다른 수단으로 요소를 찾는 방법은 무엇입니까?
Easwaramoorthy K

@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
테스트 슈트에서 코드를 일관성있게 유지하기 위해이 접근 방식이 마음에 들었습니다.
기쁨

4
이것은 각도가 아닌 각도기를 다룰 때 분명히 가장 좋은 방법입니다. 더 많은 것을 설명 하는 블로그 게시물 이 있습니다. E2E에 대한 그 검색의 경우도있다 nightwatch.js , 인턴 , casperjs , webdriver
치로 코스타

1
@Andrei pageObjects는 어떻습니까? 기능 블록 외부에 요소를 선언하고 실행하려고하면 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 (); };
Nick

누군가 나와 같은 문제가있는 경우를 대비하여 여기에 넣으십시오. 이 접근 방식을 알고 있으면 좋지만 빠른 실패 를 원할 경우 . 테스트가 실패하더라도 일부 경우 / 환경에서 테스트를 영원히 실행할 수 있습니다.
Linh Pham

제출 버튼을 클릭 한 후 jasmine.DEFAULT_TIMEOUT_INTERVAL이 있습니다. 어떤 생각?
ji-ruh

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 하비브

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 Suggested로 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  
       },

두 번째 접근 방식에서는 각도 스크립트 만 없다고 가정합니다.
Sameera De Silva

1

개인적으로 DOM 요소가 제때 제대로로드되지 않았기 때문에 제안 된 솔루션으로 성공하지 못했습니다.

browser.isElementPresent를 사용하는 browser.wait를 포함하여 비동기 동작을 처리하는 많은 방법을 시도했지만 만족스럽지 않았습니다.

트릭은 Protractor를 사용하여 onPrepare의 메서드에서 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;      
   }

1

각도가 아닌 응용 프로그램을 위해 아래 스 니펫을 추가하십시오.

app- browser.ignoreSynchronization = true;

0

각도가 아닌 응용 프로그램의 경우 config.js 파일에서 아래 스 니펫을 사용하십시오.

browser.ignoreSynchronization = true;

각도 적용의 경우-

browser.ignoreSynchronization = false;

0

Angular, React와 유사한 FE 프레임 워크 인 aurelia 웹 앱 에서 작업 중입니다. 여기에서는 자동화를 위해 각도기를 사용하고 있습니다.

내 프로젝트의 Tech Stack :-

  • 길게 끄는 것
  • 타이프 스크립트
  • 페이지 개체 모달
  • 오이
  • 차이
  • 마디
  • 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

Protractor 대신 Testcafe를 테스트하는 e2e를 사용할 수 있습니다 .
장점 :

  • ES2016 구문
  • 추가 종속성, 구성 및 브라우저 플러그인이 필요하지 않습니다.
  • 유연한 선택기
  • 쉬운 설정

6
@mlosev에게, 이것은 질문에 직접 대답하지 않습니다. "나는 대신 보호자의 사용해야하는 라이브러리"문제는 :-) "... 어떻게 protectrator를 사용하는"입니다하지
아브드 엘 크림
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.