Best JavaScript code snippet using backstopjs
get-items-for-removing.js
Source:get-items-for-removing.js
...17 }18 });19 const result = instance.getItemsForRemoving(instance.beforeParams);20 expect(result.directories).to.have.members([21 toAbsolute(['plugin_test', 'test'])22 ]);23 expect(result.files).to.have.members([24 toAbsolute(['plugin_test', 'test.txt']),25 toAbsolute(['plugin_test', 'test.jpg'])26 ]);27 });28 it('should correctly handle test', function () {29 const instance = new Plugin({30 after: {31 test: [32 {33 folder: './plugin_test',34 recursive: false,35 method: (absoluteItemPath) => {36 return (37 absoluteItemPath === toAbsolute(['plugin_test', 'test.txt']) ||38 absoluteItemPath === toAbsolute(['plugin_test', 'test.jpg'])39 );40 }41 }42 ]43 }44 });45 const result = instance.getItemsForRemoving(instance.afterParams);46 expect(result.directories).to.have.members([]);47 expect(result.files).to.have.members([48 toAbsolute(['plugin_test', 'test.txt']),49 toAbsolute(['plugin_test', 'test.jpg'])50 ]);51 });52 it('should correctly handle exclude', function () {53 const instance = new Plugin({54 watch: {55 root: 'plugin_test',56 include: [57 'test.txt',58 'test test.txt'59 ],60 test: [61 {62 folder: '.',63 recursive: true,64 method: (absoluteItemPath) => {65 return (66 absoluteItemPath.includes('.png') ||67 absoluteItemPath.includes('.jpg')68 );69 }70 }71 ],72 exclude: [73 'test',74 'test test.txt'75 ]76 }77 });78 const result = instance.getItemsForRemoving(instance.watchParams);79 expect(result.directories).to.have.members([]);80 expect(result.files).to.have.members([81 toAbsolute(['plugin_test', 'test.txt']),82 toAbsolute(['plugin_test', 'test.jpg']),83 toAbsolute(['plugin_test', 'test', 'test.png'])84 ]);85 });86 it('should skip not existed folders or files', function () {87 const instance = new Plugin({88 before: {89 include: [90 './plugin_test/test',91 './plugin_test/not exists',92 './plugin_test/not exists.txt'93 ]94 }95 });96 const result = instance.getItemsForRemoving(instance.beforeParams);97 expect(result.directories).to.have.members([98 toAbsolute(['plugin_test', 'test'])99 ]);100 });101 it('should skip unsafe folders or files', function () {102 const instance = new Plugin({103 before: {104 allowRootAndOutside: false,105 include: [106 path.resolve('.'),107 'D:\\plugin_test/test.txt',108 'D:/plugin_test\\test'109 ]110 }111 });112 const result = instance.getItemsForRemoving(instance.beforeParams);113 expect(result.directories).to.have.members([]);114 expect(result.files).to.have.members([]);115 });116 it('should allow unsafe folders or files', function () {117 const instance = new Plugin({118 before: {119 allowRootAndOutside: true,120 include: [121 '.',122 'D:\\plugin_test/test.txt',123 'D:/plugin_test\\test'124 ]125 }126 });127 const result = instance.getItemsForRemoving(instance.beforeParams);128 expect(result.directories).to.have.members([129 path.resolve('.'),130 'D:\\plugin_test\\test'131 ]);132 expect(result.files).to.have.members([133 'D:\\plugin_test\\test.txt'134 ]);135 });136 it('should skip unnecessary folders or files', function () {137 const instance = new Plugin({138 after: {139 root: 'plugin_test',140 include: [141 'test.txt',142 './test',143 '.\\test\\test',144 './test/test.txt',145 '.\\test/test.png'146 ]147 }148 });149 const result = instance.getItemsForRemoving(instance.afterParams);150 expect(result.directories).to.have.members([151 toAbsolute(['plugin_test', 'test'])152 ]);153 expect(result.files).to.have.members([154 toAbsolute(['plugin_test', 'test.txt'])155 ]);156 });157 it('should handle tricky paths', function () {158 const instance = new Plugin({159 watch: {160 root: './plugin_test\\..',161 allowRootAndOutside: false,162 include: [163 '.',164 'plugin_test\\test\\../test.txt',165 '.\\plugin_test/test test.txt'166 ],167 test: [168 {169 folder: 'plugin_test',170 recursive: false,171 method: (absoluteItemPath) => absoluteItemPath.includes('.txt')172 },173 {174 folder: './plugin_test\\../plugin_test\\test\\',175 recursive: false,176 method: () => true177 }178 ],179 exclude: [180 './plugin_test/../plugin_test/test test.txt',181 'plugin_test\\test/test.png'182 ]183 }184 });185 const result = instance.getItemsForRemoving(instance.watchParams);186 expect(result.directories).to.have.members([187 toAbsolute(['plugin_test', 'test', 'test'])188 ]);189 expect(result.files).to.have.members([190 toAbsolute(['plugin_test', 'test.txt']),191 toAbsolute(['plugin_test', 'test', 'test.txt'])192 ]);193 });194 it('should handle test with folders and files', function () {195 const instance = new Plugin({196 after: {197 root: 'plugin_test',198 allowRootAndOutside: false,199 include: [],200 test: [201 {202 folder: '.',203 recursive: true,204 method: (absoluteItemPath) => fs.statSync(absoluteItemPath).isDirectory()205 },206 {207 folder: '.',208 recursive: true,209 method: (absoluteItemPath) => fs.statSync(absoluteItemPath).isFile()210 }211 ]212 }213 });214 const result = instance.getItemsForRemoving(instance.afterParams);215 expect(result.directories).to.have.members([216 toAbsolute(['plugin_test', 'test'])217 ]);218 expect(result.files).to.have.members([219 toAbsolute(['plugin_test', 'test.txt']),220 toAbsolute(['plugin_test', 'test test.txt']),221 toAbsolute(['plugin_test', 'test.jpg'])222 ]);223 });224 it('should handle test â 1 with folders, files and exclude', function () {225 const instance = new Plugin({226 before: {227 root: 'plugin_test',228 allowRootAndOutside: false,229 include: [],230 test: [231 {232 folder: '.',233 recursive: true,234 method: (absoluteItemPath) => fs.statSync(absoluteItemPath).isDirectory()235 },236 {237 folder: '.',238 recursive: true,239 method: (absoluteItemPath) => fs.statSync(absoluteItemPath).isFile()240 }241 ],242 exclude: [243 './test test.txt',244 './test/test'245 ]246 }247 });248 const result = instance.getItemsForRemoving(instance.beforeParams);249 expect(result.directories).to.have.members([]);250 expect(result.files).to.have.members([251 toAbsolute(['plugin_test', 'test.txt']),252 toAbsolute(['plugin_test', 'test.jpg']),253 toAbsolute(['plugin_test', 'test', 'test.txt']),254 toAbsolute(['plugin_test', 'test', 'test.png']),255 toAbsolute(['plugin_test', 'test', 'test', 'test.bin'])256 ]);257 });258 it('should handle test â 2 with folders, files and exclude', function () {259 const instance = new Plugin({260 before: {261 root: 'plugin_test',262 allowRootAndOutside: false,263 include: [],264 test: [265 {266 folder: '.',267 recursive: true,268 method: (absoluteItemPath) => fs.statSync(absoluteItemPath).isDirectory()269 },270 {271 folder: '.',272 recursive: true,273 method: (absoluteItemPath) => fs.statSync(absoluteItemPath).isFile()274 }275 ],276 exclude: [277 './test test.txt',278 './test'279 ]280 }281 });282 const result = instance.getItemsForRemoving(instance.beforeParams);283 expect(result.directories).to.have.members([284 toAbsolute(['plugin_test', 'test', 'test'])285 ]);286 expect(result.files).to.have.members([287 toAbsolute(['plugin_test', 'test.txt']),288 toAbsolute(['plugin_test', 'test.jpg']),289 toAbsolute(['plugin_test', 'test', 'test.txt']),290 toAbsolute(['plugin_test', 'test', 'test.png'])291 ]);292 });293 });294 });...
UriTest.ts
Source:UriTest.ts
...21 LegacyUnit.equal(uri.source, '//www.site.com/dir1/file?query#hash');22 LegacyUnit.equal(uri.getURI(), '//www.site.com/dir1/file?query#hash');23 LegacyUnit.equal(uri.toRelative('//www.site.com/dir1/file2'), 'file2');24 LegacyUnit.equal(uri.toRelative('//www.site2.com/dir1/file2'), '//www.site2.com/dir1/file2');25 LegacyUnit.equal(uri.toAbsolute('../file2'), '//www.site.com/dir1/file2');26 LegacyUnit.equal(uri.toAbsolute('//www.site2.com/dir1/file2'), '//www.site2.com/dir1/file2');27 });28 suite.test('parseFullURLs', function () {29 LegacyUnit.equal(new URI('http://abc:123@www.site.com:8080/path/dir/file.ext?key1=val1&key2=val2#hash').getURI(), 'http://abc:123@www.site.com:8080/path/dir/file.ext?key1=val1&key2=val2#hash');30 ok(new URI('http://a2bc:123@www.site.com:8080/path/dir/file.ext?key1=val1&key2=val2#hash').getURI() !== 'http://abc:123@www.site.com:8080/path/dir/file.ext?key1=val1&key2=val2#hash');31 LegacyUnit.equal(new URI('chrome-extension://abcdefghijklmnopqrstuvwzyz1234567890:8080/path/dir/file.ext?key1=val1&key2=val2#hash').getURI(), 'chrome-extension://abcdefghijklmnopqrstuvwzyz1234567890:8080/path/dir/file.ext?key1=val1&key2=val2#hash');32 });33 suite.test('relativeURLs', function () {34 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/file.html').toRelative('http://www.site.com/dir1/dir3/file.html'), '../dir3/file.html');35 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/file.html').toRelative('http://www.site.com/dir3/dir4/file.html'), '../../dir3/dir4/file.html');36 LegacyUnit.equal(new URI('http://www.site.com/dir1/').toRelative('http://www.site.com/dir1/dir3/file.htm'), 'dir3/file.htm');37 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toRelative('http://www.site2.com/dir1/dir3/file.htm'), 'http://www.site2.com/dir1/dir3/file.htm');38 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toRelative('http://www.site.com:8080/dir1/dir3/file.htm'), 'http://www.site.com:8080/dir1/dir3/file.htm');39 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toRelative('https://www.site.com/dir1/dir3/file.htm'), 'https://www.site.com/dir1/dir3/file.htm');40 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toRelative('/file.htm'), '../../file.htm');41 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toRelative('/file.htm?id=1#a'), '../../file.htm?id=1#a');42 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toRelative('mailto:test@test.com'), 'mailto:test@test.com');43 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toRelative('news:test'), 'news:test');44 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toRelative('javascript:void(0);'), 'javascript:void(0);');45 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toRelative('about:blank'), 'about:blank');46 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toRelative('#test'), '#test');47 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toRelative('test.htm'), 'test.htm');48 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toRelative('http://www.site.com/dir1/dir2/test.htm'), 'test.htm');49 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toRelative('dir2/test.htm'), 'dir2/test.htm');50 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toRelative('../dir2/test.htm'), 'test.htm');51 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toRelative('../dir3/'), '../dir3/');52 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toRelative('../../../../../../test.htm'), '../../test.htm');53 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toRelative('//www.site.com/test.htm'), '../../test.htm');54 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toRelative('@@tinymce'), '@@tinymce'); // Zope 3 URL55 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toRelative('../@@tinymce'), '../@@tinymce'); // Zope 3 URL56 LegacyUnit.equal(new URI('http://www.site.com/').toRelative('dir2/test.htm'), 'dir2/test.htm');57 LegacyUnit.equal(new URI('http://www.site.com/').toRelative('./'), './');58 LegacyUnit.equal(new URI('http://www.site.com/test/').toRelative('../'), '../');59 LegacyUnit.equal(new URI('http://www.site.com/test/test/').toRelative('../'), '../');60 LegacyUnit.equal(new URI('chrome-extension://abcdefghijklmnopqrstuvwzyz1234567890/dir1/dir2/').toRelative('/dir1'), '../');61 LegacyUnit.equal(new URI('http://www.site.com/').toRelative('http://www.site.com/'), 'http://www.site.com/');62 LegacyUnit.equal(new URI('http://www.site.com/').toRelative('http://www.site.com'), 'http://www.site.com/');63 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toRelative('/file.htm?q=http://site.com/'), '../../file.htm?q=http://site.com/');64 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toRelative('/file.htm#http://site.com/'), '../../file.htm#http://site.com/');65 });66 suite.test('absoluteURLs', function () {67 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toAbsolute(''), 'http://www.site.com/dir1/dir2/');68 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toAbsolute('../dir3'), 'http://www.site.com/dir1/dir3');69 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toAbsolute('../dir3', true), '/dir1/dir3');70 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toAbsolute('../../../../dir3'), 'http://www.site.com/dir3');71 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toAbsolute('../abc/def/../../abc/../dir3/file.htm'), 'http://www.site.com/dir1/dir3/file.htm');72 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toAbsolute('http://www.site.com/dir2/dir3'), 'http://www.site.com/dir2/dir3');73 LegacyUnit.equal(new URI('http://www.site2.com/dir1/dir2/').toAbsolute('http://www.site2.com/dir2/dir3'), 'http://www.site2.com/dir2/dir3');74 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toAbsolute('mailto:test@test.com'), 'mailto:test@test.com');75 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toAbsolute('news:test'), 'news:test');76 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toAbsolute('javascript:void(0);'), 'javascript:void(0);');77 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toAbsolute('about:blank'), 'about:blank');78 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toAbsolute('#test'), '#test');79 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toAbsolute('test.htm'), 'http://www.site.com/dir1/dir2/test.htm');80 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toAbsolute('../@@tinymce'), 'http://www.site.com/dir1/@@tinymce'); // Zope 3 URL81 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').getURI(), 'http://www.site.com/dir1/dir2/');82 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toAbsolute('/dir1/dir1/'), 'http://www.site.com/dir1/dir1/');83 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toAbsolute('https://www.site.com/dir1/dir2/', true), 'https://www.site.com/dir1/dir2/');84 LegacyUnit.equal(new URI('http://www.site.com/dir1/dir2/').toAbsolute('http://www.site.com/dir1/dir2/', true), '/dir1/dir2/');85 LegacyUnit.equal(new URI('chrome-extension://abcdefghijklmnopqrstuvwzyz1234567890/dir1/dir2/').toAbsolute('chrome-extension://abcdefghijklmnopqrstuvwzyz1234567890/dir1/dir2/', true), '/dir1/dir2/');86 });87 suite.test('strangeURLs', function () {88 LegacyUnit.equal(new URI('//www.site.com').getURI(), '//www.site.com');89 LegacyUnit.equal(new URI('mailto:test@test.com').getURI(), 'mailto:test@test.com');90 LegacyUnit.equal(new URI('news:somegroup').getURI(), 'news:somegroup');91 LegacyUnit.equal(new URI('skype:somegroup').getURI(), 'skype:somegroup');92 LegacyUnit.equal(new URI('tel:somegroup').getURI(), 'tel:somegroup');93 LegacyUnit.equal(new URI('//www.site.com/a@b').getURI(), '//www.site.com/a@b');94 });95 suite.test('isSameOrigin', function () {96 ok(new URI('http://www.site.com').isSameOrigin(new URI('http://www.site.com')));97 ok(new URI('//www.site.com').isSameOrigin(new URI('//www.site.com')));98 ok(new URI('http://www.site.com:80').isSameOrigin(new URI('http://www.site.com')));99 ok(new URI('https://www.site.com:443').isSameOrigin(new URI('https://www.site.com')));...
url_test.js
Source:url_test.js
...43 */44function testToAbsolute() {45 var toAbsolute = bite.common.net.url.toAbsolute;46 // Valid tests.47 assertEquals('1', 'http://a/b', toAbsolute('b', 'http://a'));48 assertEquals('2', 'http://a/b', toAbsolute('a/b', 'http://'));49 assertEquals('3', 'http://a/b/', toAbsolute('', 'http://a/b'));50 // Test valid slash concatenation.51 assertEquals('4', 'http://a/b', toAbsolute('b', 'http://a'));52 assertEquals('5', 'http://a/b', toAbsolute('/b', 'http://a'));53 assertEquals('6', 'http://a/b', toAbsolute('b', 'http://a/'));54 assertEquals('7', 'http://a/b', toAbsolute('/b', 'http://a/'));55 // Test optional scheme.56 assertEquals('8', 'other://a/b', toAbsolute('b', 'other://a', 'other'));57 // Invalid tests.58 assertEquals('9', '', toAbsolute('b', 'other://a'));59 assertEquals('10', '', toAbsolute('b', ''));60 assertEquals('11', '', toAbsolute('b', 'text'));61}62/**63 * Tests that isAbsolute correctly matches urls with the appropriate scheme and64 * the optional scheme.65 */66function testIsAbsolute() {67 // Valid tests.68 assertTrue('1', bite.common.net.url.isAbsolute('http://a/'));69 assertTrue('2', bite.common.net.url.isAbsolute('https://a/'));70 assertTrue('3', bite.common.net.url.isAbsolute('ftp://a/'));71 assertTrue('4', bite.common.net.url.isAbsolute('file:///'));72 assertTrue('5', bite.common.net.url.isAbsolute('other://a/', 'other'));73 // Invalid tests.74 // Invalid due to space before http....
Using AI Code Generation
1var path = require('path');2var backstopjs = require('backstopjs');3var backstopConfig = require('./backstop.json');4var backstopReferencePath = backstopConfig.paths.bitmaps_reference;5var backstopTestPath = backstopConfig.paths.bitmaps_test;6var backstopConfigPath = backstopConfig.paths.config;7var backstopEnginePath = backstopConfig.paths.engine_scripts;8var backstopScenarios = backstopConfig.scenarios;9var backstopScenarioPaths = backstopScenarios.map(function(scenario) {10 return scenario.url;11});12var backstopScenarioLabels = backstopScenarios.map(function(scenario) {13 return scenario.label;14});15var backstopScenarioSelectors = backstopScenarios.map(function(scenario) {16 return scenario.selectors;17});18var backstopScenarioReferencePaths = backstopScenarioLabels.map(function(label) {19 return path.join(backstopReferencePath, label);20});21var backstopScenarioTestPaths = backstopScenarioLabels.map(function(label) {22 return path.join(backstopTestPath, label);23});24var backstopScenarioConfigPaths = backstopScenarioLabels.map(function(label) {25 return path.join(backstopConfigPath, label);26});27var backstopScenarioEnginePaths = backstopScenarioLabels.map(function(label) {28 return path.join(backstopEnginePath, label);29});30var backstopScenarioReferencePaths = backstopScenarioLabels.map(function(label) {31 return path.join(backstopReferencePath, label);32});33var backstopScenarioTestPaths = backstopScenarioLabels.map(function(label) {34 return path.join(backstopTestPath, label);35});36var backstopScenarioConfigPaths = backstopScenarioLabels.map(function(label) {37 return path.join(backstopConfigPath, label);38});39var backstopScenarioEnginePaths = backstopScenarioLabels.map(function(label) {40 return path.join(backstopEnginePath, label);41});42var backstopScenarioReferencePaths = backstopScenarioLabels.map(function(label) {43 return path.join(backstopReferencePath, label);44});45var backstopScenarioTestPaths = backstopScenarioLabels.map(function(label) {46 return path.join(backstopTestPath, label);47});48var backstopScenarioConfigPaths = backstopScenarioLabels.map(function(label) {49 return path.join(backstopConfigPath, label);50});51var backstopScenarioEnginePaths = backstopScenarioLabels.map(function(label) {52 return path.join(backstopEnginePath, label);53});
Using AI Code Generation
1var backstopjs = require('backstopjs');2var path = require('path');3var fs = require('fs');4var config = require('./backstop.json');5config.scenarios = config.scenarios.map(function (scenario) {6 scenario.url = backstopjs.util.toAbsoluteUrl(scenario.url, config);7 return scenario;8});9fs.writeFileSync('backstop.json', JSON.stringify(config, null, 2));10backstopjs('test', {config: path.resolve(__dirname, 'backstop.json')});11{12 {13 },14 {15 },16 {17 }18 {19 }20 "paths": {21 },22}
Using AI Code Generation
1var backstopjs = require('backstopjs');2var config = require('./backstop.json');3var path = require('path');4var absolutePath = backstopjs.util.toAbsolute(config.scenarios[0].referenceUrl);5console.log(absolutePath);6var backstopjs = require('backstopjs');7var config = require('./backstop.json');8var path = require('path');9var absolutePath = backstopjs.util.toAbsolute(config.scenarios[0].referenceUrl);10console.log(absolutePath);11var backstopjs = require('backstopjs');12var config = require('./backstop.json');13var path = require('path');14var absolutePath = backstopjs.util.toAbsolute(config.scenarios[0].referenceUrl);15console.log(absolutePath);
Using AI Code Generation
1var path = require('path');2var backstopPath = require('backstopjs').path;3var absolutePath = backstopPath.toAbsolute('path/to/file');4var path = require('path');5var backstopPath = require('backstopjs').path;6var relativePath = backstopPath.toRelative('/path/to/file');7BackstopJS is a node module. It is installed in your project directory. It can be used as a node module. This can be done by using require() method of node.js. To use backstopjs as a node module, you need to install it in your project directory. You can do this by running the following command:8var backstopjs = require('backstopjs');9BackstopJS is a node module. It is installed in your project directory. It can be used as a node module. This can be done by using require() method of node.js. To use backstopjs as a node module, you need to install it in your project directory. You can do this by running the following command: npm install backstopjs The
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!