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

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

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

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

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



답변

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


답변

또 다른 방법은 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();


답변

이제 더 이상 사용되지 않는 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');


답변

각도가 아닌 사이트에서 테스트하려면 동기화를 제거해야합니다. 이를 위해 다음을 사용하십시오.

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


답변

경우에 따라 오류를 방지하기 위해 두 값을 모두 추가해야합니다.

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


답변

개인적으로 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 에서 영감을 얻었습니다.


답변

.js 사양 파일에 아래 스 니펫을 추가하십시오.

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