Я нашел фреймворк Protractor, созданный для веб-приложений AngularJS.
Как я могу использовать Protractor на веб-сайте, который не использует AngularJS?
Я написал свой первый тест, и транспортир выдает это сообщение:
Error: Angular could not be found on the page https://www.stratexapp.com/ : retries looking for angular exceeded
javascript
asp.net
angularjs
testing
protractor
Абделькрим
источник
источник
by.id
поменял наBy.id
?by.className
. См. ДокументыДругой подход - установить
browser.ignoreSynchronization = true
до browser.get (...). Protractor не будет ждать загрузки 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();
источник
waitForAngular теперь следует использовать вместо устаревшего свойства ignoreSynchronization.
Следующее руководство waitForAngular взято из документации Protractor для тайм-аутов:
источник
Для тестирования на не угловом сайте вам следует удалить синхронизацию. для этого используйте следующее:
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, добавьте их в файл config.js.
exports.config = {directConnect: true, framework: 'жасмин',
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.wait с browser.isElementPresent, но ни один из них не удовлетворил.
В чем трюк, используя Protractor, возвращенные Promises из его методов в onPrepare:
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); });
источник
Добавьте следующий фрагмент кода в файл conf.js
onPrepare: function () { browser.ignoreSynchronization = true; }
источник
Добавьте ниже фрагмент для приложений, отличных от angular:
app- browser.ignoreSynchronization = true;
источник
Используйте нижеприведенный фрагмент в файле config.js для приложений, отличных от angular:
browser.ignoreSynchronization = true;
а для углового применения -
browser.ignoreSynchronization = false;
источник
Я работаю над веб-приложением aurelia , которое представляет собой структуру FE, похожую на Angular, React. Здесь я использую транспортир для автоматизации.
Tech Stack из моего проекта: -
Основное изменение происходит только в файле конфигурации, я могу добавить код в github, если это поможет, вот файл конфигурации, который я использую в своем проекте, который идеально подходит для меня. Также опубликовал несколько блогов в моем WordPress , надеюсь, что это может помочь.
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); }, };
источник
Вместо транспортира вы можете использовать для тестирования e2e Testcafe .
Плюсы:
источник