Best JavaScript code snippet using playwright-internal
EditSitemapSelectorView.js
Source: EditSitemapSelectorView.js
1import * as c from "../Selector/SelectorTable.js"//c = i(219),2import * as A from "../Arr.js"//A = i(87),3import * as _ from "../Selector/SelectorMicroData.js"//_ = i(217),4import * as N from "../RequestPermissions.js" //N = i(220),5import * as F from "../IM/DevToolsContentScriptClient.js"//F = i(221),6import * as C from "../SelectorOpt/selectorFactory.js"//C = i(94),7import * as l from "react"//l = i(0),8import * as s from "mobx-react"//s = i(21),9import * as d from "./BaseComponent.js"//d = i(25),10import * as u from "../IM/backgroundPageClient.js"//u = i(68),11import * as o from "../../common/lib/jquery.js"//o = i(65),12import * as p from "./DataObjectSelectors.js"//p = i(691),13import * as h from "./DataPreviewButton.js" //h = i(692),14import * as f from "./DiscardInitialElements.js"//f = i(693),15import * as m from "./MicroDataSelectorType.js"//m = i(694),16import * as g from "./SchemaOrgType.js"//g = i(695),17import * as y from "./Script.js"//y = i(696),18import * as b from "./ScriptDataColumns.js"//b = i(699),19import * as v from "./SitemapXmlMinimumPriority.js"//v = i(700)20import * as w from "./SitemapXmlUrlRegex.js"//w = i(701),21import * as S from "./SitemapXmlUrls.js"//S = i(702),22import * as x from "./PerformActionButton.js"//x = i(703),23import * as M from "../SelectorOpt/selectorTypes.js"//M = i(704),24import * as E from "./Checkbox.js"//E = i(705),25import * as O from "./Columns.js"//O = i(706),26import * as P from "./Delay.js"//P = i(707),27import * as k from "./ParentSelectors.js"//k = i(708),28import * as T from "./ElementSelector.js"//T = i(709),29import * as D from "./Select.js"//D = i(710),30import * as R from "./Input.js"//R = i(711),31import * as I from "./InputAutocomplete.js" //I = i(712);32var n = this && this.__decorate || function (e, t, i, n) {33 var r, a = arguments.length, o = a < 3 ? t : null === n ? n = Object.getOwnPropertyDescriptor(t, i) : n;34 if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) o = Reflect.decorate(e, t, i, n); else for (var s = e.length - 1; s >= 0; s--) (r = e[s]) && (o = (a < 3 ? r(o) : a > 3 ? r(t, i, o) : r(t, i)) || o);35 return a > 3 && o && Object.defineProperty(t, i, o), o;36}, r = this && this.__metadata || function (e, t) {37 if ("object" == typeof Reflect && "function" == typeof Reflect.metadata) return Reflect.metadata(e, t);38};39let EditSitemapSelectorView = class extends d.BaseComponent {40 constructor(e) {41 super(e);42 const t = C.selectorFactory(e.appState.selector);43 this.state = {44 selector: t,45 schemaOrgExtractorFoundData: []46 };47 }48 get selectorIds() {49 const originalSitemap = this.props.appState.originalSitemap;50 const originalSelector = this.props.appState.originalSelector;51 const cloned_sitemap = originalSitemap.clone();52 cloned_sitemap.updateSelector(originalSelector, this.state.selector);53 const results = [];54 cloned_sitemap.selectors.forEach(e => {55 if (e.canHaveChildSelectors())56 results.push(e.id);57 });58 results.unshift("_root");59 return results;60 }61 get columns() {62 let result = [];63 const selector = this.state.selector;64 if (undefined !== selector.columns) {65 result = selector.columns;66 }67 return result;68 }69 getFormValidatorOptions() {70 const e = {71 fields: {72 id: {73 validators: {74 notEmpty: {75 message: "Sitemap id required and cannot be empty"76 },77 stringLength: {78 min: 2,79 message: "The sitemap id should be atleast 2 characters long"80 },81 regexp: {82 regexp: /^(?!web-scraper)[^_\.\$\#\s&][^\.\$\#\n&]+$/,83 message: "Selector id cannot start with _ and cannot contain . $ #"84 }85 }86 },87 selector: {88 validators: {89 notEmpty: {90 message: "Selector is required and cannot be empty"91 }92 }93 },94 regex: {95 validators: {96 callback: {97 message: "JavaScript does not support regular expressions that can match 0 characters.",98 callback(e, t) {99 if (!e) return !0;100 const i = "".match(new RegExp(e));101 return null === i || "" !== i[0];102 }103 }104 }105 },106 clickElementSelector: {107 validators: {108 notEmpty: {109 message: "Click selector is required and cannot be empty"110 }111 }112 },113 tableHeaderRowSelector: {114 validators: {115 notEmpty: {116 message: "Header row selector is required and cannot be empty"117 }118 }119 },120 tableDataRowSelector: {121 validators: {122 notEmpty: {123 message: "Data row selector is required and cannot be empty"124 }125 }126 },127 delay: {128 validators: {129 numeric: {130 message: "Delay must be numeric"131 }132 }133 },134 sitemapXmlMinimumPriority: {135 validators: {136 between: {137 min: 0,138 max: 1,139 message: "Minimum priority must be between 0 and 1"140 }141 }142 },143 sitemapXmlUrlRegex: {144 validators: {145 callback: {146 message: "JavaScript does not support regular expressions that can match 0 characters.",147 callback(e, t) {148 if (!e) return !0;149 try {150 const t = "".match(new RegExp(e));151 return null === t || "" !== t[0];152 } catch (e) {153 return {154 valid: !1,155 message: "Invalid regex"156 };157 }158 }159 }160 }161 },162 sitemapXmlSitemapXmlUrlRegex: {163 validators: {164 callback: {165 message: "JavaScript does not support regular expressions that can match 0 characters.",166 callback(e, t) {167 if (!e) return !0;168 try {169 const t = "".match(new RegExp(e));170 return null === t || "" !== t[0];171 } catch (e) {172 return {173 valid: !1,174 message: "Invalid regex"175 };176 }177 }178 }179 }180 },181 selectorScrollElement: {182 validators: {}183 },184 selectorScrollDownIfElementNotVisible: {185 validators: {}186 },187 selectorScrollToElement: {188 validators: {}189 },190 parentSelectors: {191 validators: {192 notEmpty: {193 message: "You must choose at least one parent selector"194 },195 callback: {196 message: "Selector needs to have at least one other selector as parent",197 callback: (e, t) => 1 !== e.length || e[0] !== this.state.selector.id198 }199 }200 }201 },202 group: ".form-group:not(:has(.form-group))"203 }, t = /^(?!web-scraper)[^_\.\$\s][^\.\$\n]+$/;204 for (let i = 0; i <= 30; i++) e.fields[`columns[${i}][name]`] = {205 validators: {206 notEmpty: {207 message: "must not be empty"208 },209 regexp: {210 regexp: t,211 message: "invalid format"212 }213 }214 };215 for (let i = 0; i <= 30; i++) e.fields[`scriptDataColumns[${i}][name]`] = {216 validators: {217 notEmpty: {218 message: "must not be empty"219 },220 regexp: {221 regexp: t,222 message: "invalid format"223 }224 }225 };226 for (let t = 0; t <= 30; t++) e.fields[`sitemapXmlUrls[${t}]`] = {227 validators: {228 notEmpty: {229 message: "must not be empty"230 },231 uri: {232 message: "Sitemap.xml URL is not a valid URL"233 }234 }235 };236 return e;237 }238 componentDidMount() {239 this.initFormValidator();240 }241 render() {242 const e = this.selectorIds,243 t = this.props.appState.experimentalFeaturesEnabled, {selector: i, schemaOrgExtractorFoundData: n} = this.state;244 let r = {};245 for (const e of n) i instanceof _.SelectorMicroData && e.schemaOrgType === i.schemaOrgType && (r = e.data[0]);246 const a = n.map(e => e.schemaOrgType), o = {247 auto: "auto",248 linkFromHref: 'Link (<a href="http://example.com/">)',249 linkFromInlineScript: "Scripted link (<a href=\"javascript:window.location='http://example.com'\">)",250 linkFromAttributes: 'Attribute link (<a data-link="http://example.com">)',251 linkFromInnerText: "Text link (<div>link: http://example.com/</div>)",252 linkFromInterceptableJavaScriptClick: "Interceptable Scripted Link click simulation (window.open(), <form> submit, history.pushState())",253 linkFromClickRedirect: 'Scripted Link click simulation (button.addEventListener("click", redirectFunction))',254 clickMore: "Click multiple times on next/more button ([Next page] [Load More])",255 clickOnce: "Click once on multiple buttons ([1] [2], [3])"256 };257 return t || delete o.linkFromClickRedirect, l.createElement("div", {258 ref: e => this.el = e259 }, l.createElement("form", {260 className: "form-horizontal",261 role: "form",262 id: "edit-selector",263 onSubmit: this.cancelEvent.bind(this)264 }, l.createElement("div", {265 className: "form-group"266 }, l.createElement("label", {267 className: "col-lg-1 control-label"268 }, chrome.i18n.getMessage("SelectorID")), l.createElement("div", {269 className: "col-lg-10"270 }, l.createElement("input", {271 type: "text",272 className: "form-control",273 name: "id",274 id: "selectorId",275 placeholder: "Selector Id",276 value: i.id,277 onChange: this.handleInputChange.bind(this)278 }))), l.createElement("div", {279 className: "form-group"280 }, l.createElement("label", {281 className: "col-lg-1 control-label"282 }, chrome.i18n.getMessage("type")), l.createElement("div", {283 className: "col-lg-10"284 }, l.createElement("select", {285 className: "form-control",286 value: i.type,287 name: chrome.i18n.getMessage("type"),288 onChange: this.changeSelectorType.bind(this)289 }, M.selectorTypes.map(e => e.experimental && !t ? "" : l.createElement("option", {290 key: e.type,291 value: e.type292 }, e.title))))), l.createElement(T.ElementSelector, {293 feature: "selector",294 selector: i,295 label: chrome.i18n.getMessage("SelectorAction"),296 onSelectClick: this.selectSelector.bind(this, "selector"),297 onElementPreviewClick: this.elementPreview.bind(this, "selector"),298 onDataPreviewClick: this.dataPreview.bind(this),299 onChange: this.handleInputChange.bind(this)300 }), l.createElement(T.ElementSelector, {301 feature: "selectorScrollElement",302 selector: i,303 label: "Scroll element",304 onSelectClick: this.selectSelector.bind(this, "selectorScrollElement"),305 onElementPreviewClick: this.elementPreview.bind(this, "selectorScrollElement"),306 onChange: this.handleInputChange.bind(this)307 }), l.createElement(T.ElementSelector, {308 feature: "selectorScrollDownIfElementNotVisible",309 selector: i,310 label: "Scroll only if missing",311 onSelectClick: this.selectSelector.bind(this, "selectorScrollDownIfElementNotVisible"),312 onElementPreviewClick: this.elementPreview.bind(this, "selectorScrollDownIfElementNotVisible"),313 onChange: this.handleInputChange.bind(this)314 }), l.createElement(T.ElementSelector, {315 feature: "selectorScrollToElement",316 selector: i,317 label: "Scroll to element",318 onSelectClick: this.selectSelector.bind(this, "selectorScrollToElement"),319 onElementPreviewClick: this.elementPreview.bind(this, "selectorScrollToElement"),320 onChange: this.handleInputChange.bind(this)321 }), l.createElement(T.ElementSelector, {322 feature: "clickElementSelector",323 selector: i,324 label: "Click selector",325 onSelectClick: this.selectClickSelector.bind(this),326 onElementPreviewClick: this.elementPreviewClickSelector.bind(this),327 onChange: this.handleInputChange.bind(this)328 }), l.createElement(T.ElementSelector, {329 feature: "tableHeaderRowSelector",330 selector: i,331 label: chrome.i18n.getMessage("HeaderRowSelector"),332 onSelectClick: this.selectTableHeaderRowSelector.bind(this),333 onElementPreviewClick: this.previewTableRowSelector.bind(this),334 onChange: this.handleInputChange.bind(this)335 }), l.createElement(T.ElementSelector, {336 feature: "tableDataRowSelector",337 selector: i,338 label: chrome.i18n.getMessage("DataRowsSelector"),339 onSelectClick: this.selectTableDataRowSelector.bind(this),340 onElementPreviewClick: this.previewTableRowSelector.bind(this),341 onChange: this.handleInputChange.bind(this)342 }), l.createElement(D.Select, {343 feature: "clickType",344 selector: i,345 label: "Click type",346 onChange: this.handleInputChange.bind(this),347 options: {348 clickOnce: "Click once (pagination, tabs)",349 clickMore: "Click more (click to load more elements. Stops when no new elements with unique text content are found.)"350 }351 }), l.createElement(D.Select, {352 feature: "paginationType",353 selector: i,354 label: "Pagination Type",355 onChange: this.handleInputChange.bind(this),356 options: o357 }), l.createElement(D.Select, {358 selector: i,359 feature: "clickElementUniquenessType",360 label: "Click element uniqueness",361 onChange: this.handleInputChange.bind(this),362 options: {363 uniqueText: "Unique Text",364 uniqueHTMLText: "Unique HTML+Text",365 uniqueHTML: "Unique HTML",366 uniqueCSSSelector: "unique CSS Selector"367 }368 }), l.createElement(m.MicroDataSelectorType, {369 feature: "microDataSelectorType",370 selector: i,371 onChange: this.handleInputChange.bind(this)372 }), l.createElement(g.SchemaOrgType, {373 feature: "schemaOrgType",374 selector: i,375 onChange: this.handleSchemaOrgTypeChange.bind(this),376 onRefresh: this.refreshSchemaOrgTypes.bind(this),377 types: a378 }), l.createElement(y.Script, {379 feature: "script",380 selector: i,381 onChange: this.handleValueChange.bind(this, "script")382 }), l.createElement(b.ScriptDataColumns, {383 feature: "scriptDataColumns",384 selector: i,385 onChange: this.handleInputChange.bind(this),386 onRemove: this.handleMultiRemove.bind(this),387 onAdd: this.handleAddMultiValue.bind(this)388 }), l.createElement(E.Checkbox, {389 feature: "multiple",390 selector: i,391 label: chrome.i18n.getMessage("Multiple"),392 onChange: this.handleInputChange.bind(this)393 }), l.createElement(f.DiscardInitialElements, {394 feature: "discardInitialElements",395 selector: i,396 onChange: this.handleInputChange.bind(this)397 }), t ? l.createElement(D.Select, {398 feature: "linkType",399 selector: i,400 label: "Link type",401 onChange: this.handleInputChange.bind(this),402 options: {403 link: "Link (read from href attribute)",404 text: "Text (use text contents as link)",405 attribute: "Attribute (@TODO)",406 popup: "Popup window (@TODO)",407 redirect: "Redirect (@TODO)",408 "form-submit": "Form submit (@TODO)"409 }410 }) : "", l.createElement(E.Checkbox, {411 feature: "downloadImage",412 selector: i,413 label: "Download image",414 onChange: this.handleInputChange.bind(this)415 }), l.createElement(R.Input, {416 feature: "regex",417 selector: i,418 label: chrome.i18n.getMessage("Regex"),419 onChange: this.handleInputChange.bind(this)420 }), l.createElement(I.InputAutocomplete, {421 feature: "extractAttribute",422 placeholder: "Click to view available attributes",423 selector: i,424 label: "Attribute name",425 onChange: this.handleInputChange.bind(this),426 getOptions: this.handleAttributeSelect427 }), l.createElement(P.Delay, {428 feature: "delay",429 selector: i,430 onChange: this.handleInputChange.bind(this)431 }), l.createElement(O.Columns, {432 feature: "columns",433 selector: i,434 onChange: this.handleInputChange.bind(this)435 }), l.createElement(S.SitemapXmlUrls, {436 feature: "sitemapXmlUrls",437 selector: i,438 onChange: this.handleInputChange.bind(this),439 onRemove: this.handleMultiRemove.bind(this),440 onAddUrl: this.handleAddMultiValue.bind(this),441 onClickPopulateSitemapXmlUrlsFromRobotsTxt: this.populateSitemapXmlLinksFromRobotsTxt.bind(this)442 }), l.createElement(w.SitemapXmlUrlRegex, {443 feature: "sitemapXmlUrlRegex",444 selector: i,445 onChange: this.handleInputChange.bind(this)446 }), l.createElement(v.SitemapXmlMinimumPriority, {447 feature: "sitemapXmlMinimumPriority",448 selector: i,449 onChange: this.handleInputChange.bind(this)450 }), l.createElement(p.DataObjectSelectors, {451 feature: "dataObjectSelectors",452 selector: i,453 sampleData: r,454 onChange: this.handleInputChange.bind(this)455 }), l.createElement(k.ParentSelectors, {456 feature: "parentSelectors",457 selector: i,458 onChange: this.handleInputChange.bind(this),459 selectorIds: e460 }), l.createElement("div", {461 className: "form-group"462 }, l.createElement("div", {463 className: "col-lg-offset-1 col-lg-10"464 }, l.createElement("div", {465 className: "btn-block"466 }, l.createElement(x.PerformActionButton, {467 selector: i,468 onClick: this.performAction.bind(this),469 feature: "performActionButton"470 }), l.createElement(h.DataPreviewButton, {471 visible: i.hasFeature("dataPreviewButton"),472 onClick: this.dataPreview.bind(this)473 }), l.createElement("button", {474 id: "save-selector",475 className: "btn btn-primary",476 type: "button",477 onClick: this.saveSelector.bind(this)478 }, chrome.i18n.getMessage("Save_selector")), l.createElement("button", {479 className: "btn btn-danger",480 type: "button",481 onClick: this.cancelEditing.bind(this)482 }, chrome.i18n.getMessage("Cancel"))))), l.createElement("div", {483 className: "form-group"484 }, l.createElement("div", {485 className: "col-lg-offset-1 col-lg-10"486 }))));487 }488 handleValueChange(e, t) {489 const selector = this.state.selector;490 selector[e] = t;491 this.setState({492 selector: selector493 });494 }495 handleInputChange(e) {496 const target = e.target;497 let value = "checkbox" === target.type ? target.checked : target.value;498 const name = target.name;499 const selector = this.state.selector;500 const matchedName = name.match(/^([^\[]+)\[(.*?)\]$/);501 if (matchedName) {502 const prefix = matchedName[1];503 const postFix = matchedName[2].split("][");504 let partOfSelector = selector[prefix];505 for (let index = 0; index <= postFix.length - 2; index++)506 partOfSelector = partOfSelector[postFix[index]];507 partOfSelector[postFix[postFix.length - 1]] = value;508 this.setState({509 selector: selector510 });511 } else {512 if ("select-multiple" === target.type) {513 const e = target.options, n = [];514 for (let t = 0, i = e.length; t < i; t++)515 e[t].selected && n.push(e[t].value);516 value = n;517 }518 if ("id" === name)519 for (const parentSelector in selector.parentSelectors) {520 const t = selector.parentSelectors[parentSelector];521 selector.id === t && selector.parentSelectors.splice(parseInt(parentSelector, 10), 1, value);522 }523 selector[name] = value;524 this.setState({525 selector: selector526 });527 }528 }529 changeSelectorType(e) {530 const t = e.currentTarget.value;531 let i = this.state.selector;532 const n = {533 id: i.id,534 type: t,535 selector: i.selector,536 parentSelectors: i.parentSelectors537 };538 i = C.selectorFactory(n);539 if (!i.canHaveChildSelectors())540 for (const e in i.parentSelectors) {541 const t = i.parentSelectors[e];542 if (i.id === t) {543 i.parentSelectors.splice(parseInt(e, 10), 1);544 break;545 }546 }547 this.setState({548 selector: i549 });550 }551 saveSelector(e) {552 e.preventDefault();553 e.stopPropagation();554 if (!this.isValidForm())555 return !1;556 this.props.appState.saveSelector(this.state.selector);557 }558 cancelEditing(e) {559 e.preventDefault();560 e.stopPropagation();561 this.props.appState.cancelSelectorEditing();562 }563 async selectSelector(e = "selector", t) {//éè¦ï¼ç¹å»selectçæ¯æ¶åï¼ä¼æ§è¡è¿ä¸ª564 t.preventDefault();565 t.stopPropagation();566 const currentTarget = t.currentTarget;567 const sitemap = this.props.appState.sitemap;568 const selector = this.state.selector;569 const selectorBreadcrumb = this.props.appState.selectorBreadcrumb;570 const parentCSSSelector = sitemap.selectors.getParentCSSSelectorWithinOnePage(selectorBreadcrumb);571 const l = await F.DevToolsContentScriptClient.selectSelector({572 parentCSSSelector: parentCSSSelector,573 allowedElements: selector.getItemCSSSelector()574 });575 selector[e] = l.CSSSelector;576 this.setState({577 selector: selector578 });579 if (selector instanceof c.SelectorTable) {580 const e = await this.getSelectorHTML();581 const t = selector.getTableHeaderRowSelectorFromTableHTML(e, o);582 const tableDataRowSelector = selector.getTableDataRowSelectorFromTableHTML(e, o);583 selector.tableHeaderRowSelector = t;584 selector.tableDataRowSelector = tableDataRowSelector;585 const n = selector.getTableHeaderColumnsFromHTML(t, e, o);586 selector.columns = n;587 this.setState({588 selector: selector589 });590 this.revalidateField(o("input[name='tableHeaderRowSelector']").get()[0]);591 this.revalidateField(o("input[name='tableDataRowSelector']").get()[0]);592 }593 this.revalidateField(currentTarget);594 }595 async handleAttributeSelect(e) {596 const element = await F.DevToolsContentScriptClient.getElement(e);597 const attributes = await F.DevToolsContentScriptClient.getAllAttributes(element);598 const result = [];599 for (const attribute in attributes)600 if ("" !== attributes[attribute] && null !== attributes[attribute])601 result.push(attribute);602 return result;603 }604 async selectClickSelector(e) {605 e.preventDefault();606 e.stopPropagation();607 const currentTarget = e.currentTarget;608 const sitemap = this.props.appState.sitemap;609 const selector = this.state.selector;610 const selectorBreadcrumb = this.props.appState.selectorBreadcrumb;611 const parentCSSSelectorWithinOnePage = sitemap.selectors.getParentCSSSelectorWithinOnePage(selectorBreadcrumb);612 const devToolPageContentScriptSelector = await F.DevToolsContentScriptClient.selectSelector({613 parentCSSSelector: parentCSSSelectorWithinOnePage,614 allowedElements: selector.getItemCSSSelector()615 });616 selector.clickElementSelector = devToolPageContentScriptSelector.CSSSelector;617 this.setState({618 selector: selector619 });620 this.revalidateField(currentTarget);621 }622 async selectTableHeaderRowSelector(e) {623 e.preventDefault();624 e.stopPropagation();625 const currentTarget = e.currentTarget;626 const sitemap = this.props.appState.sitemap;627 const selector = this.state.selector;628 const selectorBreadcrumb = this.props.appState.selectorBreadcrumb;629 const parentCSSSelector = sitemap.selectors.getCSSSelectorWithinOnePage(selector.id, selectorBreadcrumb);630 const s = await F.DevToolsContentScriptClient.selectSelector({631 parentCSSSelector: parentCSSSelector,632 allowedElements: "tr"633 });634 selector.tableHeaderRowSelector = s.CSSSelector;635 this.setState({636 selector: selector637 });638 const cssSelector = s.CSSSelector;639 const c = await this.getSelectorHTML();640 const u = selector.getTableHeaderColumnsFromHTML(cssSelector, c, o);641 selector.columns = u;642 this.setState({643 selector: selector644 });645 this.revalidateField(currentTarget);646 }647 async getSelectorHTML() {648 const e = this.state.selector;649 this.props.appState.sitemap = this.props.appState.originalSitemap.clone();650 this.props.appState.sitemap.updateSelector(this.props.appState.originalSelector, e);651 const sitemap = this.props.appState.sitemap;652 const selectorBreadcrumb = this.props.appState.selectorBreadcrumb;653 const n = sitemap.selectors.getCSSSelectorWithinOnePage(e.id, selectorBreadcrumb);654 return await F.DevToolsContentScriptClient.getCssSelectorHTML(n);655 }656 async selectTableDataRowSelector(e) {657 e.preventDefault();658 e.stopPropagation();659 const currentTarget = e.currentTarget;660 const sitemap = this.props.appState.sitemap;661 const selector = this.state.selector;662 const selectorBreadcrumb = this.props.appState.selectorBreadcrumb;663 const cssSelectorWithinOnePage = sitemap.selectors.getCSSSelectorWithinOnePage(selector.id, selectorBreadcrumb);664 const devToolPageContentScriptSelector = await F.DevToolsContentScriptClient.selectSelector({665 parentCSSSelector: cssSelectorWithinOnePage,666 allowedElements: "tr"667 });668 selector.tableDataRowSelector = devToolPageContentScriptSelector.CSSSelector;669 this.setState({670 selector: selector671 });672 this.revalidateField(currentTarget);673 }674 async elementPreview(e = "selector", t) {675 t.preventDefault();676 t.stopPropagation();677 const currentTarget = t.currentTarget;678 if (currentTarget.classList.contains("preview")) {679 await F.DevToolsContentScriptClient.removeCurrentContentSelector();680 currentTarget.classList.remove("preview");681 } else {682 const sitemap = this.props.appState.sitemap;683 const selector = this.state.selector;684 const selectorBreadcrumb = this.props.appState.selectorBreadcrumb;685 const parentCSSSelector = sitemap.selectors.getParentCSSSelectorWithinOnePage(selectorBreadcrumb);686 await F.DevToolsContentScriptClient.elementPreview({687 parentCSSSelector: parentCSSSelector,688 elementCSSSelector: selector[e]689 });690 currentTarget.classList.add("preview");691 }692 }693 async elementPreviewClickSelector(e) {694 e.preventDefault();695 e.stopPropagation();696 const currentTarget = e.currentTarget;697 if (currentTarget.classList.contains("preview")) {698 await F.DevToolsContentScriptClient.removeCurrentContentSelector();699 currentTarget.classList.remove("preview");700 } else {701 const sitemap = this.props.appState.sitemap;702 const selector = this.state.selector;703 const selectorBreadcrumb = this.props.appState.selectorBreadcrumb;704 const parentCSSSelector = sitemap.selectors.getParentCSSSelectorWithinOnePage(selectorBreadcrumb);705 await F.DevToolsContentScriptClient.elementPreview({706 parentCSSSelector: parentCSSSelector,707 elementCSSSelector: selector.clickElementSelector708 });709 currentTarget.classList.add("preview");710 }711 }712 async previewTableRowSelector(e) {713 e.preventDefault();714 e.stopPropagation();715 const currentTarget = e.currentTarget;716 if (currentTarget.classList.contains("preview")) {717 await F.DevToolsContentScriptClient.removeCurrentContentSelector();718 currentTarget.classList.remove("preview");719 } else {720 const sitemap = this.props.appState.sitemap;721 const selector = this.state.selector;722 const selectorBreadcrumb = this.props.appState.selectorBreadcrumb;723 const parentCSSSelector = sitemap.selectors.getCSSSelectorWithinOnePage(selector.id, selectorBreadcrumb);724 const elementCSSSelector = o(currentTarget).closest(".form-group").find("input").val();725 await F.DevToolsContentScriptClient.elementPreview({726 parentCSSSelector: parentCSSSelector,727 elementCSSSelector: elementCSSSelector728 });729 currentTarget.classList.add("preview");730 }731 }732 async dataPreview(e) {733 e.preventDefault();734 e.stopPropagation();735 const selector = this.state.selector;736 const i = this.props.appState.originalSelector;737 this.props.appState.sitemap = this.props.appState.originalSitemap.clone();738 this.props.appState.sitemap.updateSelector(i, selector);739 await this.props.appState.dataPreview(selector.id);740 }741 async performAction(e) {742 e.preventDefault();743 e.stopPropagation();744 await N.RequestPermissions.requestAdditionalPermissions();745 const selector = this.state.selector;746 const originalSelector = this.props.appState.originalSelector;747 const clonedSitemap = this.props.appState.sitemap.clone();748 this.props.appState.sitemap = this.props.appState.originalSitemap.clone();749 this.props.appState.sitemap.updateSelector(originalSelector, selector);750 await this.props.appState.performSelectorAction(selector.id);751 this.props.appState.sitemap = clonedSitemap;752 }753 async refreshSchemaOrgTypes() {754 await N.RequestPermissions.requestAdditionalPermissions();755 const e = await u.backgroundPageClient.findSchemaOrgData();756 let t;757 this.setState({758 schemaOrgExtractorFoundData: e759 });760 if (e.length > 0)761 t = e[0].schemaOrgType;762 this.updateSchemaOrgType(t);763 }764 updateSchemaOrgType(e) {765 const schemaOrgExtractorFoundData = this.state.schemaOrgExtractorFoundData;766 const selector = this.state.selector;767 if (void 0 === e) {768 selector.schemaOrgType = void 0;769 selector.dataObjectSelectors = [];770 this.setState({771 selector: selector772 });773 } else {774 selector.schemaOrgType = e;775 for (const n of schemaOrgExtractorFoundData)776 if (n.schemaOrgType === e) {777 selector.dataObjectSelectors = n.dataObjectSelectors;778 this.setState({779 selector: selector780 });781 }782 }783 }784 handleSchemaOrgTypeChange(e) {785 this.handleInputChange(e);786 const t = e.target.value;787 this.updateSchemaOrgType(t);788 }789 handleMultiRemove(e, t, i) {790 const selector = this.state.selector;791 if (1 === selector[e].length)792 selector[e] = [i];793 else794 selector[e].splice(t, 1);795 this.setState({796 selector: selector797 });798 }799 handleAddMultiValue(e, t) {800 const selector = this.state.selector;801 selector[e].push(t);802 this.setState({803 selector: selector804 });805 }806 async populateSitemapXmlLinksFromRobotsTxt() {807 await N.RequestPermissions.requestAdditionalPermissions();808 const selector = this.state.selector;809 const links = await u.backgroundPageClient.getSitemapXmlLinksFromRobotsTxt();810 let i = A.Arr.mergeUnique(selector.sitemapXmlUrls, links);811 if (i.length > 0)812 i = A.Arr.removeEmpty(i);813 selector.sitemapXmlUrls = i;814 this.setState({815 selector: selector816 });817 }818};819EditSitemapSelectorView = n([s.inject("appState"), s.observer, r("design:paramtypes", [Object])], EditSitemapSelectorView);...
autoScrollTableUtilities.js
Source: autoScrollTableUtilities.js
1import $ from "jquery";2// This is a set of small functions to help construct and start a auto-scrolling table3// Here's the structure that I expect to encounter.4// The auto-scrolling table is inside a CSS3 Grid element, so starting from the top5// <div grid-element> (allows item to span multiple grid items)6// <div class="dataCard"> ()7// <div class="fullCardContainer"> (added this to help with React single-div rule, doesn't do much. Must have 100% width!)8// <table class="headerTable" (separate table just for column headers, so they can stay on screen)9// <div class="bodyTableContainerDiv" (auto-scroll applied to div, not table !)10// <table id="uniqueTableID" (I *could* auto-scroll this table, but then need to be display:block)11//12// Tricky part is that jquery autoscroll only works on div, not table element. And if I convert the table element13// to display:block, then the width:40% trick to set column width doesn't work. So, allow the table to be a table,14// and then simply auto-scroll the surrounding div15// ----------------------------------------------------------------------------16// React seems pretty sharp about remembering the mid-scroll position of an element. So if you re-load a page,17// the element might be mid-way through a scroll. This function simply scrolls the table back to the top18// You call it with the id attached to the table, but it actually scrolls the parent div19export function scrollToTop(uniqueCssSelector) {20 $(uniqueCssSelector)21 .parent()22 .scrollTop(0);23}24// ----------------------------------------------------------------------------25// It's very difficult (impossible ?) to set the height of the div that defines the view into our scrolling26// So, committing a little sin here by reaching into the DOM, measuring a few surrounding elments, and then27// explicitly setting the height of the scrollable div28// This gets called once when the React component mounts, and again whenever the browser window resizes29export function setTableSizeViaJquery(scrollingTableID) {30 // Find the CSS3 grid Item for ourselves (see the expected structure described above)31 let gridItem = $(scrollingTableID)32 .parent()33 .parent()34 .parent();35 // Find the separate table which contains the columns headers (so we can subtract from the overall height)36 let headerTable = gridItem.find(".headerTable");37 // Find the div containing the table for the data (this is the item on which we'll set the height)38 let bodyTableContainerDiv = gridItem.find(".bodyTableContainerDiv");39 // Compute the desired height by tagking the gridItem height, and subtracting what's occupied by the header table40 let desiredTbodyHeight = gridItem.height() - headerTable.height() - 40;41 // console.log("New desired height for widget: ", desiredTbodyHeight);42 // Now set the height for the div (which scrolls) which contains the table of data43 bodyTableContainerDiv.height(desiredTbodyHeight);44}45// ----------------------------------------------------------------------------46// Start the scrolling action on the div which contains the table full of data47export function initScroll(uniqueCssSelector, scrollLengthInSecs) {48 // console.warn("initscroll");49 // convert seconds to milliseconds50 let scrollLengthInMS = scrollLengthInSecs * 1000;51 // Compute how much we should scroll. There's a div that contains all the content, and a div that defines the (smaller) "viewport"52 // Compute the difference between those two (in pixels)53 let scrollDistancePixels =54 $(uniqueCssSelector).height() -55 $(uniqueCssSelector)56 .parent()57 .height();58 // console.warn("scrollDistancePixels: ", scrollDistancePixels);59 // If table has more than can fit into widget, then start scrolling it60 if (scrollDistancePixels > 0) {61 // via jQuery, grab the div which contains the table (see description at top)62 let scrollableDiv = $(uniqueCssSelector).parent();63 // Define a callback function to be used when auto-scroll hits the bottom64 let callbackForWhenScrollHitsBottom = function() {65 // This is the callback for when the animation finishes66 // console.log(uniqueCssSelector + ": Down Scroll Done, so scrolling back to top");67 // The scrollable div (which we want to now scroll up) is the parent of the table containing the data68 let scrollableDiv = $(uniqueCssSelector).parent();69 // Now stop that jQuery scroll (isn't it already stopped ?), and then scroll back to top70 scrollableDiv.stop().animate({ scrollTop: 0 }, scrollLengthInMS, "swing", function() {71 // console.log(uniqueCssSelector + ": Back at the top, so restarting scroll");72 initScroll(uniqueCssSelector, scrollLengthInSecs);73 });74 };75 // Start jQuery scroll animation on that div, here are the expected args76 // arg1: object os properties to animate (scrollTop scrolls vertically, scrollLeft scrolls horizontally)77 // arg2: duration (millseconds ?)78 // arg3: easing function (i.e. linear or swing)79 // arg4: callback when complete80 // Check to see if it's already animating81 if (scrollableDiv.is(":animated")) {82 // console.warn("already animated!");83 } else {84 console.log("starting table scroll animation");85 scrollableDiv.animate(86 {87 scrollTop: scrollDistancePixels88 },89 scrollLengthInMS,90 "swing",91 callbackForWhenScrollHitsBottom92 );93 }94 }95}96// ----------------------------------------------------------------------------97// ----------------------------------------------------------------------------...
index.js
Source: index.js
1import CssOptimumSelectorHelper from './css-traversal-helper'2import $ from 'jquery'3export default class CssOptimumSelector extends CssOptimumSelectorHelper {4 constructor(props) {5 super(props);6 this.multiSelector = this.multiSelector.bind(this)7 this.getMultiSelector = this.getMultiSelector.bind(this)8 this.uniqueCssSelector = this.uniqueCssSelector.bind(this)9 this.getUniqueCssSelector = this.getUniqueCssSelector.bind(this)10 }11 getUniqueCssSelector(element, path = '') {12 if (path && this.isUniqueInDocument(element, path)) return path13 const checkList = this.getCheckList(element)14 const filteredCheckList = this.getFilteredCheckList(checkList)15 const priorityArray = this.formPriorityArray(filteredCheckList)16 const result = this.checkUniqueInParent(element.parent(), priorityArray, path)17 let parentPath = null18 if(result) {19 parentPath = result20 } else {21 parentPath = `${this.nthChildStr(element)}`22 if (path) parentPath = `${parentPath} > ${path}`23 }24 return this.getUniqueCssSelector(element.parent(), parentPath)25 }26 uniqueCssSelector(element) {27 return this.getUniqueCssSelector($(element))28 }29 getMultiSelector(firstElement, secondElement, relativeDepth = this.relativeDepth) {30 const commonParent = this.checkCommonParent(firstElement, secondElement)31 const noCommonSelector = () => [32 this.getUniqueCssSelector(firstElement),33 this.getUniqueCssSelector(secondElement)34 ]35 if (!commonParent) return noCommonSelector()36 const ele1Path = this.childToParentTraversal(firstElement, commonParent).slice(1).join(' > ')37 const ele2Path = this.childToParentTraversal(secondElement, commonParent).slice(1).join(' > ')38 if (this.checkCommonPath(ele1Path, ele2Path)) {39 const path = this.getUniqueCssSelector(commonParent)40 const relativeDegree = this.checkRelativeDegree(ele1Path, ele2Path)41 const relativeChildPath = this.getRelativeChildPath(ele1Path,relativeDepth)42 const commonSelector = `${path} ${relativeChildPath}`43 return [commonSelector]44 }45 return noCommonSelector()46 }47 multiSelector(firstElement, secondElement, relativeDepth = this.relativeDepth) {48 return this.getMultiSelector($(firstElement), $(secondElement), relativeDepth)49 }...
UniqueElementListSpec.js
Source: UniqueElementListSpec.js
1describe("UniqueElementList", function () {2 var $el;3 beforeEach(function () {4 $el = jQuery("#tests").html("");5 if($el.length === 0) {6 $el = $("<div id='tests' style='display:none'></div>").appendTo("body");7 }8 });9 it("it should add only unique elements", function () {10 $el.html("<a>1</a><a>2</a>");11 var list = new UniqueElementList('uniqueText');12 expect(list.length).toEqual(0);13 var $a = $el.find("a");14 list.push($a[0]);15 expect(list.length).toEqual(1);16 list.push($a[0]);17 expect(list.length).toEqual(1);18 list.push($a[1]);19 expect(list.length).toEqual(2);20 list.push($a[1]);21 expect(list.length).toEqual(2);22 });23 it("it should add only unique elements when using uniqueHTMLText type", function () {24 $el.html("<a id='1'>a</a><a id='2'>a</a>");25 var list = new UniqueElementList('uniqueHTMLText');26 expect(list.length).toEqual(0);27 var $a = $el.find("a");28 list.push($a[0]);29 expect(list.length).toEqual(1);30 list.push($a[0]);31 expect(list.length).toEqual(1);32 list.push($a[1]);33 expect(list.length).toEqual(2);34 list.push($a[1]);35 expect(list.length).toEqual(2);36 });37 it("it should add only unique elements when using uniqueHTML type", function () {38 $el.html("<a class='1'>a<span>a</span></a><a class='2'>a<span>b</span></a><a class='1'>c<span>c</span></a>");39 var list = new UniqueElementList('uniqueHTML');40 expect(list.length).toEqual(0);41 var $a = $el.find("a");42 list.push($a[0]);43 expect(list.length).toEqual(1);44 list.push($a[0]);45 expect(list.length).toEqual(1);46 list.push($a[1]);47 expect(list.length).toEqual(2);48 list.push($a[1]);49 expect(list.length).toEqual(2);50 list.push($a[2]);51 expect(list.length).toEqual(2);52 });53 it("it should add only unique elements when using uniqueCSSSelector type", function () {54 $el.html("<a></a><a></a>");55 var list = new UniqueElementList('uniqueCSSSelector');56 expect(list.length).toEqual(0);57 var $a = $el.find("a");58 list.push($a[0]);59 expect(list.length).toEqual(1);60 list.push($a[0]);61 expect(list.length).toEqual(1);62 list.push($a[1]);63 expect(list.length).toEqual(2);64 list.push($a[1]);65 expect(list.length).toEqual(2);66 });...
3241.js
Source: 3241.js
1/**2 * Only Elements unique will be added to this array3 * @constructor4 */5UniqueElementList = function(clickElementUniquenessType) {6 this.clickElementUniquenessType = clickElementUniquenessType;7 this.addedElements = {};8};9UniqueElementList.prototype = new Array;10UniqueElementList.prototype.push = function(element) {11 if(this.isAdded(element)) {12 return false;13 }14 else {15 var elementUniqueId = this.getElementUniqueId(element);16 this.addedElements[elementUniqueId] = true;17 Array.prototype.push.call(this, $(element).clone(true)[0]);18 return true;19 }20};21UniqueElementList.prototype.getElementUniqueId = function(element) {22 if(this.clickElementUniquenessType === 'uniqueText') {23 var elementText = $(element).text().trim();24 return elementText;25 }26 else if(this.clickElementUniquenessType === 'uniqueHTMLText') {27 var elementHTML = $("<div class='-web-scraper-should-not-be-visible'>").append($(element).eq(0).clone()).html();28 return elementHTML;29 }30 else if(this.clickElementUniquenessType === 'uniqueHTML') {31 // get element without text32 var $element = $(element).eq(0).clone();33 var removeText = function($element) {34 $element.contents()35 .filter(function() {36 if(this.nodeType !== 3) {37 removeText($(this));38 }39 return this.nodeType == 3; //Node.TEXT_NODE40 }).remove();41 };42 removeText($element);43 var elementHTML = $("<div class='-web-scraper-should-not-be-visible'>").append($element).html();44 return elementHTML;45 }46 else if(this.clickElementUniquenessType === 'uniqueCSSSelector') {47 var cs = new CssSelector({48 enableSmartTableSelector: false,49 parent: $("body")[0],50 enableResultStripping:false51 });52 var CSSSelector = cs.getCssSelector([element]);53 return CSSSelector;54 }55 else {56 throw "Invalid clickElementUniquenessType "+this.clickElementUniquenessType;57 }58};59UniqueElementList.prototype.isAdded = function(element) {60 var elementUniqueId = this.getElementUniqueId(element);61 var isAdded = elementUniqueId in this.addedElements;62 return isAdded;...
UniqueElementList.js
Source: UniqueElementList.js
1class UniqueElementList {2 constructor(e) {3 this.elementUniquenessType = e;4 this.addedElements = {};5 this.elements = [];6 }7 async push(e) {8 const t = await this.getElementUniqueId(e);9 if (this.isAdded(t))10 return false;11 else12 {13 this.addedElements[t] = !0;14 const i = await e.getClone();15 this.elements.push(i);16 return true;17 }18 }19 async getElementUniqueId(e) {20 let t;21 if ("uniqueText" === this.elementUniquenessType)22 t = await e.getText();23 else if ("uniqueHTMLText" === this.elementUniquenessType)24 t = await e.getWrappedHTML();25 else if ("uniqueHTML" === this.elementUniquenessType)26 t = await e.getWrappedHTMLWithoutText();27 else {28 if ("uniqueCSSSelector" !== this.elementUniquenessType) {29 throw "Invalid elementUniquenessType " + this.elementUniquenessType;30 }31 t = await e.getCSSSelector();32 }33 return t;34 }35 async isElementAdded(e) {36 return (await this.getElementUniqueId(e)) in this.addedElements;37 }38 isAdded(e) {39 return e in this.addedElements;40 }41 get length() {42 return this.elements.length;43 }44 getElements() {45 return this.elements;46 }47}...
Using AI Code Generation
1const { uniqueCSSSelector } = 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();
Using AI Code Generation
1const { uniqueCSSSelector } = require('playwright/lib/server/dom.js');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 const selector = await page.$eval('text=Get started', uniqueCSSSelector);8 console.log(selector);
Using AI Code Generation
1const { uniqueCSSSelector } = require('playwright-core/lib/server/dom.js');2const { chromium } = require('playwright-core');3(async () => {4 const browser = await chromium.launch({ headless: false });5 const context = await browser.newContext();6 const page = await context.newPage();7 const elementHandle = await page.$('input[type="text"]');8 const cssSelector = await uniqueCSSSelector(elementHandle);9 console.log(cssSelector);10 await browser.close();11})();12const { uniqueCSSSelector } = require('playwright-core/lib/server/dom.js');13const { chromium } = require('playwright-core');14(async () => {15 const browser = await chromium.launch({ headless: false });16 const context = await browser.newContext();17 const page = await context.newPage();18 const elementHandle = await page.$('input[type="text"]');19 const cssSelector = await uniqueCSSSelector(elementHandle);20 console.log(cssSelector);21 await browser.close();22})();23const { uniqueCSSSelector } = require('playwright-core/lib/server/dom.js');24const { chromium } = require('playwright-core');25(async () => {26 const browser = await chromium.launch({ headless: false });27 const context = await browser.newContext();28 const page = await context.newPage();29 const elementHandle = await page.$('input[type="text"]');30 const cssSelector = await uniqueCSSSelector(elementHandle);31 console.log(cssSelector);32 await browser.close();33})();34const {
Using AI Code Generation
1const { uniqueCSSSelector } = require('@playwright/test/lib/internal/selectorEngine');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 const uniqueCSSSelectorString = await uniqueCSSSelector(page.locator('#hplogo'));8 console.log(uniqueCSSSelectorString);9 await browser.close();10})();
Using AI Code Generation
1const { uniqueCSSSelector } = require('playwright/lib/internal/selectors/selectorEngine');2const { selectors } = require('playwright/lib/internal/selectors/evaluators');3const { ElementHandle } = require('playwright/lib/cjs/pw_exports');4const element = await page.$('a');5const selector = uniqueCSSSelector(element, selectors);6console.log(selector);
Using AI Code Generation
1const { uniqueCSSSelector } = require('playwright/lib/server/dom.js');2const { chromium } = require('playwright');3(async () => {4 const browser = await chromium.launch({ headless: false });5 const context = await browser.newContext();6 const page = await context.newPage();7 const selector = await page.evaluate((element) => {8 return uniqueCSSSelector(element);9 }, await page.$('text=Get started'));10 console.log(selector);11 await browser.close();12})();
Using AI Code Generation
1const { uniqueCSSSelector } = require('playwright/lib/internal/injected/uniqueSelector');2const selector = uniqueCSSSelector(document.querySelector('a'));3console.log(selector);4const { uniqueCSSSelector } = require('playwright/lib/server/injected/uniqueSelector');5const selector = uniqueCSSSelector(document.querySelector('a'));6console.log(selector);7const { uniqueCSSSelector } = require('playwright/lib/server/injected/uniqueSelector');8const selector = uniqueCSSSelector(document.querySelector('a'));9console.log(selector);10const { uniqueCSSSelector } = require('playwright/lib/server/injected/uniqueSelector');11const selector = uniqueCSSSelector(document.querySelector('a'));12console.log(selector);13const { uniqueCSSSelector } = require('playwright/lib/server/injected/uniqueSelector');14const selector = uniqueCSSSelector(document.querySelector('a'));15console.log(selector);16const { uniqueCSSSelector } = require('playwright/lib/server/injected/uniqueSelector');17const selector = uniqueCSSSelector(document.querySelector('a'));18console.log(selector);19const { uniqueCSSSelector } = require('playwright/lib/server/injected/uniqueSelector');20const selector = uniqueCSSSelector(document.querySelector('a'));21console.log(selector);22const { uniqueCSSSelector } = require('playwright/lib/server/injected/uniqueSelector');23const selector = uniqueCSSSelector(document.querySelector('a'));24console.log(selector);25const { uniqueCSSSelector } = require('playwright/lib/server/injected/uniqueSelector');26const selector = uniqueCSSSelector(document.querySelector('a'));27console.log(selector);28const { uniqueCSSSelector } = require('playwright/lib/server/injected/uniqueSelector');29const selector = uniqueCSSSelector(document.querySelector('a'));30console.log(selector);31const { uniqueCSSSelector } = require('playwright/lib/server/injected/uniqueSelector');32const selector = uniqueCSSSelector(document.querySelector('a'));33console.log(selector);
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!!