How to use buildNode method in Playwright Internal

Best JavaScript code snippet using playwright-internal

ast.js

Source:ast.js Github

copy

Full Screen

...44 expect(argNode2).to.have.property('text', 'bar');45 expect(argNode2.location).to.eql({ min: 5, max: 8 });46 });47 it('should return a match all "is" function for whitespace', function () {48 const expected = nodeTypes.function.buildNode('is', '*', '*');49 const actual = fromLegacyKueryExpressionNoMeta(' ');50 expect(actual).to.eql(expected);51 });52 it('should return an "and" function for single literals', function () {53 const expected = nodeTypes.function.buildNode('and', [nodeTypes.literal.buildNode('foo')]);54 const actual = fromLegacyKueryExpressionNoMeta('foo');55 expect(actual).to.eql(expected);56 });57 it('should ignore extraneous whitespace at the beginning and end of the query', function () {58 const expected = nodeTypes.function.buildNode('and', [nodeTypes.literal.buildNode('foo')]);59 const actual = fromLegacyKueryExpressionNoMeta(' foo ');60 expect(actual).to.eql(expected);61 });62 it('literals and queries separated by whitespace should be joined by an implicit "and"', function () {63 const expected = nodeTypes.function.buildNode('and', [64 nodeTypes.literal.buildNode('foo'),65 nodeTypes.literal.buildNode('bar'),66 ]);67 const actual = fromLegacyKueryExpressionNoMeta('foo bar');68 expect(actual).to.eql(expected);69 });70 it('should also support explicit "and"s as a binary operator', function () {71 const expected = nodeTypes.function.buildNode('and', [72 nodeTypes.literal.buildNode('foo'),73 nodeTypes.literal.buildNode('bar'),74 ]);75 const actual = fromLegacyKueryExpressionNoMeta('foo and bar');76 expect(actual).to.eql(expected);77 });78 it('should also support "and" as a function', function () {79 const expected = nodeTypes.function.buildNode('and', [80 nodeTypes.literal.buildNode('foo'),81 nodeTypes.literal.buildNode('bar'),82 ], 'function');83 const actual = fromLegacyKueryExpressionNoMeta('and(foo, bar)');84 expect(actual).to.eql(expected);85 });86 it('should support "or" as a binary operator', function () {87 const expected = nodeTypes.function.buildNode('or', [88 nodeTypes.literal.buildNode('foo'),89 nodeTypes.literal.buildNode('bar'),90 ]);91 const actual = fromLegacyKueryExpressionNoMeta('foo or bar');92 expect(actual).to.eql(expected);93 });94 it('should support "or" as a function', function () {95 const expected = nodeTypes.function.buildNode('or', [96 nodeTypes.literal.buildNode('foo'),97 nodeTypes.literal.buildNode('bar'),98 ]);99 const actual = fromLegacyKueryExpressionNoMeta('or(foo, bar)');100 expect(actual).to.eql(expected);101 });102 it('should support negation of queries with a "!" prefix', function () {103 const expected = nodeTypes.function.buildNode('not',104 nodeTypes.function.buildNode('or', [105 nodeTypes.literal.buildNode('foo'),106 nodeTypes.literal.buildNode('bar'),107 ]));108 const actual = fromLegacyKueryExpressionNoMeta('!or(foo, bar)');109 expect(actual).to.eql(expected);110 });111 it('"and" should have a higher precedence than "or"', function () {112 const expected = nodeTypes.function.buildNode('or', [113 nodeTypes.literal.buildNode('foo'),114 nodeTypes.function.buildNode('or', [115 nodeTypes.function.buildNode('and', [116 nodeTypes.literal.buildNode('bar'),117 nodeTypes.literal.buildNode('baz'),118 ]),119 nodeTypes.literal.buildNode('qux'),120 ])121 ]);122 const actual = fromLegacyKueryExpressionNoMeta('foo or bar and baz or qux');123 expect(actual).to.eql(expected);124 });125 it('should support grouping to override default precedence', function () {126 const expected = nodeTypes.function.buildNode('and', [127 nodeTypes.function.buildNode('or', [128 nodeTypes.literal.buildNode('foo'),129 nodeTypes.literal.buildNode('bar'),130 ]),131 nodeTypes.literal.buildNode('baz'),132 ]);133 const actual = fromLegacyKueryExpressionNoMeta('(foo or bar) and baz');134 expect(actual).to.eql(expected);135 });136 it('should support a shorthand operator syntax for "is" functions', function () {137 const expected = nodeTypes.function.buildNode('is', 'foo', 'bar', true);138 const actual = fromLegacyKueryExpressionNoMeta('foo:bar');139 expect(actual).to.eql(expected);140 });141 it('should support a shorthand operator syntax for inclusive "range" functions', function () {142 const argumentNodes = [143 nodeTypes.literal.buildNode('bytes'),144 nodeTypes.literal.buildNode(1000),145 nodeTypes.literal.buildNode(8000),146 ];147 const expected = nodeTypes.function.buildNodeWithArgumentNodes('range', argumentNodes);148 const actual = fromLegacyKueryExpressionNoMeta('bytes:[1000 to 8000]');149 expect(actual).to.eql(expected);150 });151 it('should support functions with named arguments', function () {152 const expected = nodeTypes.function.buildNode('range', 'bytes', { gt: 1000, lt: 8000 });153 const actual = fromLegacyKueryExpressionNoMeta('range(bytes, gt=1000, lt=8000)');154 expect(actual).to.eql(expected);155 });156 it('should throw an error for unknown functions', function () {157 expect(ast.fromLegacyKueryExpression).withArgs('foo(bar)').to.throwException(/Unknown function "foo"/);158 });159 });160 describe('fromKueryExpression', function () {161 it('should return a match all "is" function for whitespace', function () {162 const expected = nodeTypes.function.buildNode('is', '*', '*');163 const actual = ast.fromKueryExpression(' ');164 expect(actual).to.eql(expected);165 });166 it('should return an "is" function with a null field for single literals', function () {167 const expected = nodeTypes.function.buildNode('is', null, 'foo');168 const actual = ast.fromKueryExpression('foo');169 expect(actual).to.eql(expected);170 });171 it('should ignore extraneous whitespace at the beginning and end of the query', function () {172 const expected = nodeTypes.function.buildNode('is', null, 'foo');173 const actual = ast.fromKueryExpression(' foo ');174 expect(actual).to.eql(expected);175 });176 it('should not split on whitespace', function () {177 const expected = nodeTypes.function.buildNode('is', null, 'foo bar');178 const actual = ast.fromKueryExpression('foo bar');179 expect(actual).to.eql(expected);180 });181 it('should support "and" as a binary operator', function () {182 const expected = nodeTypes.function.buildNode('and', [183 nodeTypes.function.buildNode('is', null, 'foo'),184 nodeTypes.function.buildNode('is', null, 'bar'),185 ]);186 const actual = ast.fromKueryExpression('foo and bar');187 expect(actual).to.eql(expected);188 });189 it('should support "or" as a binary operator', function () {190 const expected = nodeTypes.function.buildNode('or', [191 nodeTypes.function.buildNode('is', null, 'foo'),192 nodeTypes.function.buildNode('is', null, 'bar'),193 ]);194 const actual = ast.fromKueryExpression('foo or bar');195 expect(actual).to.eql(expected);196 });197 it('should support negation of queries with a "not" prefix', function () {198 const expected = nodeTypes.function.buildNode('not',199 nodeTypes.function.buildNode('or', [200 nodeTypes.function.buildNode('is', null, 'foo'),201 nodeTypes.function.buildNode('is', null, 'bar'),202 ])203 );204 const actual = ast.fromKueryExpression('not (foo or bar)');205 expect(actual).to.eql(expected);206 });207 it('"and" should have a higher precedence than "or"', function () {208 const expected = nodeTypes.function.buildNode('or', [209 nodeTypes.function.buildNode('is', null, 'foo'),210 nodeTypes.function.buildNode('or', [211 nodeTypes.function.buildNode('and', [212 nodeTypes.function.buildNode('is', null, 'bar'),213 nodeTypes.function.buildNode('is', null, 'baz'),214 ]),215 nodeTypes.function.buildNode('is', null, 'qux'),216 ])217 ]);218 const actual = ast.fromKueryExpression('foo or bar and baz or qux');219 expect(actual).to.eql(expected);220 });221 it('should support grouping to override default precedence', function () {222 const expected = nodeTypes.function.buildNode('and', [223 nodeTypes.function.buildNode('or', [224 nodeTypes.function.buildNode('is', null, 'foo'),225 nodeTypes.function.buildNode('is', null, 'bar'),226 ]),227 nodeTypes.function.buildNode('is', null, 'baz'),228 ]);229 const actual = ast.fromKueryExpression('(foo or bar) and baz');230 expect(actual).to.eql(expected);231 });232 it('should support matching against specific fields', function () {233 const expected = nodeTypes.function.buildNode('is', 'foo', 'bar');234 const actual = ast.fromKueryExpression('foo:bar');235 expect(actual).to.eql(expected);236 });237 it('should also not split on whitespace when matching specific fields', function () {238 const expected = nodeTypes.function.buildNode('is', 'foo', 'bar baz');239 const actual = ast.fromKueryExpression('foo:bar baz');240 expect(actual).to.eql(expected);241 });242 it('should treat quoted values as phrases', function () {243 const expected = nodeTypes.function.buildNode('is', 'foo', 'bar baz', true);244 const actual = ast.fromKueryExpression('foo:"bar baz"');245 expect(actual).to.eql(expected);246 });247 it('should support a shorthand for matching multiple values against a single field', function () {248 const expected = nodeTypes.function.buildNode('or', [249 nodeTypes.function.buildNode('is', 'foo', 'bar'),250 nodeTypes.function.buildNode('is', 'foo', 'baz'),251 ]);252 const actual = ast.fromKueryExpression('foo:(bar or baz)');253 expect(actual).to.eql(expected);254 });255 it('should support "and" and "not" operators and grouping in the shorthand as well', function () {256 const expected = nodeTypes.function.buildNode('and', [257 nodeTypes.function.buildNode('or', [258 nodeTypes.function.buildNode('is', 'foo', 'bar'),259 nodeTypes.function.buildNode('is', 'foo', 'baz'),260 ]),261 nodeTypes.function.buildNode('not',262 nodeTypes.function.buildNode('is', 'foo', 'qux')263 ),264 ]);265 const actual = ast.fromKueryExpression('foo:((bar or baz) and not qux)');266 expect(actual).to.eql(expected);267 });268 it('should support exclusive range operators', function () {269 const expected = nodeTypes.function.buildNode('and', [270 nodeTypes.function.buildNode('range', 'bytes', {271 gt: 1000,272 }),273 nodeTypes.function.buildNode('range', 'bytes', {274 lt: 8000,275 }),276 ]);277 const actual = ast.fromKueryExpression('bytes > 1000 and bytes < 8000');278 expect(actual).to.eql(expected);279 });280 it('should support inclusive range operators', function () {281 const expected = nodeTypes.function.buildNode('and', [282 nodeTypes.function.buildNode('range', 'bytes', {283 gte: 1000,284 }),285 nodeTypes.function.buildNode('range', 'bytes', {286 lte: 8000,287 }),288 ]);289 const actual = ast.fromKueryExpression('bytes >= 1000 and bytes <= 8000');290 expect(actual).to.eql(expected);291 });292 it('should support wildcards in field names', function () {293 const expected = nodeTypes.function.buildNode('is', 'machine*', 'osx');294 const actual = ast.fromKueryExpression('machine*:osx');295 expect(actual).to.eql(expected);296 });297 it('should support wildcards in values', function () {298 const expected = nodeTypes.function.buildNode('is', 'foo', 'ba*');299 const actual = ast.fromKueryExpression('foo:ba*');300 expect(actual).to.eql(expected);301 });302 it('should create an exists "is" query when a field is given and "*" is the value', function () {303 const expected = nodeTypes.function.buildNode('is', 'foo', '*');304 const actual = ast.fromKueryExpression('foo:*');305 expect(actual).to.eql(expected);306 });307 });308 describe('fromLiteralExpression', function () {309 it('should create literal nodes for unquoted values with correct primitive types', function () {310 const stringLiteral = nodeTypes.literal.buildNode('foo');311 const booleanFalseLiteral = nodeTypes.literal.buildNode(false);312 const booleanTrueLiteral = nodeTypes.literal.buildNode(true);313 const numberLiteral = nodeTypes.literal.buildNode(42);314 expect(ast.fromLiteralExpression('foo')).to.eql(stringLiteral);315 expect(ast.fromLiteralExpression('true')).to.eql(booleanTrueLiteral);316 expect(ast.fromLiteralExpression('false')).to.eql(booleanFalseLiteral);317 expect(ast.fromLiteralExpression('42')).to.eql(numberLiteral);318 });319 it('should allow escaping of special characters with a backslash', function () {320 const expected = nodeTypes.literal.buildNode('\\():<>"*');321 // yo dawg322 const actual = ast.fromLiteralExpression('\\\\\\(\\)\\:\\<\\>\\"\\*');323 expect(actual).to.eql(expected);324 });325 it('should support double quoted strings that do not need escapes except for quotes', function () {326 const expected = nodeTypes.literal.buildNode('\\():<>"*');327 const actual = ast.fromLiteralExpression('"\\():<>\\"*"');328 expect(actual).to.eql(expected);329 });330 it('should support escaped backslashes inside quoted strings', function () {331 const expected = nodeTypes.literal.buildNode('\\');332 const actual = ast.fromLiteralExpression('"\\\\"');333 expect(actual).to.eql(expected);334 });335 it('should detect wildcards and build wildcard AST nodes', function () {336 const expected = nodeTypes.wildcard.buildNode('foo*bar');337 const actual = ast.fromLiteralExpression('foo*bar');338 expect(actual).to.eql(expected);339 });340 });341 describe('toElasticsearchQuery', function () {342 it('should return the given node type\'s ES query representation', function () {343 const node = nodeTypes.function.buildNode('exists', 'response');344 const expected = nodeTypes.function.toElasticsearchQuery(node, indexPattern);345 const result = ast.toElasticsearchQuery(node, indexPattern);346 expect(result).to.eql(expected);347 });348 it('should return an empty "and" function for undefined nodes and unknown node types', function () {349 const expected = nodeTypes.function.toElasticsearchQuery(nodeTypes.function.buildNode('and', []));350 expect(ast.toElasticsearchQuery()).to.eql(expected);351 const noTypeNode = nodeTypes.function.buildNode('exists', 'foo');352 delete noTypeNode.type;353 expect(ast.toElasticsearchQuery(noTypeNode)).to.eql(expected);354 const unknownTypeNode = nodeTypes.function.buildNode('exists', 'foo');355 unknownTypeNode.type = 'notValid';356 expect(ast.toElasticsearchQuery(unknownTypeNode)).to.eql(expected);357 });358 });359 describe('doesKueryExpressionHaveLuceneSyntaxError', function () {360 it('should return true for Lucene ranges', function () {361 const result = ast.doesKueryExpressionHaveLuceneSyntaxError('bar: [1 TO 10]');362 expect(result).to.eql(true);363 });364 it('should return false for KQL ranges', function () {365 const result = ast.doesKueryExpressionHaveLuceneSyntaxError('bar < 1');366 expect(result).to.eql(false);367 });368 it('should return true for Lucene exists', function () {...

Full Screen

Full Screen

datepickr.js

Source:datepickr.js Github

copy

Full Screen

...185 element.detachEvent('on' + eventType, callback);186 }187 }188 189 function buildNode(nodeName, attributes, content) {190 var element;191 192 if(!(nodeName in buildCache)) {193 buildCache[nodeName] = document.createElement(nodeName);194 }195 196 element = buildCache[nodeName].cloneNode(false);197 198 if(attributes != null) {199 for(var attribute in attributes) {200 element[attribute] = attributes[attribute];201 }202 }203 204 if(content != null) {205 if(typeof(content) == 'object') {206 element.appendChild(content);207 } else {208 element.innerHTML = content;209 }210 }211 212 return element;213 }214 215 function monthToStr(date, full, months) {216 return ((full == true) ? months[date] : ((months[date].length > 3) ? months[date].substring(0, 3) : months[date]));217 }218 219 function isToday(day, currentMonthView, currentYearView) {220 return day == date.current.day() && currentMonthView == date.current.month.integer() && currentYearView == date.current.year();221 }222 223 function buildWeekdays(weekdays) {224 var weekdayHtml = document.createDocumentFragment();225 foreach(weekdays, function(weekday) {226 weekdayHtml.appendChild(buildNode('th', {}, weekday.substring(0, 2)));227 });228 return weekdayHtml;229 }230 231 function rebuildCalendar() {232 while(this.calendarBody.hasChildNodes()){233 this.calendarBody.removeChild(this.calendarBody.lastChild);234 }235 236 var firstOfMonth = new Date(this.currentYearView, this.currentMonthView, 1).getDay(),237 numDays = date.month.numDays(this.currentMonthView, this.currentYearView);238 239 this.currentMonth.innerHTML = date.month.string(this.config.fullCurrentMonth, this.currentMonthView, this.config.months) + ' ' + this.currentYearView;240 this.calendarBody.appendChild(buildDays(firstOfMonth, numDays, this.currentMonthView, this.currentYearView));241 }242 243 function buildCurrentMonth(config, currentMonthView, currentYearView, months) {244 return buildNode('span', { className: 'current-month' }, date.month.string(config.fullCurrentMonth, currentMonthView, months) + ' ' + currentYearView);245 }246 247 function buildMonths(config, currentMonthView, currentYearView) {248 var months = buildNode('div', { className: 'months' }),249 prevMonth = buildNode('span', { className: 'prev-month' }, buildNode('span', { className: 'prevMonth' }, '&lt;')),250 nextMonth = buildNode('span', { className: 'next-month' }, buildNode('span', { className: 'nextMonth' }, '&gt;'));251 252 months.appendChild(prevMonth);253 months.appendChild(nextMonth);254 255 return months;256 }257 258 function buildDays(firstOfMonth, numDays, currentMonthView, currentYearView) {259 var calendarBody = document.createDocumentFragment(),260 row = buildNode('tr'),261 dayCount = 0, i;262 263 /* print out previous month's "days" */264 for(i = 1; i <= firstOfMonth; i++) {265 row.appendChild(buildNode('td', null, '&nbsp;'));266 dayCount++;267 }268 269 for(i = 1; i <= numDays; i++) {270 /* if we have reached the end of a week, wrap to the next line */271 if(dayCount == 7) {272 calendarBody.appendChild(row);273 row = buildNode('tr');274 dayCount = 0;275 }276 277 var todayClassName = isToday(i, currentMonthView, currentYearView) ? { className: 'today' } : null;278 row.appendChild(buildNode('td', todayClassName, buildNode('span', { className: 'day' }, i)));279 280 dayCount++;281 }282 283 /* if we haven't finished at the end of the week, start writing out the "days" for the next month */284 for(i = 1; i <= (7 - dayCount); i++) {285 row.appendChild(buildNode('td', null, '&nbsp;'));286 }287 288 calendarBody.appendChild(row);289 290 return calendarBody;291 }292 293 function buildCalendar() {294 var firstOfMonth = new Date(this.currentYearView, this.currentMonthView, 1).getDay(),295 numDays = date.month.numDays(this.currentMonthView, this.currentYearView),296 self = this;297 298 var inputLeft = inputTop = 0,299 obj = this.element;300 301 if(obj.offsetParent) {302 do {303 inputLeft += obj.offsetLeft;304 inputTop += obj.offsetTop;305 } while (obj = obj.offsetParent);306 }307 308 var calendarContainer = buildNode('div', { className: 'calendar' });309 calendarContainer.style.cssText = 'display: none; position: absolute; top: ' + (inputTop + this.element.offsetHeight) + 'px; left: ' + inputLeft + 'px; z-index: 100;';310 311 this.currentMonth = buildCurrentMonth(this.config, this.currentMonthView, this.currentYearView, this.config.months)312 var months = buildMonths(this.config, this.currentMonthView, this.currentYearView);313 months.appendChild(this.currentMonth);314 315 var calendar = buildNode('table', null, buildNode('thead', null, buildNode('tr', { className: 'weekdays' }, buildWeekdays(this.config.weekdays))));316 this.calendarBody = buildNode('tbody');317 this.calendarBody.appendChild(buildDays(firstOfMonth, numDays, this.currentMonthView, this.currentYearView));318 calendar.appendChild(this.calendarBody);319 320 calendarContainer.appendChild(months);321 calendarContainer.appendChild(calendar);322 323 document.body.appendChild(calendarContainer);324 325 addEvent(calendarContainer, 'click', function(e) { handlers.calendarClick.call(self, e); });326 327 return calendarContainer;328 }329 330 return function(elementId, userConfig) {...

Full Screen

Full Screen

im_send_message.js

Source:im_send_message.js Github

copy

Full Screen

...29 }else if(option.chatType == 'groupchat'){30 aMessage.setTo(option.toId + "@group.localhost");31 aMessage.setType("groupchat");32 if(option.atList){33 var atList = aMessage.buildNode("atList");34 for(var i = 0;i<option.atList.length;i++){35 atList.appendChild(aMessage.buildNode('at', option.atList[i]));36 }37 }3839 }40 aMessage.setBody(option.content);41 aMessage.setName(cmp.member.name);42 aMessage.appendNode(aMessage.buildNode('toname', option.toName));43 if(option.atList.length > 0){44 aMessage.appendNode(atList);45 }46 sendMsg(option.id,aMessage.xml(),null,option.errorFunc);47}4849/**50 * 系统消息51 * @param option 参数集52 * id 消息id53 * toId 指向id54 * toName 指向id的姓名55 * chatType 聊天类型 单人 群56 * content 内容57 * errorFunc 失败的回调方法58 * single dog single dog single all thd day~59 * <message from="2481121618130258326@localhost/mobile" to="2753297105921130843@localhost" type="chat">60 * <name>hd1</name>61 * <body>Ddgf</body>62 * <toname>hd2</toname>63 * </message>64 */65function chatForSysMessage(option) {66 var aMessage = newJSJaCMessage();67 var jid = cmp.member.id;68 aMessage.setFrom(jid + "@localhost/mobile");69 aMessage.setID(option.id);70 if(option.chatType == 'chat'){71 aMessage.setTo(option.toId + "@localhost");72 aMessage.setType("system");73 }else if(option.chatType == 'groupchat'){74 aMessage.setTo(option.toId + "@group.localhost");75 aMessage.setType("system");76 if(option.atList){77 var atList = aMessage.buildNode("atList");78 for(var i = 0;i<option.atList.length;i++){79 atList.appendChild(aMessage.buildNode('at', option.atList[i]));80 }81 }8283 }84 aMessage.setBody(option.content);85 aMessage.setName(cmp.member.name);86 aMessage.appendNode(aMessage.buildNode('toname', option.toName));87 if(option.atList){88 aMessage.appendNode(atList);89 }90 sendMsg(option.id,aMessage.xml(),null,option.errorFunc);91}9293/**94 * 发语音消息95 * @param toId96 * @param toName97 * @param chatType98 * @param fileName99 * @param recordTime100 * @param errorFunc101 * <message from="2481121618130258326@localhost/mobile" to="2753297105921130843@localhost" type="microtalk" id="microtalk_1">102 * <name>hd1</name>103 * <toname>hd2</toname>104 * <microtalk xmlns="microtalk">105 * <id>2351776293</id>106 * <size>3</size>107 * </microtalk>108 * </message>109 */110function chatForVoice(toId,toName,chatType,fileName,recordTime,id,errorFunc){111 var aMessage = newJSJaCMessage();112 var jId = cmp.member.id;113114 aMessage.setFrom(jId + "@localhost/mobile");115 aMessage.setID(id);116 if(chatType == 'chat'){117 aMessage.setTo(toId + "@localhost");118 }else if(chatType == 'groupchat'){119 aMessage.setTo(toId + "@group.localhost");120 }121 aMessage.setType("microtalk");122 aMessage.setName(cmp.member.name);123 aMessage.appendNode(aMessage.buildNode('toname', toName));124125 var microTalk = aMessage.buildNode('microtalk');126 microTalk.setAttribute("xmlns","microtalk");127 microTalk.appendChild(aMessage.buildNode('id', fileName));128 microTalk.appendChild(aMessage.buildNode('size', recordTime));129 aMessage.appendNode(microTalk);130 sendMsg(jId,aMessage.xml(),null,errorFunc);131}132/**133 * 发图片消息134 * @param toId135 * @param toName136 * @param chatType137 * @param fileId138 * @param fileName139 * @param errorFunc140 * <message from="2481121618130258326@localhost/mobile" to="2753297105921130843@localhost" type="image" id="image_1">141 * <name>hd1</name>142 * <toname>hd2</toname>143 * <image xmlns="image">144 * <id>3241353559</id>145 * <id_thumbnail>3241353559_1</id_thumbnail>146 * <name>2016112414241364.png</name>147 * <size>60</size>148 * <hash>4f71215587711e98f5ec9fbd5cb434db</hash>149 * <date>2016-11-24T14:24:13.659000+08:00</date>150 * <desc/>151 * </image>152 * </message>153 */154function chatForImage(toId,toName,chatType,fileId,fileName,id,date,fileSize,errorFunc){155 var aMessage = newJSJaCMessage();156 var jId = cmp.member.id;157158 aMessage.setFrom(jId + "@localhost/mobile");159 aMessage.setID(id);160 if(chatType == 'chat'){161 aMessage.setTo(toId + "@localhost");162 }else if(chatType == 'groupchat'){163 aMessage.setTo(toId + "@group.localhost");164 }165 aMessage.setType("image");166 aMessage.setName(cmp.member.name);167 aMessage.appendNode(aMessage.buildNode('toname', toName));168169 var image = aMessage.buildNode('image');170 image.setAttribute("xmlns","image");171 image.appendChild(aMessage.buildNode('id', fileId));172 image.appendChild(aMessage.buildNode('id_thumbnail', fileId + "_1"));173 image.appendChild(aMessage.buildNode('name', fileName));174 image.appendChild(aMessage.buildNode('size',fileSize));175 image.appendChild(aMessage.buildNode('desc'));176 image.appendChild(aMessage.buildNode('date', date));177 aMessage.appendNode(image);178 sendMsg(jId,aMessage.xml(),null,errorFunc);179}180/**181 * 发附件消息182 * @param toId183 * @param toName184 * @param chatType185 * @param fileId186 * @param fileName187 * @param errorFunc188 * <message from="2481121618130258326@localhost/mobile" to="2753297105921130843@localhost" type="filetrans" id="filetrans_1">189 * <name>hd1</name>190 * <toname>hd2</toname>191 * <filetrans xmlns="filetrans">192 * <id>3823263968</id>193 * <name>表单.txt</name>194 * <size>1</size>195 * <hash/>196 * <date>2016-11-24T14:51:35.081000+08:00</date>197 * <desc/>198 * </filetrans>199 * </message>200 */201function chatForFile(toId,toName,chatType,fileId,fileName,fileSize,id,errorFunc){202 var aMessage = newJSJaCMessage();203 var jId = cmp.member.id;204205 aMessage.setFrom(jId + "@localhost/mobile");206 aMessage.setID(id);207 if(chatType == 'chat'){208 aMessage.setTo(toId + "@localhost");209 }else if(chatType == 'groupchat'){210 aMessage.setTo(toId + "@group.localhost");211 }212 aMessage.setType("filetrans");213 aMessage.setName(cmp.member.name);214 aMessage.appendNode(aMessage.buildNode('toname', toName));215216 var file = aMessage.buildNode('filetrans');217 file.setAttribute("xmlns","filetrans");218 file.appendChild(aMessage.buildNode('id', fileId));219 file.appendChild(aMessage.buildNode('name', fileName));220 file.appendChild(aMessage.buildNode('size',fileSize));221 file.appendChild(aMessage.buildNode('desc'));222 aMessage.appendNode(file);223 sendMsg(jId,aMessage.xml(),null,errorFunc);224}225/**226 * 撤消消息227 * @param id228 * @param msgId229 * @param jId230 * @param name231 * @param toId232 * @param toName233 * @param successFunc234 * @param errorFunc235 * <message type='cancel_chat' id=’123456’ from=”1234@localhost” to=”1234@localhost”>236 * <to>111@localhost</to> //真实接收者237 * <msgid></msgid> //被撤回的消息id238 * <name></name>239 * <toname></toname>240 * </message>241 */242function cancelChat(id,msgId,toId,toName,successFunc,errorFunc){243 var aMessage = newJSJaCMessage();244 var jId = cmp.member.id;245246 aMessage.setFrom(jId + "@localhost/mobile");247 aMessage.setID(id);248 aMessage.setTo(jId + "@localhost");249 aMessage.setType("cancel_chat");250 aMessage.setName(cmp.member.name);251 aMessage.appendNode(aMessage.buildNode('msgid', msgId));252 aMessage.appendNode(aMessage.buildNode('to', toId + "@localhost"));253 aMessage.appendNode(aMessage.buildNode('toname', toName));254255 sendMsg(id,aMessage.xml(),successFunc,errorFunc);256}257 ...

Full Screen

Full Screen

not.js

Source:not.js Github

copy

Full Screen

...5import StubbedLogstashIndexPatternProvider from 'fixtures/stubbed_logstash_index_pattern';6import ngMock from 'ng_mock';7import { expectDeepEqual } from '../../../../../test_utils/expect_deep_equal';8let indexPattern;9const childNode = nodeTypes.function.buildNode('is', 'response', 200);10describe('kuery functions', function () {11 describe('not', function () {12 beforeEach(ngMock.module('kibana'));13 beforeEach(ngMock.inject(function (Private) {14 indexPattern = Private(StubbedLogstashIndexPatternProvider);15 }));16 describe('buildNodeParams', function () {17 it('should return "arguments" and "serializeStyle" params', function () {18 const result = not.buildNodeParams(childNode);19 expect(result).to.only.have.keys('arguments', 'serializeStyle');20 });21 it('arguments should contain the unmodified child node', function () {22 const { arguments: [ actualChild ] } = not.buildNodeParams(childNode);23 expect(actualChild).to.be(childNode);24 });25 it('serializeStyle should default to "operator"', function () {26 const { serializeStyle } = not.buildNodeParams(childNode);27 expect(serializeStyle).to.be('operator');28 });29 });30 describe('toElasticsearchQuery', function () {31 it('should wrap a subquery in an ES bool query\'s must_not clause', function () {32 const node = nodeTypes.function.buildNode('not', childNode);33 const result = not.toElasticsearchQuery(node, indexPattern);34 expect(result).to.only.have.keys('bool');35 expect(result.bool).to.only.have.keys('must_not');36 expect(result.bool.must_not).to.eql(ast.toElasticsearchQuery(childNode, indexPattern));37 });38 it('should wrap a literal argument with an "is" function targeting the default_field', function () {39 const literalFoo = nodeTypes.literal.buildNode('foo');40 const expectedChild = ast.toElasticsearchQuery(nodeTypes.function.buildNode('is', null, 'foo'), indexPattern);41 const node = nodeTypes.function.buildNode('not', literalFoo);42 const result = not.toElasticsearchQuery(node, indexPattern);43 const resultChild = result.bool.must_not;44 expectDeepEqual(resultChild, expectedChild);45 });46 });47 describe('toKueryExpression', function () {48 it('should serialize "not" nodes with an operator syntax', function () {49 const node = nodeTypes.function.buildNode('not', childNode, 'operator');50 const result = not.toKueryExpression(node);51 expect(result).to.be('!"response":200');52 });53 it('should wrap "and" and "or" sub-queries in parenthesis', function () {54 const andNode = nodeTypes.function.buildNode('and', [childNode, childNode], 'operator');55 const notAndNode = nodeTypes.function.buildNode('not', andNode, 'operator');56 expect(not.toKueryExpression(notAndNode)).to.be('!("response":200 and "response":200)');57 const orNode = nodeTypes.function.buildNode('or', [childNode, childNode], 'operator');58 const notOrNode = nodeTypes.function.buildNode('not', orNode, 'operator');59 expect(not.toKueryExpression(notOrNode)).to.be('!("response":200 or "response":200)');60 });61 it('should not wrap "and" and "or" sub-queries that use the function syntax', function () {62 const andNode = nodeTypes.function.buildNode('and', [childNode, childNode], 'function');63 const notAndNode = nodeTypes.function.buildNode('not', andNode, 'operator');64 expect(not.toKueryExpression(notAndNode)).to.be('!and("response":200, "response":200)');65 const orNode = nodeTypes.function.buildNode('or', [childNode, childNode], 'function');66 const notOrNode = nodeTypes.function.buildNode('not', orNode, 'operator');67 expect(not.toKueryExpression(notOrNode)).to.be('!or("response":200, "response":200)');68 });69 it('should throw an error for nodes with unknown or undefined serialize styles', function () {70 const node = nodeTypes.function.buildNode('not', childNode, 'notValid');71 expect(not.toKueryExpression)72 .withArgs(node).to.throwException(/Cannot serialize "not" function as "notValid"/);73 });74 });75 });...

Full Screen

Full Screen

mainToolsViewDemo.js

Source:mainToolsViewDemo.js Github

copy

Full Screen

...21function switchToVizMode() {22 config.userMode = "viz";23}24 function renderMainTools(){25 const left = buildNode(".left");26 left.appendChild(buildNode("h1","Filières du recyclage"));//"legend_title"));27 left.appendChild(buildNode("#loginButton.pictoButton.ghost"));28 left.appendChild(buildNode("#emailButton.pictoButton.ghost"));29 left.appendChild(buildNode("#faqButton.pictoButton.ghost"));30 left.appendChild(buildNode("#alertsButton.pictoButton.ghost"));31 const right = buildNode(".right");32 right.appendChild(buildNode("#visuButton.pictoButton.ghost"));33 right.appendChild(buildNode("#vizModeButton.pictoButton"));34 right.appendChild(buildNode("#editModeButton.pictoButton"));35 right.appendChild(buildNode("#diagramGenButton.pictoButton.ghost"));36 right.appendChild(buildNode("#printButton.pictoButton.ghost"));37 right.appendChild(buildNode("#exportData.pictoButton"));38 const search = buildNode("label#search.ghost");39 search.appendChild(buildNode(".decoSearch"));40 const searchField = buildNode("input","");41 searchField.type = "search";42 searchField.placeholder = "Rerchercher...";43 search.appendChild(searchField);44 right.appendChild(search);45 //right.appendChild(buildNode("#fakeLang.pictoButton.ghost"));46 anchorMainTools.innerHTML="";47 anchorMainTools.appendChild(left);48 anchorMainTools.appendChild(right);49 }50 return {51 init52 }...

Full Screen

Full Screen

createElement.test.js

Source:createElement.test.js Github

copy

Full Screen

...13 test('createElement will return {}', ()=> {14 expect(createElement('span')).toMatchObject({})15 })16 test('createElement(x) will return vnode ', ()=> {17 expect(createElement('span')).toMatchObject(buildNode('span', null, []))18 })19 test('with attribute', () => {20 expect(createElement('span', {key:12, className:'ss'})).toMatchObject(buildNode('span',{key:12, className:'ss'} ))21 })22 test('createElement with children ', ()=> {23 expect(createElement('span', null, 'a', 1,2, h('w'))).toMatchObject(buildNode('span', null, ['a'+'1'+'2', h('w')]))24 })25 test('createElement with seque string', () => {26 expect(createElement('span', null,'a', 'b')).toMatchObject(buildNode('span', null, ['ab']))27 })28 test('createElement should support element', () =>{29 expect(h('span', null, h('x'))).toMatchObject(buildNode('span',null, [buildNode('x')]))30 })31 test('createElemnt child could be number', () => {32 expect(h('x', null, 1)).toMatchObject(buildNode('x', null, ['1']))33 })34 test('createElement only attributes cotaine children but ', () => {35 expect(h('x', { children: [h('x')] })).toMatchObject(buildNode('x',{}, [h('x')]))36 })37 test('children was bool, chang it to null', () =>{38 expect(h('x',null, true, false )).toMatchObject(buildNode('x', null, ['']))39 })40 test('children was null chang it to ""', () =>{41 expect(h('x',null, null, undefined )).toMatchObject(buildNode('x', null, ['']))42 })43 test('node was function', () => {44 expect(h(()=>'a'))45 })...

Full Screen

Full Screen

solution.test.js

Source:solution.test.js Github

copy

Full Screen

...14 ]],15 ]],16 ]];17 const ast = parse(data);18 const expected = buildNode('html', {}, '', [19 buildNode('head', {}, '', [20 buildNode('title', {}, 'hello, hexlet!'),21 ]),22 buildNode('body', {}, '', [23 buildNode('h1', { class: 'header' }, 'html builder example'),24 buildNode('div', {}, '', [25 buildNode('span', {}, 'span text'),26 buildNode('hr'),27 ]),28 ]),29 ]);30 expect(ast).toEqual(expected);31 });32 it('#toString', () => {33 const data = ['html', [34 ['head', [35 ['title', 'hello, hexlet!'],36 ]],37 ['body', [38 ['div', { class: 'separator' }],39 ['h1', { class: 'header' }, 'html builder example'],40 ['div', [...

Full Screen

Full Screen

Using AI Code Generation

copy

Full Screen

1const { chromium } = require('playwright');2const fs = require('fs');3(async () => {4 const browser = await chromium.launch();5 const page = await browser.newPage();6 const html = await page.content();7 const dom = await page.evaluateHandle(() => document);8 const node = await dom.asElement().buildNode();9 fs.writeFileSync('test.html', html);10 fs.writeFileSync('test.json', JSON.stringify(node));11 await browser.close();12})();13{14 {15 "attributes": {16 },17 {18 {19 "attributes": {20 }21 },22 {23 {24 }25 }26 },27 {

Full Screen

Using AI Code Generation

copy

Full Screen

1const { buildNode } = require('playwright');2const { chromium } = require('playwright');3const { webkit } = require('playwright');4const { firefox } = require('playwright');5async function main() {6 const builder = await buildNode();7 const browser = await builder.buildChromium();8 const page = await browser.newPage();9 await page.screenshot({ path: 'example.png' });10 await browser.close();11}12main();13const builder = await buildNode();14const browser = await builder.buildChromium();15const page = await browser.newPage();16await page.screenshot({ path: 'example.png' });17await browser.close();18const builder = await buildNode();19const browser = await builder.buildChromium();20const page = await browser.newPage();21await page.screenshot({ path: 'example.png' });22await browser.close();23const builder = await buildNode();24const browser = await builder.buildChromium();25const page = await browser.newPage();26await page.screenshot({ path: 'example.png' });27await browser.close();28const builder = await buildNode();29const browser = await builder.buildChromium();30const page = await browser.newPage();31await page.screenshot({ path: 'example.png' });32await browser.close();33const builder = await buildNode();34const browser = await builder.buildChromium();35const page = await browser.newPage();36await page.screenshot({ path: 'example.png' });37await browser.close();38const builder = await buildNode();39const browser = await builder.buildChromium();40const page = await browser.newPage();41await page.screenshot({ path: 'example.png' });42await browser.close();

Full Screen

Using AI Code Generation

copy

Full Screen

1const { buildNode } = require('playwright-core/lib/server/dom.js');2const { parse } = require('playwright-core/lib/server/common/html.js');3const { ElementHandle } = require('playwright-core/lib/server/dom.js');4const html = `<div id="foo">Hello World</div>`;5const document = parse(html);6const node = document.getElementById('foo');7const elementHandle = new ElementHandle(buildNode(node), null, null, null);8console.log(elementHandle);9elementHandle.textContent().then(console.log);10const { chromium } = require('playwright-core');11(async () => {12 const browser = await chromium.launch();13 const context = await browser.newContext();14 const page = await context.newPage();15 const elementHandle = await page.$('div#foo');16 console.log(elementHandle);17 elementHandle.textContent().then(console.log);18 await browser.close();19})();

Full Screen

Using AI Code Generation

copy

Full Screen

1const { buildNode } = require('playwright-core/lib/server/dom');2const { jsdom } = require("jsdom");3const dom = new jsdom().window.document;4const node = buildNode(dom);5console.log(node);6const { buildNode } = require('playwright-core/lib/server/dom');7const { jsdom } = require("jsdom");8const dom = new jsdom().window.document;9const node = buildNode(dom);10console.log(node);11const { buildNode } = require('playwright-core/lib/server/dom');12const { jsdom } = require("jsdom");13const dom = new jsdom().window.document;14const node = buildNode(dom);15console.log(node);16const { buildNode } = require('playwright-core/lib/server/dom');17const { jsdom } = require("jsdom");18const dom = new jsdom().window.document;19const node = buildNode(dom);20console.log(node);21const { buildNode } = require('playwright-core/lib/server/dom');22const { jsdom } = require("jsdom");23const dom = new jsdom().window.document;24const node = buildNode(dom);25console.log(node);26const { buildNode } = require('playwright-core/lib/server/dom');27const { jsdom } = require("jsdom");28const dom = new jsdom().window.document;29const node = buildNode(dom);30console.log(node);31const { buildNode } = require('playwright-core/lib/server/dom');32const { jsdom } = require("jsdom");33const dom = new jsdom().window.document;34const node = buildNode(dom);35console.log(node);36const { buildNode } = require('playwright-core/lib/server/dom');37const { jsdom } = require("jsdom");38const dom = new jsdom().window.document;39const node = buildNode(dom);40console.log(node);41const { buildNode } = require('playwright-core/lib/server/dom');42const {

Full Screen

Using AI Code Generation

copy

Full Screen

1const { buildNode } = require('playwright-core/lib/server/dom.js');2const { parse } = require('playwright-core/lib/server/common/dom.js');3const { buildNode } = require('playwright-core/lib/server/dom.js');4const { parse } = require('playwright-core/lib/server/common/dom.js');5const html = '<div><span>hello</span><span>world</span></div>';6const parsedHtml = parse(html);7const dom = buildNode(parsedHtml);8console.log(dom.outerHTML);9const { buildNode } = require('playwright-core/lib/server/dom.js');10const { parse } = require('playwright-core/lib/server/common/dom.js');11const html = '<div><span>hello</span><span>world</span></div>';12const parsedHtml = parse(html);13const dom = buildNode(parsedHtml);14console.log(dom.outerHTML);15const { buildNode } = require('playwright-core/lib/server/dom.js');16const { parse } = require('playwright-core/lib/server/common/dom.js');17const html = '<div><span>hello</span><span>world</span></div>';18const parsedHtml = parse(html);19const dom = buildNode(parsedHtml);20console.log(dom.outerHTML);21const { buildNode } = require('playwright-core/lib/server/dom.js');22const { parse } = require('playwright-core/lib/server/common/dom.js');23const html = '<div><span>hello</span><span>world</span></div>';24const parsedHtml = parse(html);25const dom = buildNode(parsedHtml);26console.log(dom.outerHTML);27const { buildNode

Full Screen

Using AI Code Generation

copy

Full Screen

1const { buildNode } = require('playwright-core/lib/server/dom.js');2const { buildNode } = require('playwright/lib/server/dom.js');3const node = buildNode({4 attributes: {5 },6 { name: 'span', text: 'Hello' },7 { name: 'span', text: 'World' }8});9console.log(node.outerHTML);10import { buildNode } from 'playwright-core/lib/server/dom';11import { buildNode } from 'playwright/lib/server/dom';12const node = buildNode({13 attributes: {14 },15 { name: 'span', text: 'Hello' },16 { name: 'span', text: 'World' }17});18console.log(node.outerHTML);19const { buildNode } = require('playwright-core/lib/server/dom.js');20const { buildNode } = require('playwright/lib/server/dom.js');21const node = buildNode({22 attributes: {23 },24 { name: 'span', text: 'Hello' },25 { name: 'span', text: 'World' }26});27console.log(node.outerHTML);28import { buildNode } from 'playwright-core/lib/server/dom';29import { buildNode } from 'playwright/lib/server/dom';30const node = buildNode({31 attributes: {32 },33 { name: 'span', text: 'Hello' },

Full Screen

Using AI Code Generation

copy

Full Screen

1const { InternalApi } = require('playwright');2const { buildNode } = new InternalApi();3const node = buildNode('div');4const textNode = buildNode('text', 'Hello World');5node.appendChild(textNode);6console.log(node);

Full Screen

Using AI Code Generation

copy

Full Screen

1const { buildNode } = require('playwright-core/lib/server/dom.js');2const { createJSHandle } = require('playwright-core/lib/server/frames.js');3const { document: doc } = new JSDOM().window;4const node = buildNode(doc, {5 { name: 'id', value: 'hello' },6 { name: 'class', value: 'world' },7});8const handle = createJSHandle(doc.defaultView, node);9console.log(await handle.evaluate(node => node.outerHTML));10const { buildNode } = require('playwright-core/lib/server/dom.js');11const { createJSHandle } = require('playwright-core/lib/server/frames.js');12const { document: doc } = new JSDOM().window;13const node = buildNode(doc, {14 { name: 'id', value: 'hello' },15 { name: 'class', value: 'world' },16});17const handle = createJSHandle(doc.defaultView, node);18console.log(await handle.evaluate(node => node.outerHTML));19const { buildNode } = require('playwright-core/lib/server/dom.js');20const { createJSHandle } = require('playwright-core/lib/server/frames.js');21const { document: doc } = new JSDOM().window;22const node = buildNode(doc, {23 { name: 'id', value: 'hello' },24 { name: 'class', value: 'world' },25});26const handle = createJSHandle(doc.defaultView, node);27console.log(await handle.evaluate(node => node.outerHTML));28const { buildNode } = require('playwright-core/lib/server/dom.js');29const { createJSHandle } = require('play

Full Screen

Using AI Code Generation

copy

Full Screen

1const buildNode = require('playwright-core/lib/server/supplements/recorder/buildNode');2const element = document.querySelector('button');3const node = buildNode(element);4console.log(node);5{ nodeName: 'BUTTON',6 attributes: { type: 'submit', class: 'btn btn-primary' },7 text: 'Submit' }8const { chromium } = require('playwright');9const buildNode = require('playwright-core/lib/server/supplements/recorder/buildNode');10(async () => {11 const browser = await chromium.launch();12 const context = await browser.newContext();13 const page = await context.newPage();14 const element = await page.$('text=Get started');15 const node = buildNode(element);16 console.log(node);17 await browser.close();18})();19{ nodeName: 'A',20 attributes: { href: '/docs/intro' },21 text: 'Get started' }

Full Screen

Using AI Code Generation

copy

Full Screen

1const buildNode = require('playwright/lib/utils/buildNode').buildNode;2element.setAttribute('id', 'test-id');3element.setAttribute('class', 'test-class');4element.textContent = 'This is a test';5const { chromium } = require('playwright');6(async () => {7 const browser = await chromium.launch();8 const context = await browser.newContext();9 const page = await context.newPage();10 await page.setContent(element.outerHTML);11 await page.screenshot({ path: 'test.png' });12 await browser.close();13})();14Related Posts: How to test a Progressive Web App (PWA) using…15How to test a Progressive Web App (PWA) using…

Full Screen

Playwright tutorial

LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.

Chapters:

  1. What is Playwright : Playwright is comparatively new but has gained good popularity. Get to know some history of the Playwright with some interesting facts connected with it.
  2. How To Install Playwright : Learn in detail about what basic configuration and dependencies are required for installing Playwright and run a test. Get a step-by-step direction for installing the Playwright automation framework.
  3. Playwright Futuristic Features: Launched in 2020, Playwright gained huge popularity quickly because of some obliging features such as Playwright Test Generator and Inspector, Playwright Reporter, Playwright auto-waiting mechanism and etc. Read up on those features to master Playwright testing.
  4. What is Component Testing: Component testing in Playwright is a unique feature that allows a tester to test a single component of a web application without integrating them with other elements. Learn how to perform Component testing on the Playwright automation framework.
  5. Inputs And Buttons In Playwright: Every website has Input boxes and buttons; learn about testing inputs and buttons with different scenarios and examples.
  6. Functions and Selectors in Playwright: Learn how to launch the Chromium browser with Playwright. Also, gain a better understanding of some important functions like “BrowserContext,” which allows you to run multiple browser sessions, and “newPage” which interacts with a page.
  7. Handling Alerts and Dropdowns in Playwright : Playwright interact with different types of alerts and pop-ups, such as simple, confirmation, and prompt, and different types of dropdowns, such as single selector and multi-selector get your hands-on with handling alerts and dropdown in Playright testing.
  8. Playwright vs Puppeteer: Get to know about the difference between two testing frameworks and how they are different than one another, which browsers they support, and what features they provide.
  9. Run Playwright Tests on LambdaTest: Playwright testing with LambdaTest leverages test performance to the utmost. You can run multiple Playwright tests in Parallel with the LammbdaTest test cloud. Get a step-by-step guide to run your Playwright test on the LambdaTest platform.
  10. Playwright Python Tutorial: Playwright automation framework support all major languages such as Python, JavaScript, TypeScript, .NET and etc. However, there are various advantages to Python end-to-end testing with Playwright because of its versatile utility. Get the hang of Playwright python testing with this chapter.
  11. Playwright End To End Testing Tutorial: Get your hands on with Playwright end-to-end testing and learn to use some exciting features such as TraceViewer, Debugging, Networking, Component testing, Visual testing, and many more.
  12. Playwright Video Tutorial: Watch the video tutorials on Playwright testing from experts and get a consecutive in-depth explanation of Playwright automation testing.

Run Playwright Internal automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful