Best JavaScript code snippet using playwright-internal
FormValidator.1.0.min.js
Source: FormValidator.1.0.min.js
1function hasClass(ele, cls) { return ele.className.match(new RegExp("(\\s|^)" + cls + "(\\s|$)")) }2function addClass(ele, cls) { if (!this.hasClass(ele, cls)) { ele.className += " " + cls } }3function removeClass(ele, cls) { if (hasClass(ele, cls)) { var reg = new RegExp("(\\s|^)" + cls + "(\\s|$)"); ele.className = ele.className.replace(reg, " ") } }4var reInt = /^\s*[+-]?\d+\s*$/;//æ´æ°ç±»å5var reUInt = /^\s*[+]?\d+\s*$/;//æ£æ´æ°ç±»å6var DataType = {7 Int16: { Name: "Int16", MaxValue: 32767, MinValue: -32768, CheckRange: function (val) { return ((isFinite(val)) && (reInt.test(val)) && (this.MaxValue >= val) && (this.MinValue <= val)) } },8 Int32: { Name: "Int32", MaxValue: 2147483647, MinValue: -2147483648, CheckRange: function (val) { return ((isFinite(val)) && (reInt.test(val)) && (this.MaxValue >= val) && (this.MinValue <= val)) } },9 Int64: { Name: "Int64", MaxValue: 9223372036854776000, MinValue: -9223372036854776000, CheckRange: function (val) { return ((isFinite(val)) && (reInt.test(val)) && (this.MaxValue >= val) && (this.MinValue <= val)) } },10 Float: { Name: "Float", MaxValue: 3.402823e+38, MinValue: -3.402823e+38, CheckRange: function (val) { return ((isFinite(val)) && (this.MaxValue >= val) && (this.MinValue <= val)) } },11 Double: { Name: "Double", MaxValue: 1.79e+308, MinValue: -1.79e+308, CheckRange: function (val) { return ((isFinite(val)) && (this.MaxValue >= val) && (this.MinValue <= val)) } },12 UInt16: { Name: "UInt16", MaxValue: 65535, MinValue: 1, CheckRange: function (val) { return ((isFinite(val)) && (reUInt.test(val)) && (this.MaxValue >= val) && (this.MinValue <= val)) } },13 UInt32: { Name: "UInt32", MaxValue: 4294967295, MinValue: 1, CheckRange: function (val) { return ((isFinite(val)) && (reUInt.test(val)) && (this.MaxValue >= val) && (this.MinValue <= val)) } },14 UInt64: { Name: "UInt64", MaxValue: 18446744073709552000, MinValue: 1, CheckRange: function (val) { return ((isFinite(val)) && (reUInt.test(val)) && (this.MaxValue >= val) && (this.MinValue <= val)) } },15 UFloat: { Name: "UFloat", MaxValue: 3.402823E+38, MinValue: 0, CheckRange: function (val) { return ((isFinite(val)) && (this.MaxValue >= val) && (this.MinValue <= val)); } },16 UDouble: { Name: "Double", MaxValue: 1.79e+308, MinValue: 0, CheckRange: function (val) { return ((isFinite(val)) && (this.MaxValue >= val) && (this.MinValue <= val)) } },17 DateTime: { Name: "DateTime", MaxValue: new Date(9999, 12, 31, 23, 59, 59), MinValue: new Date(1, 1, 1, 0, 0, 0), CheckRange: function (val) { var temp = Date.parse(val); return ((!isNaN(temp)) && (this.MaxValue >= temp) && (this.MinValue <= temp)) } },18 String: { Name: "String", IsNullOrEmpty: function (val) { return ((val == null) || (val == "")) }, IsNullOrWhiteSpace: function (val) { return (val == null) || /^\s*$/.test(val) }, Trim: function (val) { if (val != null) { return val.replace(/(^\s*)|(\s*$)/g, "") } return val } }19};20//è·åæè¿ç¶ç±»èç¹21function GetClosestElement(obj, tagName) {22 if (DataType.String.IsNullOrWhiteSpace(tagName)) {23 throw "tagName ä¸è½ä¸ºç©º!"24 }25 tagName = tagName.toUpperCase();26 var node = obj.parentNode;27 while (node != null) {28 if ((node == null) || (node.tagName == tagName)) {29 break;30 }31 node = node.parentNode;32 }33 return node;34}35//è·ååèç¹ï¼æ ¹æ®nameå±æ§åtagNameæ ç¾ç±»åï¼36function GetElementsByNameAndTagName(container, name, tagName) {37 var lst = new Array();38 var eles = container.getElementsByTagName(tagName);39 for (var i = 0; i < eles.length; i++) {40 if (eles[i].name == name) {41 lst.push(eles[i]);42 }43 }44 return lst;45}46// è·åé¿åº¦47function GetLength(obj) {48 var length = 0;49 switch (obj.type) {50 case "checkbox":51 case "radio":52 var form = GetClosestElement(obj, "FORM");53 var nodes = null;54 if (form != null) {55 nodes = GetElementsByNameAndTagName(form, obj.name, obj.tagName);56 }57 else {58 nodes = document.getElementsByName(obj.name);59 }60 if ((nodes != null) && (nodes.length > 0)) {61 for (var i = 0; i < nodes.length; i++) {62 if (nodes[i].checked) {63 length++;64 }65 }66 }67 break;68 case "select-one":69 case "select-multiple":70 for (var i = 0; i < obj.options.length; i++) {71 if (obj.options[i].selected) {72 length++;73 }74 }75 break;76 default:77 length = obj.value.length;78 break;79 }80 return length;81};82//表åéªè¯cssç±»83var ValidateCssClass = {84 Succeed: "validate-succeed",85 Error: "validate-error",86 Info: "validate-info"87};88//表åéªè¯å±æ§89var ValidateProperties = {90 CanEmpty: "fv-empty", //fv-empty="false",表示ä¸è½ä¸ºç©º91 DataType: "fv-datatype",// æ°æ®ç±»å92 Custom: "fv-custom",//èªå®ä¹éªè¯å½æ°93 Format: "fv-format",//æ ¼å¼å94 MaxValue: "fv-maxvalue",//æ大å¼95 MinValue: "fv-minvalue",//æå°å¼96 MaxLength: "fv-maxlength",//æé¿é¿åº¦97 MinLength: "fv-minlength",//å¼æå°é¿åº¦98 Ajax: "fv-ajax",//ajaxéªè¯99 CompareTo: "fv-compareto",//æ¯è¾éªè¯å±æ§æ ¼å¼ï¼fv-compareto=">,id1,id2,id3" >为表达å¼ï¼å¯éç表达å¼æï¼> < >= <= != =(大äºï¼å°äºï¼å¤§äºçäºï¼å°äºçäºï¼ä¸çäºï¼çäº)100 MsgPanel: "fv-msgpanel",//æ¶æ¯æ¾ç¤ºæ§ä»¶çid101 MsgInfo: "fv-msg-info",//ç¨äºæ¾ç¤ºé»è®¤æ¶æ¯ï¼ä¸ºmsgpaneléæææ¬)102 MsgSuccess: "fv-msg-success",//éªè¯æåæ¶æ¯ï¼å¦æä¸å¡«åï¼å°éç¨é»è®¤éææ¶æ¯æ¾ç¤ºï¼åmsgpanelå
容ï¼103 MsgError: "fv-msg-error",//éªè¯å¤±è´¥é»è®¤é误æ¶æ¯104 Validate: "fv-validate"//ç¨äºformå
ç´ ä¸ï¼fv-validate="true"表示æ¤è¡¨ååä¸éªè¯105}106//å±æ§æ ¼å¼ä¸ºï¼å±æ§å="å±æ§å¼|é误æ示信æ¯" å±æ§åä¿¡æ¯ï¼ç¨|éå¼107function ValidateConfig(val, msg) {108 this.Message = msg;109 this.Value = val;110}111//éªè¯è¡¨å112function FormValidator(form) {113 this.Body = form;114}115//åå§å表åéªè¯116FormValidator.prototype.Init = function () {117 var salf = this;118 //æ¦æªformæ交äºä»¶ï¼å¯è½åºç°éå¤ä¸¤æ¬¡éªè¯ã119 //å 为form.submit()æ¹æ³ï¼ä¸ä¼è§¦åonsubmitäºä»¶ã120 //èinput type="submit"ä¼è§¦åå
é¨submitæ¹æ³ï¼å¹¶ç´æ¥æ交ãé¤éå¨onsubmitä¸ï¼è¿åfalseã121 //æ
æ¤ä¼æ交两次éªè¯ãå¯ä»¥éè¿ä»£ç æ è®°å®ç°ï¼ä¿è¯éªè¯ä¸æ¬¡ãä½æ¯éº»ç¦ãæå欢代ç ç®åç¹ã两次éªè¯ä¸ä»ä¹å½±åã 122 var onsubmit = salf.Body.onsubmit;123 if (onsubmit == null) {124 salf.Body.onsubmit = function () { return salf.Validate(); };125 }126 else {127 salf.Body.onsubmit = function () { return salf.Validate() && onsubmit(); };128 }129 //*130 if ((typeof (salf.Body.submit) == 'function' || (!salf.Body.submit.tagName && !salf.Body.submit.length))) {131 salf.Body.originalSubmit = salf.Body.submit;132 salf.Body.submit = function () {133 if (salf.Validate()) {134 salf.Body.originalSubmit();135 }136 }137 }138 //*/139 var inputItems = salf.Body.getElementsByTagName("input");140 var selectItems = salf.Body.getElementsByTagName("select");141 var textareaItems = salf.Body.getElementsByTagName("textarea");142 if ((inputItems != null) && (inputItems.length > 0)) {143 for (var i = 0; i < inputItems.length; i++) {144 if ((inputItems[i].type != "submit") && (inputItems[i].type != "button") && (inputItems[i].type != "reset")) {145 (new ElementValidator(inputItems[i])).Init();146 }147 }148 }149 if ((selectItems != null) && (selectItems.length > 0)) {150 for (var i = 0; i < selectItems.length; i++) {151 (new ElementValidator(selectItems[i])).Init();152 }153 }154 if ((textareaItems != null) && (textareaItems.length > 0)) {155 for (var i = 0; i < textareaItems.length; i++) {156 (new ElementValidator(textareaItems[i])).Init();157 }158 }159}160//æ¾ç¤ºå±æ§ä¿¡æ¯,å¦æmsgä¸ä¸ºç©ºï¼æ¾ç¤ºmsgï¼å¦æmsg为空ï¼æ¾ç¤ºæ»çmsgï¼å¦ææ»çmsg为空ï¼æ¾ç¤ºé¢å®ä¹msg161FormValidator.prototype.ShowMessage = function (msg, className) {162 var msgPenelId = this.Body.getAttribute(ValidateProperties.MsgPanel);163 var msgpanel = null;164 if (!DataType.String.IsNullOrWhiteSpace(msgPenelId)) {165 msgpanel = document.getElementById(msgPenelId);166 }167 if (msgpanel != null) {168 if (msgpanel.getAttribute(ValidateProperties.MsgInfo) == null) {169 //ä¿åé»è®¤æ¶æ¯ï¼ç¨äºéªè¯å,没æ设置éªè¯å¤±è´¥æ¶æ¯ï¼ä¹æ²¡æ设置fv-messageçæ
åµã170 msgpanel.setAttribute(ValidateProperties.MsgInfo, msgpanel.innerHTML);171 }172 if (DataType.String.IsNullOrWhiteSpace(msg)) {173 msg = msgpanel.getAttribute(ValidateProperties.MsgInfo);174 }175 msgpanel.innerHTML = msg;176 msgpanel.className = className;177 if (DataType.String.IsNullOrWhiteSpace(msg)) {178 msgpanel.style.visibility = "hidden";179 }180 else {181 msgpanel.style.visibility = "visible";182 }183 }184 else {185 if (!DataType.String.IsNullOrWhiteSpace(msg)) {186 alert(msg);187 }188 }189};190//设置éªè¯ç¶æ191FormValidator.prototype.SetValidateStatus = function (validateResult) {192 var className = null;193 if (validateResult == true) {194 removeClass(this.Body, ValidateCssClass.Error);195 removeClass(this.Body, ValidateCssClass.Info);196 className = ValidateCssClass.Succeed;197 msg = this.Body.getAttribute(ValidateProperties.MsgSuccess);198 }199 else if (validateResult == false) {200 removeClass(this.Body, ValidateCssClass.Succeed);201 removeClass(this.Body, ValidateCssClass.Info);202 className = ValidateCssClass.Error;203 msg = this.Body.getAttribute(ValidateProperties.MsgError);204 }205 else {206 removeClass(this.Body, ValidateCssClass.Succeed);207 removeClass(this.Body, ValidateCssClass.Error);208 className = ValidateCssClass.Info;209 msg = null;210 }211 addClass(this.Body, className);212 this.ShowMessage(msg, className);213};214//éªè¯å½æ°215//htmlå±æ§ fv-validate="true"216FormValidator.prototype.Validate = function () {217 var inputItems = this.Body.getElementsByTagName("input");218 var selectItems = this.Body.getElementsByTagName("select");219 var textareaItems = this.Body.getElementsByTagName("textarea");220 var chk = true;221 if ((inputItems != null) && (inputItems.length > 0)) {222 for (var i = 0; i < inputItems.length; i++) {223 if ((inputItems[i].type != "submit") && (inputItems[i].type != "button") && (inputItems[i].type != "reset")) {224 chk = (new ElementValidator(inputItems[i])).Validate() && chk;225 }226 }227 }228 if ((selectItems != null) && (selectItems.length > 0)) {229 for (var i = 0; i < selectItems.length; i++) {230 chk = (new ElementValidator(selectItems[i])).Validate() && chk;231 }232 }233 if ((textareaItems != null) && (textareaItems.length > 0)) {234 for (var i = 0; i < textareaItems.length; i++) {235 chk = (new ElementValidator(textareaItems[i])).Validate() && chk;236 }237 }238 this.SetValidateStatus(chk);239 return chk;240};241//éªè¯æ§ä»¶ï¼ä¸è¬ä¸ºï¼input(text, radio, checkbox),select, textarea242function ElementValidator(element) {243 this.Body = element;244}245ElementValidator.prototype.Init = function () {246 var salf = this;247 salf.Body.onblur = function () {248 salf.Validate();249 }250}251//éªè¯å½æ°252//htmlå±æ§ FV-Validate="true"253ElementValidator.prototype.Validate = function () {254 return this.CheckEmpty() && this.CheckAjax() && this.CheckDataType() && this.CheckFormat() && this.CheckMaxLength() && this.CheckMinLength() && this.CheckMaxValue() && this.CheckMinValue() && this.CheckCompareTo() && this.CheckCustom();255};256//éªè¯å¼æ¯å¦ä¸ºç©º257//htmlå±æ§ FV-Empty="false"258ElementValidator.prototype.CheckEmpty = function () {259 var chk = true;260 var config = this.GetValidateConfig(ValidateProperties.CanEmpty);261 if ((config != null) && (config.Value == "false")) {262 chk = !DataType.String.IsNullOrWhiteSpace(this.Body.value)263 this.SetValidateStatus(chk, config.Message);264 }265 return chk;266};267//éªè¯æ ¼å¼å268//htmlå±æ§ FV-Format="æ£å表达å¼"269ElementValidator.prototype.CheckFormat = function () {270 var chk = true;271 if (!DataType.String.IsNullOrEmpty(this.Body.value)) {272 var config = this.GetValidateConfig(ValidateProperties.Format);273 if (config != null) {274 chk = (new RegExp(config.Value)).test(this.Body.value);275 this.SetValidateStatus(chk, config.Message);276 }277 }278 else {279 this.SetValidateStatus(null, null);280 }281 return chk;282}283//éªè¯æå°é¿åº¦284//htmlå±æ§ FV-MinLength="false"285ElementValidator.prototype.CheckMinLength = function () {286 var chk = true;287 if (!DataType.String.IsNullOrEmpty(this.Body.value)) {288 var config = this.GetValidateConfig(ValidateProperties.MinLength);289 if (config != null) {290 chk = GetLength(this.Body) >= parseInt(config.Value);291 this.SetValidateStatus(chk, config.Message);292 }293 }294 else {295 this.SetValidateStatus(null, null);296 }297 return chk;298};299//éªè¯æ大é¿åº¦300ElementValidator.prototype.CheckMaxLength = function () {301 var chk = true;302 if (!DataType.String.IsNullOrEmpty(this.Body.value)) {303 var config = this.GetValidateConfig(ValidateProperties.MaxLength);304 if (config != null) {305 chk = GetLength(this.Body) <= parseInt(config.Value);306 this.SetValidateStatus(chk, config.Message);307 }308 }309 else {310 this.SetValidateStatus(null, null);311 }312 return chk;313};314//éªè¯æ°æ®ç±»å315ElementValidator.prototype.CheckDataType = function () {316 var chk = true;317 if (!DataType.String.IsNullOrEmpty(this.Body.value)) {318 var config = this.GetValidateConfig(ValidateProperties.DataType);319 if (config != null) {320 var type = config.Value;321 if (type == DataType.String.Name) {322 chk = true;323 }324 else if (DataType.hasOwnProperty(type)) {325 chk = DataType[type].CheckRange(this.Body.value);326 }327 else {328 alert("data type not define:" + type);329 throw "dta type not define!";330 }331 this.SetValidateStatus(chk, config.Message);332 }333 }334 else {335 this.SetValidateStatus(null, null);336 }337 return chk;338}339//éªè¯æå°å¼340ElementValidator.prototype.CheckMinValue = function () {341 var chk = true;342 if (!DataType.String.IsNullOrEmpty(this.Body.value)) {343 var config = this.GetValidateConfig(ValidateProperties.MinValue);344 if (config != null) {345 if (isFinite(config.Value)) {346 var num1 = parseFloat(config.Value);347 var num2 = parseFloat(this.Body.value);348 chk = (num2 >= num1);349 }350 else {351 chk = (this.Body.value <= config.Value);352 }353 this.SetValidateStatus(chk, config.Message);354 }355 }356 else {357 this.SetValidateStatus(null, null);358 }359 return chk;360};361//éªè¯æ大å¼362ElementValidator.prototype.CheckMaxValue = function () {363 var chk = true;364 if (!DataType.String.IsNullOrEmpty(this.Body.value)) {365 var config = this.GetValidateConfig(ValidateProperties.MaxValue);366 if (config != null) {367 if (isFinite(config.Value)) {368 var num1 = parseFloat(config.Value);369 var num2 = parseFloat(this.Body.value);370 chk = (num2 <= num1);371 }372 else {373 chk = (this.Body.value <= config.Value);374 }375 this.SetValidateStatus(chk, config.Message);376 }377 }378 else {379 this.SetValidateStatus(null, null);380 }381 return chk;382};383// è¿åå¼ï¼-1 0 1ï¼ è¡¨ç¤ºå°äºï¼çäºï¼å¤§äº384// -1ï¼ val1 < val2385// 0, val1 == val2386// 1, val1 > val2387function Compare(val1, val2) {388 var retval = 0;389 if ((val1 == null) && (val2 == null)) {390 retval = 0391 }392 else {393 if (val1 == null) {394 retval = -1;395 }396 else if (val2 == null) {397 retval = 1;398 }399 else {400 if (DataType.String.IsNullOrWhiteSpace(val1) || DataType.String.IsNullOrWhiteSpace(val2)) {401 val1 = val1.toString();402 val2 = val2.toString();403 }404 else {405 if ((!isNaN(val1)) && (!isNaN(val2))) {406 val1 = parseFloat(val1);407 val2 = parseFloat(val2);408 }409 }410 if (val1 == val2) {411 retval = 0;412 }413 else if (val1 < val2) {414 retval = -1;415 }416 else {417 retval = 1;418 }419 }420 }421 return retval;422}423//éªè¯æ¯è¾,æ¯è¾éªè¯å±æ§æ ¼å¼ï¼fv-compareto=">,id1,id2,id3"424ElementValidator.prototype.CheckCompareTo = function () {425 var chk = true;426 var config = this.GetValidateConfig(ValidateProperties.CompareTo);427 if (config != null) {428 var arr = config.Value.split("|");429 for (var j = 0; j < arr.length; j++) {430 var ids = arr[j].split(",");431 if ((ids != null) && (ids.length > 1)) {432 var op = DataType.String.Trim(ids[0]);433 switch (op) {434 case "==":435 for (var i = 1; i < ids.length; i++) {436 chk = chk && (Compare(this.Body.value, document.getElementById(ids[i]).value) == 0);437 if (!chk) {438 break;439 }440 }441 break;442 case ">":443 for (var i = 1; i < ids.length; i++) {444 chk = chk && (Compare(this.Body.value, document.getElementById(ids[i]).value) == 1);445 if (!chk) {446 break;447 }448 }449 break;450 case "<":451 for (var i = 1; i < ids.length; i++) {452 chk = chk && (Compare(this.Body.value, document.getElementById(ids[i]).value) == -1);453 if (!chk) {454 break;455 }456 }457 break;458 case ">=":459 for (var i = 1; i < ids.length; i++) {460 chk = chk && (Compare(this.Body.value, document.getElementById(ids[i]).value) >= 0);461 if (!chk) {462 break;463 }464 }465 break;466 case "<=":467 for (var i = 1; i < ids.length; i++) {468 chk = chk && (Compare(this.Body.value, document.getElementById(ids[i]).value) <= 0);469 if (!chk) {470 break;471 }472 }473 break;474 case "!=":475 for (var i = 1; i < ids.length; i++) {476 chk = chk && (Compare(this.Body.value, document.getElementById(ids[i]).value) != 0);477 if (!chk) {478 break;479 }480 }481 break;482 default:483 throw "æ¯è¾è¡¨è¾¾å¼æ误ï¼"484 break;485 }486 }487 else {488 throw "æ¯è¾æ§ä»¶å¼éªè¯è®¾ç½®ï¼è³å°éè¦æ·»å ä¸ä¸ªå¾
æ¯è¾æ§ä»¶çidï¼å¤ä¸ªidç¨éå·(,)éå¼ã";489 }490 if (!chk) {491 this.SetValidateStatus(chk, config.Message);492 return false;493 }494 }495 this.SetValidateStatus(chk, config.Message);496 }497 return chk;498};499//éªè¯Ajax500ElementValidator.prototype.CheckAjax = function () {501 //设置çå¾
ajaxéªè¯502 //å½æ交è¦ç»æ表åéªè¯çæ¶åï¼æ¥çæ¤ç¶æãå¦ææ¤ç¶æè¿æ¯penddingç¶æï¼åçå¾
503 return true;504}505//éªè¯èªå®ä¹å½æ°506ElementValidator.prototype.CheckCustom = function () {507 var chk = true;508 var config = this.GetValidateConfig(ValidateProperties.Custom);509 if (config != null) {510 chk = eval(config.Value + "()");511 this.SetValidateStatus(chk, config.Message);512 }513 return chk;514};515//è·åéªè¯å±æ§é
ç½®516ElementValidator.prototype.GetValidateConfig = function (propertyName) {517 var val = this.Body.getAttribute(propertyName);518 if (DataType.String.IsNullOrWhiteSpace(val)) {519 return null;520 }521 else {522 return new ValidateConfig(val, this.Body.getAttribute(propertyName + "-msg"));523 }524}525//æ¾ç¤ºå±æ§ä¿¡æ¯,å¦æmsgä¸ä¸ºç©ºï¼æ¾ç¤ºmsgï¼å¦æmsg为空ï¼æ¾ç¤ºæ»çmsgï¼å¦ææ»çmsg为空ï¼æ¾ç¤ºé¢å®ä¹msg526ElementValidator.prototype.ShowMessage = function (msg, className) {527 var msgPanelId = this.Body.getAttribute(ValidateProperties.MsgPanel);528 if (msgPanelId != null) {529 var msgpanel = document.getElementById(msgPanelId);530 if (msgpanel != null) {531 if (msgpanel.getAttribute(ValidateProperties.MsgInfo) == null) {532 //ä¿åé»è®¤æ¶æ¯ï¼ç¨äºéªè¯å,没æ设置éªè¯å¤±è´¥æ¶æ¯ï¼ä¹æ²¡æ设置fv-messageçæ
åµã533 msgpanel.setAttribute(ValidateProperties.MsgInfo, msgpanel.innerHTML);534 }535 if (DataType.String.IsNullOrWhiteSpace(msg)) {536 msg = msgpanel.getAttribute(ValidateProperties.MsgInfo);537 }538 msgpanel.innerHTML = msg;539 msgpanel.className = className;540 if (DataType.String.IsNullOrWhiteSpace(msg)) {541 msgpanel.style.visibility = "hidden";542 }543 else {544 msgpanel.style.visibility = "visible";545 }546 }547 }548};549//设置éªè¯ç¶æ550ElementValidator.prototype.SetValidateStatus = function (validateResult, msg) {551 var className = null;552 if (validateResult == true) {553 removeClass(this.Body, ValidateCssClass.Error);554 removeClass(this.Body, ValidateCssClass.Info);555 className = ValidateCssClass.Succeed;556 msg = this.Body.getAttribute(ValidateProperties.MsgSuccess);557 }558 else if (validateResult == false) {559 removeClass(this.Body, ValidateCssClass.Succeed);560 removeClass(this.Body, ValidateCssClass.Info);561 className = ValidateCssClass.Error;562 if (DataType.String.IsNullOrEmpty(msg)) {563 msg = this.Body.getAttribute(ValidateProperties.MsgError);564 }565 }566 else {567 removeClass(this.Body, ValidateCssClass.Succeed);568 removeClass(this.Body, ValidateCssClass.Error);569 className = ValidateCssClass.Info;570 msg = null;571 }572 addClass(this.Body, className);573 this.ShowMessage(msg, className);574};575function FormValidateInit() {576 var forms = document.getElementsByTagName("FORM");577 for (var i = 0; i < forms.length; i++) {578 if (forms[i].getAttribute(ValidateProperties.Validate) == "true") {579 new FormValidator(forms[i]).Init();580 }581 }582}583//以ä¸ä»£ç ï¼æ¥èªç½ç»copyæ¥ç¨çã584// å¦ææ¯æ W3C DOM2, åä½¿ç¨ W3C æ¹æ³ 585if (document.addEventListener) {586 document.addEventListener("DOMContentLoaded", FormValidateInit, false);587}588else if (/MSIE/i.test(navigator.userAgent)) {// å¦ææ¯ IE æµè§å¨589 // å建ä¸ä¸ª script æ ç¾, 该æ ç¾æ defer å±æ§, å½ document å è½½å®æ¯æ¶æä¼è¢«è½½å
¥ 590 document.write('<script id="__ie_onloadfix" defer src="javascript:void(0)"></script>');591 var script = document.getElementById("__ie_onloadfix");592 // å¦ææ档确å®è£
è½½å®æ¯, è°ç¨åå§åæ¹æ³ 593 script.onreadystatechange = function () {594 if (this.readyState == 'complete') {595 FormValidateInit();596 }597 }598 // å¦ææ¯ Safari æµè§å¨ 599}600else if (/WebKit/i.test(navigator.userAgent)) {601 // å建å®æ¶å¨, æ¯ 0.1 ç§æ£éªä¸æ¬¡, å¦æææ¡£è£
è½½å®æ¯åè°ç¨åå§åæ¹æ³ 602 var _timer = setInterval(function () {603 if (/loaded|complete/.test(document.readyState)) {604 clearInterval(_timer);605 FormValidateInit();606 }607 }, 100);608}609else {610 // å¦æ以ä¸çä¸æ¯, 使ç¨æåçæ¹æ³ (æ¬ä¾ä¸, Opera 7 å°ä¼è·å°è¿éæ¥) 611 window.onload = function (e) {612 FormValidateInit();613 }...
actions.js
Source: actions.js
1import TYPE from './type';2import SelectorBuilder from '../../client-functions/selectors/selector-builder';3import ClientFunctionBuilder from '../../client-functions/client-function-builder';4import functionBuilderSymbol from '../../client-functions/builder-symbol';5import { ActionCommandBase, CommandBase } from './base';6import {7 ActionOptions,8 ClickOptions,9 MouseOptions,10 TypeOptions,11 PressOptions,12 DragToElementOptions,13 OffsetOptions,14 CookieOptions,15} from './options';16import { initSelector, initUploadSelector } from './validations/initializers';17import { executeJsExpression } from '../execute-js-expression';18import { isJSExpression } from './utils';19import {20 actionOptions,21 integerArgument,22 positiveIntegerArgument,23 stringArgument,24 nonEmptyStringArgument,25 nullableStringArgument,26 urlArgument,27 stringOrStringArrayArgument,28 setSpeedArgument,29 actionRoleArgument,30 booleanArgument,31 functionArgument,32 cookiesArgument,33 setCookiesArgument,34 urlsArgument,35} from './validations/argument';36import { SetNativeDialogHandlerCodeWrongTypeError } from '../../errors/test-run';37import { ExecuteClientFunctionCommand } from './observation';38import { camelCase } from 'lodash';39// Initializers40function initActionOptions (name, val, initOptions, validate = true) {41 return new ActionOptions(val, validate);42}43function initClickOptions (name, val, initOptions, validate = true) {44 return new ClickOptions(val, validate);45}46function initMouseOptions (name, val, initOptions, validate = true) {47 return new MouseOptions(val, validate);48}49function initOffsetOptions (name, val, initOptions, validate = true) {50 return new OffsetOptions(val, validate);51}52function initTypeOptions (name, val, initOptions, validate = true) {53 return new TypeOptions(val, validate);54}55function initDragToElementOptions (name, val, initOptions, validate = true) {56 return new DragToElementOptions(val, validate);57}58function initPressOptions (name, val, initOptions, validate = true) {59 return new PressOptions(val, validate);60}61function initDialogHandler (name, val, { skipVisibilityCheck, testRun }) {62 let fn;63 if (isJSExpression(val))64 fn = executeJsExpression(val.value, testRun, { skipVisibilityCheck });65 else66 fn = val.fn;67 if (fn === null || fn instanceof ExecuteClientFunctionCommand)68 return fn;69 const options = val.options;70 const methodName = 'setNativeDialogHandler';71 const functionType = typeof fn;72 let builder = fn && fn[functionBuilderSymbol];73 const isSelector = builder instanceof SelectorBuilder;74 const isClientFunction = builder instanceof ClientFunctionBuilder;75 if (functionType !== 'function' || isSelector)76 throw new SetNativeDialogHandlerCodeWrongTypeError(isSelector ? 'Selector' : functionType);77 if (isClientFunction)78 builder = fn.with(options)[functionBuilderSymbol];79 else80 builder = new ClientFunctionBuilder(fn, options, { instantiation: methodName, execution: methodName });81 return builder.getCommand([]);82}83function initCookiesOption (name, val, initOptions, validate = true) {84 return val.map(cookie => new CookieOptions(cookie, validate));85}86// Commands87export class DispatchEventCommand extends ActionCommandBase {88 static methodName = camelCase(TYPE.dispatchEvent);89 constructor (obj, testRun, validateProperties) {90 super(obj, testRun, TYPE.dispatchEvent, validateProperties);91 }92 _getAssignableProperties () {93 return [94 { name: 'selector', init: initSelector, required: true },95 { name: 'eventName', type: nonEmptyStringArgument, required: true },96 { name: 'options', type: actionOptions },97 { name: 'relatedTarget', init: initSelector, required: false },98 ];99 }100}101export class ClickCommand extends ActionCommandBase {102 static methodName = camelCase(TYPE.click);103 constructor (obj, testRun, validateProperties) {104 super(obj, testRun, TYPE.click, validateProperties);105 }106 _getAssignableProperties () {107 return [108 { name: 'selector', init: initSelector, required: true },109 { name: 'options', type: actionOptions, init: initClickOptions, required: true },110 ];111 }112}113export class RightClickCommand extends ActionCommandBase {114 static methodName = camelCase(TYPE.rightClick);115 constructor (obj, testRun, validateProperties) {116 super(obj, testRun, TYPE.rightClick, validateProperties);117 }118 _getAssignableProperties () {119 return [120 { name: 'selector', init: initSelector, required: true },121 { name: 'options', type: actionOptions, init: initClickOptions, required: true },122 ];123 }124}125export class ExecuteExpressionCommand extends CommandBase {126 constructor (obj, testRun, validateProperties) {127 super(obj, testRun, TYPE.executeExpression, validateProperties);128 }129 _getAssignableProperties () {130 return [131 { name: 'expression', type: nonEmptyStringArgument, required: true },132 { name: 'resultVariableName', type: nonEmptyStringArgument, defaultValue: null },133 ];134 }135}136export class ExecuteAsyncExpressionCommand extends CommandBase {137 constructor (obj, testRun, validateProperties) {138 super(obj, testRun, TYPE.executeAsyncExpression, validateProperties);139 }140 _getAssignableProperties () {141 return [142 { name: 'expression', type: stringArgument, required: true },143 ];144 }145}146export class DoubleClickCommand extends ActionCommandBase {147 static methodName = camelCase(TYPE.doubleClick);148 constructor (obj, testRun, validateProperties) {149 super(obj, testRun, TYPE.doubleClick, validateProperties);150 }151 _getAssignableProperties () {152 return [153 { name: 'selector', init: initSelector, required: true },154 { name: 'options', type: actionOptions, init: initClickOptions, required: true },155 ];156 }157}158export class HoverCommand extends ActionCommandBase {159 static methodName = camelCase(TYPE.hover);160 constructor (obj, testRun, validateProperties) {161 super(obj, testRun, TYPE.hover, validateProperties);162 }163 _getAssignableProperties () {164 return [165 { name: 'selector', init: initSelector, required: true },166 { name: 'options', type: actionOptions, init: initMouseOptions, required: true },167 ];168 }169}170export class TypeTextCommand extends ActionCommandBase {171 static methodName = camelCase(TYPE.typeText);172 constructor (obj, testRun, validateProperties) {173 super(obj, testRun, TYPE.typeText, validateProperties);174 }175 _getAssignableProperties () {176 return [177 { name: 'selector', init: initSelector, required: true },178 { name: 'text', type: nonEmptyStringArgument, required: true },179 { name: 'options', type: actionOptions, init: initTypeOptions, required: true },180 ];181 }182}183export class DragCommand extends ActionCommandBase {184 static methodName = camelCase(TYPE.drag);185 constructor (obj, testRun, validateProperties) {186 super(obj, testRun, TYPE.drag, validateProperties);187 }188 _getAssignableProperties () {189 return [190 { name: 'selector', init: initSelector, required: true },191 { name: 'dragOffsetX', type: integerArgument, required: true },192 { name: 'dragOffsetY', type: integerArgument, required: true },193 { name: 'options', type: actionOptions, init: initMouseOptions, required: true },194 ];195 }196}197export class DragToElementCommand extends ActionCommandBase {198 static methodName = camelCase(TYPE.dragToElement);199 constructor (obj, testRun, validateProperties) {200 super(obj, testRun, TYPE.dragToElement, validateProperties);201 }202 _getAssignableProperties () {203 return [204 { name: 'selector', init: initSelector, required: true },205 { name: 'destinationSelector', init: initSelector, required: true },206 { name: 'options', type: actionOptions, init: initDragToElementOptions, required: true },207 ];208 }209}210export class ScrollCommand extends ActionCommandBase {211 static methodName = camelCase(TYPE.scroll);212 constructor (obj, testRun, validateProperties) {213 super(obj, testRun, TYPE.scroll, validateProperties);214 }215 _getAssignableProperties () {216 return [217 { name: 'selector', init: initSelector, required: false },218 { name: 'position', type: nullableStringArgument, required: false },219 { name: 'x', type: positiveIntegerArgument, defaultValue: null },220 { name: 'y', type: positiveIntegerArgument, defaultValue: null },221 { name: 'options', type: actionOptions, init: initOffsetOptions, required: true },222 ];223 }224}225export class ScrollByCommand extends ActionCommandBase {226 static methodName = camelCase(TYPE.scrollBy);227 constructor (obj, testRun, validateProperties) {228 super(obj, testRun, TYPE.scrollBy, validateProperties);229 }230 _getAssignableProperties () {231 return [232 { name: 'selector', init: initSelector, required: false },233 { name: 'byX', type: integerArgument, defaultValue: 0 },234 { name: 'byY', type: integerArgument, defaultValue: 0 },235 { name: 'options', type: actionOptions, init: initOffsetOptions, required: true },236 ];237 }238}239export class ScrollIntoViewCommand extends ActionCommandBase {240 static methodName = camelCase(TYPE.scrollIntoView);241 constructor (obj, testRun, validateProperties) {242 super(obj, testRun, TYPE.scrollIntoView, validateProperties);243 }244 _getAssignableProperties () {245 return [246 { name: 'selector', init: initSelector, required: true },247 { name: 'options', type: actionOptions, init: initOffsetOptions, required: true },248 ];249 }250}251export class SelectTextCommand extends ActionCommandBase {252 static methodName = camelCase(TYPE.selectText);253 constructor (obj, testRun, validateProperties) {254 super(obj, testRun, TYPE.selectText, validateProperties);255 }256 _getAssignableProperties () {257 return [258 { name: 'selector', init: initSelector, required: true },259 { name: 'startPos', type: positiveIntegerArgument, defaultValue: null },260 { name: 'endPos', type: positiveIntegerArgument, defaultValue: null },261 { name: 'options', type: actionOptions, init: initActionOptions, required: true },262 ];263 }264}265export class SelectEditableContentCommand extends ActionCommandBase {266 static methodName = camelCase(TYPE.selectEditableContent);267 constructor (obj, testRun, validateProperties) {268 super(obj, testRun, TYPE.selectEditableContent, validateProperties);269 }270 _getAssignableProperties () {271 return [272 { name: 'startSelector', init: initSelector, required: true },273 { name: 'endSelector', init: initSelector, defaultValue: null },274 { name: 'options', type: actionOptions, init: initActionOptions, required: true },275 ];276 }277}278export class SelectTextAreaContentCommand extends ActionCommandBase {279 static methodName = camelCase(TYPE.selectTextAreaContent);280 constructor (obj, testRun, validateProperties) {281 super(obj, testRun, TYPE.selectTextAreaContent, validateProperties);282 }283 _getAssignableProperties () {284 return [285 { name: 'selector', init: initSelector, required: true },286 { name: 'startLine', type: positiveIntegerArgument, defaultValue: null },287 { name: 'startPos', type: positiveIntegerArgument, defaultValue: null },288 { name: 'endLine', type: positiveIntegerArgument, defaultValue: null },289 { name: 'endPos', type: positiveIntegerArgument, defaultValue: null },290 { name: 'options', type: actionOptions, init: initActionOptions, required: true },291 ];292 }293}294export class PressKeyCommand extends ActionCommandBase {295 static methodName = camelCase(TYPE.pressKey);296 constructor (obj, testRun, validateProperties) {297 super(obj, testRun, TYPE.pressKey, validateProperties);298 }299 _getAssignableProperties () {300 return [301 { name: 'keys', type: nonEmptyStringArgument, required: true },302 { name: 'options', type: actionOptions, init: initPressOptions, required: true },303 ];304 }305}306export class NavigateToCommand extends ActionCommandBase {307 static methodName = camelCase(TYPE.navigateTo);308 constructor (obj, testRun, validateProperties) {309 super(obj, testRun, TYPE.navigateTo, validateProperties);310 }311 _getAssignableProperties () {312 return [313 { name: 'url', type: urlArgument, required: true },314 { name: 'stateSnapshot', type: nullableStringArgument, defaultValue: null },315 { name: 'forceReload', type: booleanArgument, defaultValue: false },316 ];317 }318}319export class SetFilesToUploadCommand extends ActionCommandBase {320 static methodName = camelCase(TYPE.setFilesToUpload);321 constructor (obj, testRun, validateProperties) {322 super(obj, testRun, TYPE.setFilesToUpload, validateProperties);323 }324 _getAssignableProperties () {325 return [326 { name: 'selector', init: initUploadSelector, required: true },327 { name: 'filePath', type: stringOrStringArrayArgument, required: true },328 ];329 }330}331export class ClearUploadCommand extends ActionCommandBase {332 static methodName = camelCase(TYPE.clearUpload);333 constructor (obj, testRun, validateProperties) {334 super(obj, testRun, TYPE.clearUpload, validateProperties);335 }336 _getAssignableProperties () {337 return [338 { name: 'selector', init: initUploadSelector, required: true },339 ];340 }341}342export class SwitchToIframeCommand extends ActionCommandBase {343 static methodName = camelCase(TYPE.switchToIframe);344 constructor (obj, testRun, validateProperties) {345 super(obj, testRun, TYPE.switchToIframe, validateProperties);346 }347 _getAssignableProperties () {348 return [349 { name: 'selector', init: initSelector, required: true },350 ];351 }352}353export class SwitchToMainWindowCommand extends ActionCommandBase {354 static methodName = camelCase(TYPE.switchToMainWindow);355 constructor () {356 super();357 this.type = TYPE.switchToMainWindow;358 }359}360export class OpenWindowCommand extends ActionCommandBase {361 static methodName = camelCase(TYPE.openWindow);362 constructor (obj, testRun, validateProperties) {363 super(obj, testRun, TYPE.openWindow, validateProperties);364 }365 _getAssignableProperties () {366 return [367 { name: 'url', type: urlArgument },368 ];369 }370}371export class CloseWindowCommand extends ActionCommandBase {372 static methodName = camelCase(TYPE.closeWindow);373 constructor (obj, testRun, validateProperties) {374 super(obj, testRun, TYPE.closeWindow, validateProperties);375 }376 _getAssignableProperties () {377 return [378 { name: 'windowId', type: nullableStringArgument, required: true },379 ];380 }381}382export class GetCurrentWindowCommand extends ActionCommandBase {383 static methodName = camelCase(TYPE.getCurrentWindow);384 constructor (obj, testRun, validateProperties) {385 super(obj, testRun, TYPE.getCurrentWindow, validateProperties);386 }387 _getAssignableProperties () {388 return [389 ];390 }391}392export class GetCurrentWindowsCommand extends ActionCommandBase {393 static methodName = camelCase(TYPE.getCurrentWindows);394 constructor (obj, testRun, validateProperties) {395 super(obj, testRun, TYPE.getCurrentWindows, validateProperties);396 }397 _getAssignableProperties () {398 return [399 ];400 }401}402export class SwitchToWindowCommand extends ActionCommandBase {403 static methodName = camelCase(TYPE.switchToWindow);404 constructor (obj, testRun, validateProperties) {405 super(obj, testRun, TYPE.switchToWindow, validateProperties);406 }407 _getAssignableProperties () {408 return [409 { name: 'windowId', type: nonEmptyStringArgument, required: true },410 ];411 }412}413export class SwitchToWindowByPredicateCommand extends ActionCommandBase {414 static methodName = camelCase(TYPE.switchToWindow);415 constructor (obj, testRun, validateProperties) {416 super(obj, testRun, TYPE.switchToWindowByPredicate, validateProperties);417 }418 _getAssignableProperties () {419 return [420 { name: 'id', type: nonEmptyStringArgument, required: false },421 { name: 'checkWindow', type: functionArgument, required: true },422 ];423 }424}425export class SwitchToParentWindowCommand extends ActionCommandBase {426 static methodName = camelCase(TYPE.switchToParentWindow);427 constructor (obj, testRun, validateProperties) {428 super(obj, testRun, TYPE.switchToParentWindow, validateProperties);429 }430 _getAssignableProperties () {431 return [432 ];433 }434}435export class SwitchToPreviousWindowCommand extends ActionCommandBase {436 static methodName = camelCase(TYPE.switchToPreviousWindow);437 constructor (obj, testRun, validateProperties) {438 super(obj, testRun, TYPE.switchToPreviousWindow, validateProperties);439 }440 _getAssignableProperties () {441 return [];442 }443}444export class SetNativeDialogHandlerCommand extends ActionCommandBase {445 static methodName = camelCase(TYPE.setNativeDialogHandler);446 constructor (obj, testRun, validateProperties) {447 super(obj, testRun, TYPE.setNativeDialogHandler, validateProperties);448 }449 _getAssignableProperties () {450 return [451 { name: 'dialogHandler', init: initDialogHandler, required: true },452 ];453 }454 static from (val) {455 const dialogHandlerStub = {456 dialogHandler: { fn: null },457 };458 const command = new SetNativeDialogHandlerCommand(dialogHandlerStub);459 command.dialogHandler = val.dialogHandler;460 return command;461 }462}463export class GetNativeDialogHistoryCommand extends ActionCommandBase {464 static methodName = camelCase(TYPE.getNativeDialogHistory);465 constructor () {466 super();467 this.type = TYPE.getNativeDialogHistory;468 }469}470export class GetBrowserConsoleMessagesCommand extends ActionCommandBase {471 static methodName = camelCase(TYPE.getBrowserConsoleMessages);472 constructor () {473 super();474 this.type = TYPE.getBrowserConsoleMessages;475 }476}477export class SetTestSpeedCommand extends ActionCommandBase {478 static methodName = camelCase(TYPE.setTestSpeed);479 constructor (obj, testRun, validateProperties) {480 super(obj, testRun, TYPE.setTestSpeed, validateProperties);481 }482 _getAssignableProperties () {483 return [484 { name: 'speed', type: setSpeedArgument, required: true },485 ];486 }487}488export class SetPageLoadTimeoutCommand extends ActionCommandBase {489 static methodName = camelCase(TYPE.setPageLoadTimeout);490 constructor (obj, testRun, validateProperties) {491 super(obj, testRun, TYPE.setPageLoadTimeout, validateProperties);492 }493 _getAssignableProperties () {494 return [495 { name: 'duration', type: positiveIntegerArgument, required: true },496 ];497 }498}499export class UseRoleCommand extends ActionCommandBase {500 static methodName = camelCase(TYPE.useRole);501 constructor (obj, testRun, validateProperties) {502 super(obj, testRun, TYPE.useRole, validateProperties);503 }504 _getAssignableProperties () {505 return [506 { name: 'role', type: actionRoleArgument, required: true },507 ];508 }509}510export class CloseChildWindowOnFileDownloading extends ActionCommandBase {511 static methodName = camelCase(TYPE.closeChildWindowOnFileDownloading);512 constructor (obj, testRun, validateProperties) {513 super(obj, testRun, TYPE.closeChildWindowOnFileDownloading, validateProperties);514 }515}516export class RecorderCommand extends ActionCommandBase {517 static methodName = camelCase(TYPE.recorder);518 constructor (obj, testRun) {519 super(obj, testRun, TYPE.recorder);520 }521 _getAssignableProperties () {522 return [523 { name: 'subtype', type: nonEmptyStringArgument, required: true },524 { name: 'forceExecutionInTopWindowOnly', type: booleanArgument, defaultValue: false },525 ];526 }527}528export class GetCookiesCommand extends ActionCommandBase {529 static methodName = camelCase(TYPE.getCookies);530 constructor (obj, testRun, validateProperties) {531 super(obj, testRun, TYPE.getCookies, validateProperties);532 }533 _getAssignableProperties () {534 return [535 { name: 'urls', type: urlsArgument, required: false },536 { name: 'cookies', type: cookiesArgument, init: initCookiesOption, required: false },537 ];538 }539}540export class SetCookiesCommand extends ActionCommandBase {541 static methodName = camelCase(TYPE.setCookies);542 constructor (obj, testRun, validateProperties) {543 super(obj, testRun, TYPE.setCookies, validateProperties);544 }545 _getAssignableProperties () {546 return [547 { name: 'url', type: urlsArgument, required: false },548 { name: 'cookies', type: setCookiesArgument, init: initCookiesOption, required: true },549 ];550 }551}552export class DeleteCookiesCommand extends ActionCommandBase {553 static methodName = camelCase(TYPE.deleteCookies);554 constructor (obj, testRun, validateProperties) {555 super(obj, testRun, TYPE.deleteCookies, validateProperties);556 }557 _getAssignableProperties () {558 return [559 { name: 'urls', type: urlsArgument, required: false },560 { name: 'cookies', type: cookiesArgument, init: initCookiesOption, required: false },561 ];562 }...
test-custom-resource-provider.js
Source: test-custom-resource-provider.js
...39const customResourceProvider = new CustomResourceProvider('Custom::Resource', TEST_RESOURCE_SCHEMA);40const typesSchemaCustomResourceProvider = new CustomResourceProvider('Custom::Resource', TEST_RESOURCE_SCHEMA_TYPES);41const noSchemaCustomResourceProvider = new CustomResourceProvider('Custom::NoSchema', null);42describe('CustomResourceProvider', () => {43 describe('validateProperties()', () => {44 it('should validate when called with a valid property that must start with a slash', () => {45 // Arrange46 let properties = {47 Region: 'us-east-1',48 SecretPath: '/iam-a-validpath/level1/'49 };50 // Act and Assert51 expect(() => { customResourceProvider.validateProperties(properties, 'Delete'); }).to.not.throw(Error);52 });53 it('should validate when called with valid properties', () => {54 // Arrange55 let properties = {56 Architecture: null,57 InstanceType: 't3.small',58 LinuxVersion: 'Linux',59 Region: 'us-east-1'60 };61 // Act and Assert62 expect(() => { customResourceProvider.validateProperties(properties, 'Create'); }).to.not.throw(Error);63 });64 it('should validate when called with a required property with a value of 0', () => {65 // Arrange66 let properties = {67 NumberProp: 0,68 BooleanProp: true,69 ObjectProp: { s: 'str' }70 };71 // Act and Assert72 expect(() => { typesSchemaCustomResourceProvider.validateProperties(properties, 'Update'); }).to.not.throw(Error);73 });74 it('should validate when called with a required property with a value of false', () => {75 // Arrange76 let properties = {77 NumberProp: 1,78 BooleanProp: false,79 ObjectProp: { s: 'str' }80 };81 // Act and Assert82 expect(() => { typesSchemaCustomResourceProvider.validateProperties(properties, 'Update'); }).to.not.throw(Error);83 });84 it('should validate when called with a required property with a value of {}', () => {85 // Arrange86 let properties = {87 NumberProp: 1,88 BooleanProp: true,89 ObjectProp: {}90 };91 // Act and Assert92 expect(() => { typesSchemaCustomResourceProvider.validateProperties(properties, 'Update'); }).to.not.throw(Error);93 });94 it('should validate when called with a required property with a value of {}', () => {95 // Arrange96 let properties = {97 NumberProp: 1,98 BooleanProp: true,99 ObjectProp: {}100 };101 // Act and Assert102 expect(() => { typesSchemaCustomResourceProvider.validateProperties(properties, 'Update'); }).to.not.throw(Error);103 });104 it('should validate when custom resource has no property schema', () => {105 // Arrange106 let properties = {107 Architecture: null,108 InstanceType: 't3.small',109 LinuxVersion: 'Linux',110 Region: 'us-east-1'111 };112 // Act and Assert113 expect(() => { noSchemaCustomResourceProvider.validateProperties(properties, 'Create'); }).to.not.throw(Error);114 });115 it('should validate when called with a valid property that must start with a slash', () => {116 // Arrange117 let properties = {118 Region: 'us-east-1',119 SecretPath: '/iam-a-validpath/level1/'120 };121 // Act and Assert122 expect(() => { customResourceProvider.validateProperties(properties, 'Delete'); }).to.not.throw(Error);123 });124 it('should validate when called with missing properties that are not required for method', () => {125 // Arrange126 let properties = {127 Architecture: null,128 InstanceType: null,129 LinuxVersion: null,130 Region: 'us-east-1'131 };132 // Act and Assert133 expect(() => { customResourceProvider.validateProperties(properties, 'Delete'); }).to.not.throw(Error);134 });135 it('should validate when called with a valid property that must start with a slash', () => {136 // Arrange137 let properties = {138 Region: 'us-east-1',139 SecretPath: '/iam-a-validpath/level1/'140 };141 // Act and Assert142 expect(() => { customResourceProvider.validateProperties(properties, 'Delete'); }).to.not.throw(Error);143 });144 it('should validate and return default values when properties with defaults are not set', () => {145 // Arrange146 let properties = {147 NumberProp: 1,148 BooleanProp: true,149 ObjectProp: {},150 WithDefaultString: null,151 WithDefaultBoolean: undefined,152 WithDefaultNumber: undefined153 };154 // Act and Assert155 expect(() => { typesSchemaCustomResourceProvider.validateProperties(properties, 'Delete'); }).to.not.throw(Error);156 expect(properties.WithDefaultString).to.equal(DEFAULT_VALUE);157 expect(properties.WithDefaultBoolean).to.equal(DEFAULT_BOOLEAN_VALUE);158 expect(properties.WithDefaultNumber).to.equal(DEFAULT_NUMBER_VALUE);159 });160 it('should validate and not overwrite a properties with a default value that is set', () => {161 // Arrange162 let properties = {163 NumberProp: 1,164 BooleanProp: true,165 ObjectProp: {},166 WithDefaultString: 'I-have-a-value',167 WithDefaultBoolean: 'false',168 WithDefaultNumber: 9876543210169 };170 // Act and Assert171 expect(() => { typesSchemaCustomResourceProvider.validateProperties(properties, 'Delete'); }).to.not.throw(Error);172 expect(properties.WithDefaultString).to.equal('I-have-a-value');173 expect(properties.WithDefaultBoolean).to.equal(false);174 expect(properties.WithDefaultNumber).to.equal(9876543210);175 });176 it('should throw Error when called with a property that must start with a slash but does not', () => {177 // Arrange178 let properties = {179 Region: 'us-east-1',180 SecretPath: 'iam-not-a-validpath/level1/'181 };182 // Act and Assert183 expect(() => { customResourceProvider.validateProperties(properties, 'Delete'); }).to.throw(Error)184 .that.has.property('message').that.containIgnoreCase('invalid')185 .and.not.containIgnoreCase('missing');186 });187 it('should throw Error when called with invalid property value', () => {188 // Arrange189 let properties = {190 Architecture: null,191 InstanceType: 't3.small',192 LinuxVersion: 'Linux3', // Invalid value193 Region: 'us-east-1'194 };195 // Act and Assert196 expect(() => { customResourceProvider.validateProperties(properties, 'Create'); }).to.throw(Error)197 .that.has.property('message').that.containIgnoreCase('invalid')198 .and.not.containIgnoreCase('missing');199 });200 it('should throw Error when called with missing property value', () => {201 // Arrange202 let properties = {203 Architecture: null,204 InstanceType: 't3.small',205 Region: null // Missing property206 };207 // Act and Assert208 expect(() => { customResourceProvider.validateProperties(properties, 'Create'); }).to.throw(Error)209 .that.has.property('message').that.containIgnoreCase('missing')210 .and.not.containIgnoreCase('invalid');211 });212 it('should throw Error when called with missing and invalid property value', () => {213 // Arrange214 let properties = {215 Architecture: null,216 InstanceType: 't3.small',217 LinuxVersion: 'AmazonLinux', // Invalid property218 Region: null // Missing property219 };220 // Act and Assert221 expect(() => { customResourceProvider.validateProperties(properties, 'Create'); }).to.throw(Error)222 .that.has.property('message').that.containIgnoreCase('missing')223 .and.that.containIgnoreCase('invalid');224 });225 it('should throw Error when called with a required property being an empty string', () => {226 // Arrange227 let properties = {228 Architecture: null,229 InstanceType: 't3.small',230 LinuxVersion: 'Linux2',231 Region: '' // Empty property232 };233 // Act and Assert234 expect(() => { customResourceProvider.validateProperties(properties, 'Create'); }).to.throw(Error)235 .that.has.property('message').that.containIgnoreCase('missing')236 .and.not.containIgnoreCase('invalid');237 });238 it('should throw Error when called with a property value of the wrong type', () => {239 // Arrange240 let properties = {241 NumberProp: '123',242 BooleanProp: 'truey',243 ObjectProp: {}244 };245 // Act and Assert246 expect(() => { typesSchemaCustomResourceProvider.validateProperties(properties, 'Create'); }).to.throw(Error)247 .that.has.property('message').that.containIgnoreCase('invalid')248 .and.that.containIgnoreCase('NumberProp')249 .and.that.containIgnoreCase('BooleanProp')250 .and.not.containIgnoreCase('ObjectProp')251 .and.not.containIgnoreCase('missing');252 });253 it('should throw Error when called with missing property value', () => {254 // Arrange255 let properties = {256 BooleanProp: true257 };258 // Act and Assert259 expect(() => { typesSchemaCustomResourceProvider.validateProperties(properties, 'Create'); }).to.throw(Error)260 .that.has.property('message').that.containIgnoreCase('missing')261 .and.that.containIgnoreCase('NumberProp')262 .and.that.containIgnoreCase('ObjectProp')263 .and.not.containIgnoreCase('BooleanProp')264 .and.not.containIgnoreCase('invalid');265 });266 it('should throw Error when called with missing and invalid property value', () => {267 // Arrange268 let properties = {269 NumberProp: '1234',270 BooleanProp: true271 };272 // Act and Assert273 expect(() => { typesSchemaCustomResourceProvider.validateProperties(properties, 'Create'); }).to.throw(Error)274 .that.has.property('message').that.containIgnoreCase('missing')275 .and.that.containIgnoreCase('invalid')276 .and.that.containIgnoreCase('NumberProp')277 .and.that.containIgnoreCase('ObjectProp')278 .and.not.containIgnoreCase('BooleanProp');279 });280 it('should throw Error when called with a required object property being a non-empty string', () => {281 // Arrange282 let properties = {283 NumberProp: 1234,284 BooleanProp: true,285 ObjectProp: 'not-empty'286 };287 // Act and Assert288 expect(() => { typesSchemaCustomResourceProvider.validateProperties(properties, 'Create'); }).to.throw(Error)289 .that.has.property('message').that.containIgnoreCase('invalid')290 .and.that.containIgnoreCase('ObjectProp')291 .and.not.containIgnoreCase('missing')292 .and.not.containIgnoreCase('NumberProp')293 .and.not.containIgnoreCase('BooleanProp');294 });295 it('should throw Error when called with missing properties object', () => {296 // Arrange, Act, and Assert297 expect(() => { customResourceProvider.validateProperties(null, 'Create'); }).to.throw(Error)298 .that.has.property('message').that.containIgnoreCase('missing')299 .and.not.containIgnoreCase('invalid');300 });301 });302 describe('Create()', () =>{303 it('should return FAILED status when Create() is called', async () => {304 // Arrange305 TEST_EVENT.RequestType = 'Create';306 // Act307 let result = await customResourceProvider.Create(TEST_EVENT, TEST_CONTEXT);308 // Assert309 expect(result).to.be.an('object');310 expect(result.RequestType).to.equal(TEST_EVENT.RequestType);311 expect(result.ResourceType).to.equal(TEST_EVENT.ResourceType);...
validateInput.test.js
Source: validateInput.test.js
...90 __meta: { type: true },91 extra: {},92 };93 expect(() => {94 validateProperties(body);95 }).toThrow('Invalid body.');96 });97 test('body keys length not valid', () => {98 const body = {};99 expect(() => {100 validateProperties(body);101 }).toThrow('Invalid body.');102 });103 test('provided object insted of array', () => {104 const body = { name: 'john' };105 expect(() => {106 validateProperties(body);107 }).toThrow(108 'Please provide entity with this structure { NAME: [{}, {}, {}] }',109 );110 });111 test('no errors', () => {112 const body = { users: [{ name: 'john' }, { name: 'michael' }] };113 validateProperties(body);114 });115 test('no meta in body', () => {116 const body = { users: [{ name: 'john' }, { name: 'michael' }], neta: {} };117 expect(() => {118 validateProperties(body);119 }).toThrow('Invalid body.');120 });121 test('type in meta but false', () => {122 const body = {123 users: [{ name: 'john' }, { name: 'michael' }],124 __meta: { type: false },125 };126 expect(() => {127 validateProperties(body);128 }).toThrow('Property __meta is invalid.');129 });130 test('force in meta but false', () => {131 const body = {132 users: [{ name: 'john' }, { name: 'michael' }],133 __meta: { force: false },134 };135 expect(() => {136 validateProperties(body);137 }).toThrow('Property __meta is invalid.');138 });139 test('type in meta, no error', () => {140 const body = {141 users: { name: 'string' },142 __meta: { type: true },143 };144 validateProperties(body);145 });146 test('force in meta, no error', () => {147 const body = {148 users: [{ name: 'john' }, { name: 'michael' }],149 __meta: { force: true },150 };151 validateProperties(body);152 });153});154describe('validate input', () => {155 test('invalid str', () => {156 const str =157 '"users":[{"name":"Rom","age":39},{"name":"Mark","age":39},{"name":"John","age":38}],"moreUser":[]}';158 const event = { body: str };159 expect(() => {160 validateInput(event);161 }).toThrow('Invalid body.');162 });163 test('body keys length not valid', () => {164 const event = {165 body: JSON.stringify({166 users: [{ name: 'john' }, { name: 'michael' }],167 __meta: { type: true },168 extra: {},169 }),170 };171 expect(() => {172 validateInput(event);173 }).toThrow('Invalid body.');174 });175 test('body keys length not valid', () => {176 const event = { body: JSON.stringify({}) };177 expect(() => {178 validateInput(event);179 }).toThrow('Invalid body.');180 });181 test('provided object insted of array', () => {182 const event = { body: JSON.stringify({ name: 'john' }) };183 expect(() => {184 validateProperties(event);185 }).toThrow(186 'Please provide entity with this structure { NAME: [{}, {}, {}] }',187 );188 });189 test('no errors', () => {190 const event = {191 body: JSON.stringify({ users: [{ name: 'john' }, { name: 'michael' }] }),192 };193 validateInput(event);194 });195 test('type in meta but false', () => {196 const event = {197 body: JSON.stringify({198 users: [{ name: 'john' }, { name: 'michael' }],...
AttributeCollection-spec.js
Source: AttributeCollection-spec.js
...14 expect(coll.all()).toEqual({});15 //noinspection JSUnresolvedFunction16 expect(coll.defaults()).toEqual({});17 //noinspection JSUnresolvedFunction18 expect(coll.validateProperties({})).toEqual(true);19 //noinspection JSUnresolvedFunction20 expect(function () {21 coll.validateProperties({'myProperty': 'myValue'});22 }).toThrow(new Error('The attribute "myProperty" is not valid.'));23 });24 //noinspection JSUnresolvedFunction25 it('can add and validate values', function () {26 var coll = new AttributeCollection();27 coll.add('EMAIL', {28 name: 'email',29 validate: function (value) {30 return typeof value === 'string' && value.match(/^[^\s@]+@[^\s@]+\.[^\s@]+$/);31 }32 });33 //noinspection JSUnresolvedFunction34 expect(coll.all()).toEqual({'EMAIL': 'email'});35 //noinspection JSUnresolvedFunction36 expect(coll.is('email')).toBe(true);37 //noinspection JSUnresolvedFunction38 expect(coll.default('email')).toBeUndefined();39 //noinspection JSUnresolvedFunction40 expect(function () {41 coll.validateProperties({'email': 'myValue'});42 }).toThrow(new Error('The value "myValue" is invalid for the property "email".'));43 //noinspection JSUnresolvedFunction44 expect(coll.validateProperties({'email': 'philipp.meisen@breinify.com'})).toBe(true);45 coll.add('SIMPLE');46 //noinspection JSUnresolvedFunction47 expect(coll.all()).toEqual({'EMAIL': 'email', 'SIMPLE': 'SIMPLE'});48 coll.add('ALSOSIMPLE', 'soSimple');49 //noinspection JSUnresolvedFunction50 expect(coll.all()).toEqual({'EMAIL': 'email', 'SIMPLE': 'SIMPLE', 'ALSOSIMPLE': 'soSimple'});51 //noinspection JSUnresolvedFunction52 expect(coll.is('email')).toBe(true);53 //noinspection JSUnresolvedFunction54 expect(coll.is('SIMPLE')).toBe(true);55 //noinspection JSUnresolvedFunction56 expect(coll.is('soSimple')).toBe(true);57 //noinspection JSUnresolvedFunction58 expect(coll.default('email')).toBeUndefined();59 //noinspection JSUnresolvedFunction60 expect(coll.default('SIMPLE')).toBeUndefined();61 //noinspection JSUnresolvedFunction62 expect(coll.default('soSimple')).toBeUndefined();63 //noinspection JSUnresolvedFunction64 expect(coll.validateProperties({'email': 'philipp.meisen@breinify.com'})).toBe(true);65 //noinspection JSUnresolvedFunction66 expect(coll.validateProperties({67 'email': 'philipp.meisen@breinify.com',68 'SIMPLE': null,69 'soSimple': 'value'70 })).toBe(true);71 });72 //noinspection JSUnresolvedFunction73 it('can validate groups', function () {74 var coll = new AttributeCollection();75 coll.add('FIRST', {76 name: 'first',77 group: 178 });79 coll.add('LAST', {80 name: 'last',81 group: 1,82 optional: false83 });84 coll.add('DATE', {85 name: 'date',86 group: 1,87 optional: false88 });89 coll.add('OTHER', {90 name: 'other',91 group: 292 });93 coll.add('MORE', {94 name: 'more',95 group: 3,96 optional: false97 });98 coll.add('ANOTHER', {99 name: 'another',100 group: 3,101 optional: false102 });103 //noinspection JSUnresolvedFunction104 expect(coll.validateProperties({105 'other': 'anotherValue'106 })).toBe(true);107 //noinspection JSUnresolvedFunction108 expect(coll.validateProperties({109 'first': 'Diane',110 'last': 'Keng',111 'date': '01/01/1980'112 })).toBe(true);113 //noinspection JSUnresolvedFunction114 expect(function () {115 coll.validateProperties({116 'first': 'Diane',117 'date': '01/01/1980'118 });119 }).toThrow(new Error('The group "1" expects a valid value for the attribute "last".'));120 //noinspection JSUnresolvedFunction121 expect(coll.validateProperties({122 'last': 'Keng',123 'date': '01/01/1980',124 'more': 'more is more',125 'another': 'less can be good'126 })).toBe(true);127 //noinspection JSUnresolvedFunction128 expect(function () {129 coll.validateProperties({130 'last': 'Keng',131 'date': '01/01/1980',132 'another': 'less can be good'133 });134 }).toThrow(new Error('The group "3" expects a valid value for the attribute "more".'));135 //noinspection JSUnresolvedFunction136 expect(function () {137 coll.validateProperties({138 'last': 'Keng',139 'more': 'more is more',140 'another': 'less can be good'141 });142 }).toThrow(new Error('The group "1" expects a valid value for the attribute "date".'));143 });...
validateProperties.test.js
Source: validateProperties.test.js
...5 const person = {6 name: "Plo Koon",7 birth_year: "22BBY"8 }9 expect(validateProperties(person, properties)).toBeTruthy();10 });11 test("Returns false if person passed in is undefined", () => {12 expect(validateProperties(undefined, properties)).toBeFalsy();13 });14 test("Returns false if person passed in is missing name property", () => {15 const person = {16 birth_year: "22BBY"17 };18 expect(validateProperties(person, properties)).toBeFalsy();19 });20 test("Returns false if person passed in is missing birth year property", () => {21 const person = {22 name: "Plo Koon"23 };24 expect(validateProperties(person, properties)).toBeFalsy();25 });26 test("Returns false if person passed in has unknown name", () => {27 const person = {28 name: "unknown",29 birth_year: "22BBY"30 };31 expect(validateProperties(person, properties)).toBeFalsy();32 });33 test("Returns false if person passed in has unknown birth year", () => {34 const person = {35 name: "Plo Koon",36 birth_year: "unknown"37 };38 expect(validateProperties(person, properties)).toBeFalsy();39 });40 test("If no array of properties are passed in, only checks whether person object is not undefined", () => {41 const person = {};42 expect(validateProperties(person)).toBeTruthy();43 });44 test("Throws error if second argument is not an array", () => {45 const person = {46 name: "Plo Koon",47 birth_year: "22BBY"48 }49 expect(() => validateProperties(person, "bad arg"))50 .toThrow("First argument should be an object and the second an array of properties (eg: 'name', 'birth_year') in string representation");51 });...
validate-test.js
Source: validate-test.js
...12 });13});14describe('validateProperties', function() {15 it('should validate valid AST node properties', function() {16 validateProperties({});17 validateProperties({ prop: { type: 'value', value: 2 } });18 validateProperties({ prop: { type: 'variable', value: 'foo' } });19 validateProperties({ prop: { type: 'expression', value: 'foo + 1' } });20 });21 it('should throw on invalid AST node properties', function() {22 expect(() => validateProperties(2)).to.throwError();23 expect(() => validateProperties({ prop: 'foo' })).to.throwError();24 expect(() =>25 validateProperties({ type: 'value', value: 2 })26 ).to.throwError();27 expect(() =>28 validateProperties({29 prop: { type: 'foo', value: 2 }30 })31 ).to.throwError();32 expect(() =>33 validateProperties({34 prop: { type: 'value', value: 2, extra: 3 }35 })36 ).to.throwError();37 });...
getRandomPersonWithProps.js
Source: getRandomPersonWithProps.js
...9 for (let i = 0; i < 10; i ++) {10 randomId = getRandomWholeNumber(1, totalNumPeople);11 randomPerson = await utils.fetchItem(`https://swapi.py4e.com/api/people/${randomId}`);12 13 if (validateProperties(randomPerson, props)) {14 break;15 };16 };17 18 if (!validateProperties(randomPerson, props)) {19 throw new Error("Unable to retrieve a valid person after multiple attempts");20 };21 return randomPerson;...
Using AI Code Generation
1const { validateProperties } = require('playwright');2const { chromium } = require('playwright');3(async () => {4 const browser = await chromium.launch();5 const context = await browser.newContext();6 const page = await context.newPage();7 await page.click('text="Get started"');8 const properties = await validateProperties(await page.$('text="Get started"'));9 console.log(properties);10 await browser.close();11})();12{
Using AI Code Generation
1const { validateProperties } = require('@playwright/test/lib/utils/utils');2const { test } = require('@playwright/test');3test('validateProperties', async ({ page }) => {4 const properties = {5 };6 const element = await page.$('#playwright-header');7 const result = await validateProperties(element, properties);8 console.log(result);9});10 √ validateProperties (1s)11 1 passed (1s)
Using AI Code Generation
1const { validateProperties } = require('@playwright/test/lib/server/validateProperties');2const { test } = require('@playwright/test');3test('test', async ({ page }) => {4 await page.$('text=Get started');5 validateProperties(page);6});7const { validateProperties } = require('@playwright/test/lib/server/validateProperties');8const { test } = require('@playwright/test');9test('test', async ({ page }) => {10 await page.$('text=Get started');11 validateProperties(page);12});
Using AI Code Generation
1const { validateProperties } = require('playwright/lib/utils/utils');2const { assert } = require('chai');3const { it, describe } = require('mocha');4describe('Validate Properties', () => {5 it('should check if the property is valid', () => {6 assert.doesNotThrow(() => {7 validateProperties({ foo: 'bar' }, { foo: { type: 'string' } });8 });9 });10});11const { validateProperties } = require('playwright/lib/utils/utils');12const { assert } = require('chai');13const { it, describe } = require('mocha');14describe('Validate Properties', () => {15 it('should check if the property is valid', () => {16 assert.doesNotThrow(() => {17 validateProperties({ foo: 'bar' }, { foo: { type: 'number' } });18 });19 });20});
Using AI Code Generation
1const { validateProperties } = require('@playwright/test/lib/server/validateProperties');2const { assert } = require('chai');3const { test } = require('@playwright/test');4test('validateProperties', async ({}) => {5 const obj = {a: 1, b: 2, c: 3};6 const validProperties = ['a', 'b', 'c'];7 const actualResult = validateProperties(obj, validProperties);8 const expectedResult = obj;9 assert.deepEqual(actualResult, expectedResult);10});11test('validateProperties - invalid', async ({}) => {12 const obj = {a: 1, b: 2, c: 3};13 const validProperties = ['a', 'b'];14 const actualResult = validateProperties(obj, validProperties);15 const expectedResult = {a: 1, b: 2};16 assert.deepEqual(actualResult, expectedResult);17});18test('validateProperties - invalid', async ({}) => {19 const obj = {a: 1, b: 2, c: 3};20 const validProperties = ['a', 'b', 'd'];21 const actualResult = validateProperties(obj, validProperties);22 const expectedResult = {a: 1, b: 2};23 assert.deepEqual(actualResult, expectedResult);24});25test('validateProperties - invalid', async ({}) => {26 const obj = {a: 1, b: 2, c: 3};27 const validProperties = ['a', 'b', 'c', 'd'];28 const actualResult = validateProperties(obj, validProperties);29 const expectedResult = {a: 1, b: 2, c: 3};30 assert.deepEqual(actualResult, expectedResult);31});32test('validateProperties - invalid', async ({}) => {33 const obj = {a: 1, b: 2, c: 3};34 const validProperties = ['a', 'b', 'c', 'd'];35 const actualResult = validateProperties(obj, validProperties);36 const expectedResult = {a: 1, b: 2, c: 3};37 assert.deepEqual(actualResult, expectedResult);38});39test('validateProperties - invalid', async ({}) => {40 const obj = {a: 1, b: 2, c: 3};
Using AI Code Generation
1const { validateProperties } = require('playwright/lib/internal/utils');2const { expect } = require('chai');3const options = {4 corge: {},5 garply6: [{}, {}, {}],6};7const schema = {8 foo: { type: 'string' },9 bar: { type: 'number' },10 baz: { type: 'boolean' },11 qux: { type: 'null' },12 quux: { type: 'undefined' },13 corge: { type: 'object' },14 grault: { type: 'array' },15 garply: { type: 'array', items: { type: 'string' } },16 garply2: { type: 'array', items: { type: 'number' } },17 garply3: { type: 'array', items: { type: 'boolean' } },18 garply4: { type: 'array', items: { type: 'null' } },19 garply5: { type: 'array', items: { type: 'undefined' } },20 garply6: { type: 'array', items: { type: 'object' } },21 garply7: { type: 'array', items: { type: 'array' } },22};23const result = validateProperties(options, schema);24expect(result).to.be.true;25const { validateProperties } = require('playwright/lib/internal/utils');26const { expect } = require('chai');27const options = {28 corge: {},
Using AI Code Generation
1const { validateProperties } = require('playwright-core/lib/server/frames');2const { assert } = require('console');3const properties = {4};5const object = {6 location: {7 },8 address: {9 },10};11const result = validateProperties(object, properties);12assert(result.success === true, 'Validation failed');13console.log('Validation passed');
Using AI Code Generation
1const { validateProperties } = require( 'playwright/lib/utils/utils' );2validateProperties( { name: 'foo' }, {3 name: { is: 'string' }4} );5const { test } = require( '@playwright/test' );6test( 'test', async ( { page } ) => {7 const { validateProperties } = require( 'playwright/lib/utils/utils' );8 validateProperties( { name: 'foo' }, {9 name: { is: 'string' }10 } );11} );
Jest + Playwright - Test callbacks of event-based DOM library
firefox browser does not start in playwright
Is it possible to get the selector from a locator object in playwright?
How to run a list of test suites in a single file concurrently in jest?
Running Playwright in Azure Function
firefox browser does not start in playwright
This question is quite close to a "need more focus" question. But let's try to give it some focus:
Does Playwright has access to the cPicker object on the page? Does it has access to the window object?
Yes, you can access both cPicker and the window object inside an evaluate call.
Should I trigger the events from the HTML file itself, and in the callbacks, print in the DOM the result, in some dummy-element, and then infer from that dummy element text that the callbacks fired?
Exactly, or you can assign values to a javascript variable:
const cPicker = new ColorPicker({
onClickOutside(e){
},
onInput(color){
window['color'] = color;
},
onChange(color){
window['result'] = color;
}
})
And then
it('Should call all callbacks with correct arguments', async() => {
await page.goto(`http://localhost:5000/tests/visual/basic.html`, {waitUntil:'load'})
// Wait until the next frame
await page.evaluate(() => new Promise(requestAnimationFrame))
// Act
// Assert
const result = await page.evaluate(() => window['color']);
// Check the value
})
Check out the latest blogs from LambdaTest on this topic:
Native apps are developed specifically for one platform. Hence they are fast and deliver superior performance. They can be downloaded from various app stores and are not accessible through browsers.
One of the essential parts when performing automated UI testing, whether using Selenium or another framework, is identifying the correct web elements the tests will interact with. However, if the web elements are not located correctly, you might get NoSuchElementException in Selenium. This would cause a false negative result because we won’t get to the actual functionality check. Instead, our test will fail simply because it failed to interact with the correct element.
Smartphones have changed the way humans interact with technology. Be it travel, fitness, lifestyle, video games, or even services, it’s all just a few touches away (quite literally so). We only need to look at the growing throngs of smartphone or tablet users vs. desktop users to grasp this reality.
As part of one of my consulting efforts, I worked with a mid-sized company that was looking to move toward a more agile manner of developing software. As with any shift in work style, there is some bewilderment and, for some, considerable anxiety. People are being challenged to leave their comfort zones and embrace a continuously changing, dynamic working environment. And, dare I say it, testing may be the most ‘disturbed’ of the software roles in agile development.
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.
Get 100 minutes of automation test minutes FREE!!