I’ve been in front-end development long enough to see a trend over the years: developers nkumaa a wɔde nhyehyeɛ ho nhwɛsoɔ foforɔ reyɛ adwuma a wɔnte abakɔsɛm mu nsɛm a ɛfa ho no ase. Nokwarem no, ntease wom koraa sɛ wunnim biribi. Wɛb no yɛ beaeɛ kɛseɛ paa a ɛwɔ ahokokwaa ne nneɛma titire ahodoɔ, na ɛnyɛ berɛ nyinaa na yɛnim deɛ yɛnnim. Adesua wɔ saa adwuma yi mu yɛ akwantu a ɛkɔ so sen sɛ ɛbɛyɛ biribi a ɛba pɛnkoro na ɛba awiei. Asɛm a ɛfa ho: Obi a ɔwɔ me kuw no mu bisaa sɛ ɛyɛ yiye sɛ wobehu sɛ ebia wɔn a wɔde di dwuma no kɔ akyirikyiri fi tab pɔtee bi a ɛwɔ UI no mu anaa. Mekyerɛɛ JavaScript’s beforeunload adeyɛ no. Nanso wɔn a wɔadi eyi ho dwuma pɛn no nim sɛ eyi betumi aba efisɛ wɔde kɔkɔbɔ ahorow a ɛfa data a wɔankora so wɔ wɛbsaet afoforo so abɔ wɔn, a beforeunload yɛ ade a wɔtaa de di dwuma. Mesan nso kyerɛɛ pageHide ne visibilityChange nsɛm a esisi no kyerɛɛ me yɔnko dwumayɛni no maa susudua pa. Ɛyɛɛ dɛn na mihuu saa asɛm no? Efisɛ ɛbaa adwuma foforo mu, ɛnyɛ sɛ misuaa ho ade bere a mfiase no na meresua JavaScript nti. Nokwasɛm ne sɛ nnɛyi anim nhyehyɛe ahorow gyina mfiridwuma mu abran a wodii wɔn anim no mmati so. Wɔtwetwe nkɔso nneyɛe, mpɛn pii no ma developer osuahu a eye a ɛtew, anaasɛ mpo eyi, hia a ehia sɛ wohu anaa wɔde wɔn nsa ka nea efi tete no ayɛ anim-akyi nsusuwii a ɛho hia a ebia ɛsɛ sɛ obiara hu no fi hɔ. Susuw CSS Adeɛ Nhwɛsoɔ (CSSOM) ho. Ebia wobɛhwɛ kwan sɛ obiara a ɔreyɛ adwuma wɔ CSS ne JavaScript mu no wɔ nsaanodwuma CSSOM osuahu pii, nanso ɛnyɛ bere nyinaa na ɛbɛyɛ saa. Na React adwuma bi wɔ hɔ ma e-commerce site bi a meyɛɛ adwuma wɔ so a na ɛhia sɛ yɛde stylesheet hyɛ mu ma mprempren payment provider a yɛapaw no. Ɔhaw no ne sɛ na stylesheet no rehyɛ kratafa biara so bere a na ɛho hia ankasa wɔ kratafa pɔtee bi so nkutoo. Na developer a wɔde ahyɛ ne nsa sɛ ɔmma eyi nsi no nyɛɛ stylesheet dynamically da. Bio nso, eyi yɛ nea ntease wom koraa bere a React twetwe atetesɛm kwan a ebia woadu ho no. Ɛda adi sɛ CSSOM no nyɛ biribi a wuhia wɔ wo da biara da adwuma mu. Nanso ɛda adi sɛ ebehia sɛ wo ne no di nkitaho wɔ bere bi mu, wɔ asɛm a ɛba pɛnkoro mpo mu. Saa osuahu ahorow yi kanyan me ma mekyerɛw asɛm yi. Wɛb nneɛma ne mfiridwuma pii wɔ hɔ a ɛwɔ hɔ dedaw wɔ wuram a ebia woremfa wo nsa nka tẽẽ da wɔ wo da biara da adwuma mu. Ebia woyɛ foforo koraa wɔ wɛb nkɔso mu na wunnim wɔn kɛkɛ efisɛ woakɔhyɛ abstraction a ɛfa nhyehyɛe pɔtee bi ho a enhia sɛ wuhu no kɔ akyiri, anaasɛ mpo koraa. M’aka XML ho asɛm pɔtee, a yɛn mu pii nim sɛ ɛyɛ tete kasa a ɛnsɛ koraa wɔ HTML ho. I’m bringing this up because of recent WHATWG discussions a ɛkyerɛ sɛ ɛsɛ sɛ woyi XML stack a wonim no sɛ XSLT programming no fã titiriw bi fi browser ahorow mu. Eyi yɛ mfiridwuma dedaw, a ɛwɔ hɔ dedaw a yɛanya mfe pii a yebetumi de adi dwuma ama biribi a mfaso wɔ so te sɛ CSSOM tebea a na me kuw no wɔ no pɛpɛɛpɛ. So wo ne XSLT ayɛ adwuma pɛn? Momma yɛnhwɛ sɛ yɛde yɛn ho bɛto saa mfiridwuma dedaw yi so kɛse na yɛde ne nneɛma a ɛwɔ XML akyi no adi dwuma de adi wiase ankasa mu ɔhaw ahorow ho dwuma nnɛ anaa. XPath: Mfinimfini API no XML mfiridwuma a ɛho hia paa a ebia ɛyɛ mfasoɔ kɛseɛ wɔ XML adwene a ɛyɛ tẽẽ akyi ne XPath, asɛmmisa kasa a ɛma wo kwan ma wohunu node anaa su biara wɔ markup dua a ɛwɔ ntini element baako mu. Mewɔ ankorankoro dɔ ma XSLT, nanso ɛno nso gyina XPath so, na ɛsɛ sɛ wɔde ankorankoro dɔ to nkyɛn wɔ ranking hia mu. Akyinnyegye a ɛfa XSLT a wobeyi afi hɔ ho no nka XPath ho asɛm biara, enti misusuw sɛ wɔda so ara ma ho kwan. Ɛno ye ɛfiri sɛ XPath yɛ API a ɛwɔ mfimfini na ɛho hia paa wɔ saa mfiridwuma ahodoɔ yi mu, titire berɛ a worebɔ mmɔden sɛ wobɛnya biribi a wode bedi dwuma wɔ XML dwumadie a ɛyɛ daa akyi. Ɛho hia ɛfiri sɛ, ɛwom sɛ wobɛtumi de CSS selectors adi dwuma de ahwehwɛ element dodoɔ no ara wɔ wo krataafa no mu deɛ, nanso wɔrentumi nhunu ne nyinaa. Bio nso, wontumi mfa CSS selectors nni dwuma mfa nhwehwɛ element bi a egyina ne mprempren gyinabea wɔ DOM no mu. XPath betumi. Afei, ebia mo mu binom a mokenkan yei nim XPath, na ebinom nso nnim. XPath yɛ mfiridwuma mu beaeɛ kɛseɛ yie, na mentumi nkyerɛkyerɛ mfitiaseɛ nyinaa ankasa na mesan nso nkyerɛ wo nneɛma a ɛyɛ nwini a wode bɛyɛ wɔ asɛm baako te sɛ yei mu. Mebɔɔ mmɔden ankasa sɛ mɛkyerɛw saa asɛm no, nanso sɛ wɔkyekyem pɛpɛɛpɛ a, Smashing Magazine nhoma no nkɔ akyiri nsen nsɛmfua 5,000. Ná mewɔ nea ɛboro saa dedawnsɛmfua 2,000 bere a ɛyɛ mfitiasede no fã pɛ. Enti, m’ahyɛ aseɛ ayɛ nneɛma a ɛyɛ nwini ne XPath na mama wo links bi a wobɛtumi de adi dwuma ama mfitiaseɛ no sɛ wohunu sɛ saa nneɛma yi yɛ anigyeɛ a. XPath & CSS a wɔde bɛka abom XPath tumi yɛ nneɛma pii a CSS selectors ntumi nyɛ bere a wɔrebisa elements. Nanso CSS selectors nso tumi yɛ nneɛma kakraa bi a XPath ntumi, a ɛne sɛ, bisa elements denam class din so.

CSS XPath na ɛwɔ hɔ .meKlass /*[contains (@ adesuakuw, "meKlas")].

Wɔ saa nhwɛsoɔ yi mu no, CSS bisa elements a ɛwɔ .myClass classname. Saa berɛ yi, XPath nhwɛsoɔ no bisa elements a ɛwɔ attribute class a ɛwɔ string “myClass”. Ɔkwan foforo so no, ɛpaw nneɛma a ɛwɔ myClass wɔ su biara mu, a nneɛma a ɛwɔ .myClass adesua din ka ho — ne nneɛma a ɛwɔ “myClass” wɔ ahama no mu, te sɛ .myClass2. XPath trɛw wɔ saa ntease no mu. Enti, dabi. I’m not suggesting sɛ ɛsɛ sɛ yɛ toss out CSS na yɛhyɛ aseɛ paw elements nyinaa via XPath. Ɛnyɛ ɛno ne asɛm no. Asɛm no ne sɛ XPath tumi yɛ nneɛma a CSS ntumi na ɛda so ara betumi ayɛ nea mfaso wɔ so kɛse, ɛwom mpo sɛ ɛyɛ mfiridwuma dedaw wɔ browser stack no mu na ebia ɛbɛyɛ te sɛ nea ɛda adi pefee wɔ nea edi kan a wohwɛ mu de. Momma yɛmfa mfiridwuma abien no nkabom nyɛ sɛ yebetumi nko nti, na mmom esiane sɛ yebesua biribi afa XPath ho wɔ adeyɛ no mu nti, ama ayɛ adwinnade foforo wɔ wo stack no mu — nea ebia na wunnim no wɔ hɔ bere nyinaa! Ɔhaw no ne sɛ JavaScript’s document.evaluate kwan ne query selector akwan ahodoɔ a yɛde di dwuma ne CSS APIs ma JavaScript no nhyia. Mayɛ API a ɛne sɛ yɛbɛbisabisa a ɛne no hyia de ahyɛ aseɛ, ɛwom sɛ megye tom sɛ, mamfa adwene pii anhyɛ mu ɛfiri sɛ ɛyɛ twe a yɛfiri deɛ yɛreyɛ wɔ ha no ho. Ɛha na adwumayɛ nhwɛsoɔ a ɛnyɛ den koraa a ɛfa asɛmmisa dansifoɔ a wɔtumi de di dwuma bio ho ni: Hwɛ Pen queryXPath [forked] a Bryan Rasmussen yɛe no. M’ayɛ akwan mmienu aka ho wɔ krataa adeɛ no so: queryCSSSelectors (a ne titire ne querySelectorAll) ne queryXPaths. Eyinom nyinaa san de queryResults ade bi ba:

{ asɛmmisaType: nodes | ahama | nɔma | boolean, . nea efi mu ba: biara[] // html nneɛma, xml nneɛma, nhama, nɔma, booleans, . queryCSSSelectors: (asɛmmisa: ahama, nsakrae: boolean) => asɛmmisaResults, . queryXpaths: (asɛmmisa: ahama, nsakrae: boolean) => asɛmmisaResults } .

QueryCSSSelectors ne queryXpaths dwumadie no tu asɛmmisa a wode ma wɔn no so wɔ elements a ɛwɔ results array no mu, berɛ dodoɔ a results array no yɛ type nodes, nokwarem no. Sɛ ɛnte saa a, ɛbɛsan de queryResult a ɛwɔ array a hwee nni mu ne nodes bi. Sɛ wɔde amend property no si nokware a, dwumadie no bɛsesa wɔn ankasa queryResults. Ɛnsɛ sɛ wɔde eyi di dwuma wɔ tebea biara mu wɔ baabi a wɔyɛ nneɛma. Mereyɛ no saa kwan yi so ara kwa sɛ mɛkyerɛ nsunsuansoɔ ahodoɔ a ɛfiri sɛ wɔde asɛmmisa API mmienu no bom di dwuma. Nhwɛso Nsɛmmisa Mepɛ sɛ mekyerɛ nhwɛsoɔ kakra a ɛfa XPath abisadeɛ ahodoɔ a ɛkyerɛ nneɛma a tumi wom bi a wɔbɛtumi ayɛ ne sɛdeɛ wɔbɛtumi de adi dwuma wɔ akwan foforɔ ananmu. Nhwɛsoɔ a ɛdi kan ne //li/text(). Wei bisa li elements nyinaa na ɛsan de wɔn text nodes no ba. Enti, sɛ yɛbɛbisa HTML a edidi so yi a:

  • baako
  • abien
  • abiɛsa

...eyi ne nea wɔsan de ba:

{"queryType":"xpathEvaluate","aba":["baako","abien","abiɛsa"],"resultType":"string"}

Ɔkwan foforo so no, yenya nhyehyɛe a edidi so yi: ["baako","abien","abiɛsa"]. Mpɛn pii no, wobɛbisa li elements no na ama woanya saa, adan nea ɛfiri saa asɛmmisa no mu aba no ayɛ no array, map array no, na woasan de element biara text node aba. Nanso yebetumi de XPath ayɛ saa tiawa kɛse: document.queryXPaths ("//li / nkyerɛwee ()"). nea efi mu ba.

Hyɛ no nsow sɛ ɔkwan a wobɛfa so anya text node ne sɛ wode text(), a ɛte sɛ function signature bedi dwuma — na ɛte saa. Ɛsan de element bi text node no ba. Wɔ yɛn nhwɛsoɔ no mu no, li elements mmiɛnsa na ɛwɔ markup no mu, a emu biara kura nsɛm ("baako", "abien", ne "abiɛsa"). Momma yɛnhwɛ nhwɛsoɔ baako bio a ɛfa text() asɛmmisa ho. Fa no sɛ eyi ne yɛn markup: Wɔde wo ho hyɛ mu

Momma yɛnkyerɛw asɛmmisa bi a ɛsan de href attribute value no ba: document.queryXPaths ("//a [text () = 'Hyɛ mu']/@href"). nea efi mu ba.

Eyi yɛ XPath asɛmmisa wɔ mprempren krataa no so, te sɛ nhwɛso a etwa to no ara pɛ, nanso saa bere yi de yɛsan de href su a ɛwɔ link (element bi) a nkyerɛwee “Sign In” wom no san ba. Ankasa no san baenea efi mu ba ne ["/login.html"]. XPath Dwumadie Ho Nsɛm a Wɔaka abom XPath dwumadie dodoɔ bi wɔ hɔ, na ebia wunnim. Misusuw sɛ dodow bi wɔ hɔ a ɛfata sɛ wuhu ho asɛm, a nea edidi so yi ka ho:

starts-withSɛ nkyerɛwee bi fi ase de nkyerɛwee nhwɛso foforo pɔtee bi a, starts-with(@href, 'http:') san de nokware ba sɛ href su bi fi ase wɔ http: a. containsSɛ nkyerɛwee bi kura nkyerɛwee nhwɛsoɔ foforɔ pɔtee bi a, contains(text(), "Smashing Magazine") san de nokware ba sɛ nkyerɛwee node bi kura nsɛmfua “Smashing Magazine” wɔ mu wɔ baabiara a. countSansan de akontabuo dodoɔ a ɛwɔ hɔ a ɛne asɛmmisa bi hyia. Sɛ nhwɛsoɔ no, count(//*[starts-with(@href, 'http:']) san de akontaabuo a ɛkyerɛ sɛnea link dodoɔ a ɛwɔ context node no mu wɔ elements a ɛwɔ href attribute a ɛwɔ text a ɛfiri aseɛ wɔ http:. substringƐyɛ adwuma te sɛ JavaScript substring, gye sɛ wode ahama no kɔ sɛ akasakasa. Sɛ nhwɛso no, substring("me nkyerɛwee", 2, 4) san de "y t". substring-beforeSansan de ahama bi fã bi di ahama foforo anim. Sɛ nhwɛso no, substing-before("me nkyerɛwee", " ") san de "me" ba. Saa ara nso na substring-before("hi","bye") san de ahama a ɛda mpan ba. substring-afterSɛsan de ahama bi fã di ahama foforo akyi. Sɛ nhwɛso no, substing-after("me nkyerɛwee", " ") san de "nkyerɛwee". Saa ara nso na substring-after("hi","bye")san de ahama a ɛda mpan ba. normalize-spaceSansan de akasakasa ahama a ɛwɔ whitespace normalized denam fitaa a ɛdi anim ne akyi a wobɛyi afiri mu na wode ahunmu baako asi whitespace nkyerɛwdeɛ a ɛtoatoa so no ananmu. notReturns boolean true sɛ akyinnyegye no yɛ atoro a, anyɛ saa a ɛyɛ atoro. nokwareSɛsan de boolean nokware ba. falseƐsan de boolean atoro ba. concatAdeɛ korɔ no ara a JavaScript concat yɛ, gye sɛ wo nnyɛ no sɛ ɔkwan wɔ ahama so. Mmom no, wode nhama a wopɛ sɛ wode bom no nyinaa hyɛ mu. string-lengthEyi ne JavaScript string-length nnyɛ pɛ, na mmom ɛsan de ahama a wɔde ama no no tenten ba sɛ akasakasa. translateEyi fa ahama na ɛsesa asɛm a ɛtɔ so mmienu no kɔ akasakasa a ɛtɔ so mmiɛnsa no so. Sɛ nhwɛso no, translate("abcdef", "abc", "XYZ") de XYZdef fi adi.

Sɛ yɛde XPath dwumadie pɔtee yi to nkyɛn a, dwumadie foforɔ dodoɔ bi wɔ hɔ a ɛyɛ adwuma te sɛ wɔn JavaScript mfɛfoɔ — anaa mfɛfoɔ a ɛwɔ dwumadie kasa biara mu titire — a ebia wobɛhunu nso sɛ ɛho wɔ mfasoɔ, te sɛ fam, ɔdan atifi, kurukuruwa, sum, ne nea ɛkeka ho. Demo a edidi so yi kyerɛ saa dwumadi ahorow yi mu biara: Hwɛ Pen XPath Nkontaabu dwumadie [forked] a Bryan Rasmussen yɛeɛ. Hyɛ no nsow sɛ, te sɛ string manipulation functions dodow no ara no, akontaahyɛde no pii gye input biako. Eyi te saa, nokwarem no, efisɛ wɔkyerɛ sɛ wɔde di dwuma de bisabisa, sɛnea ɛte wɔ XPath nhwɛso a etwa to no mu no: //li [fam (nkyerɛwee ()) > 250] / @ val

Sɛ wode di dwuma, sɛnea nhwɛso dodow no ara yɛ no a, wubewie a wobɛtu mmirika wɔ node a edi kan a ɛne ɔkwan no hyia no so. Afei nso type conversion dwumadie bi wɔ hɔ a ebia ɛsɛ sɛ wokwati ɛfiri sɛ JavaScript wɔ n’ankasa type conversion haw dedaw. Nanso mmere bi betumi aba a wopɛ sɛ wodan ahama bi kɔ nɔma bi mu sɛnea ɛbɛyɛ a wobɛhwɛ no ne nɔma foforo bi. Dwumadie a ɛde biribi su si hɔ ne boolean, nɔma, ahama, ne node. Eyinom ne XPath datatypes a ɛho hia. Na sɛnea ebia wubesusuw no, wobetumi de saa dwumadie yi mu dodoɔ no ara adi dwuma wɔ datatypes a ɛnyɛ DOM nodes so. Sɛ nhwɛsoɔ no, substring-after fa ahama bi sɛdeɛ yɛakata so dada no, nanso ɛbɛtumi ayɛ ahama a ɛfiri href su bi mu. Ebetumi nso ayɛ ahama bi kɛkɛ:

const testSubstringAfter = document.queryXPaths ("substring-akyi ('kyea wiase',' ')");

Ɛda adi sɛ, saa nhwɛsoɔ yi bɛma yɛasan ama aba nhyehyɛeɛ no sɛ ["wiase"]. Sɛnea ɛbɛyɛ a mɛkyerɛ eyi wɔ adeyɛ mu no, mayɛ demo krataafa a mede functions di dwuma tia nneɛma a ɛnyɛ DOM nodes: Hwɛ Pen queryXPath [forked] a Bryan Rasmussen yɛe no. Ɛsɛ sɛ wohyɛ nkyerɛaseɛ dwumadie no fã a ɛyɛ nwonwa no nsow, a ɛne sɛ sɛ wowɔ nkyerɛwdeɛ bi wɔ akyinnyegyeɛ a ɛtɔ so mmienu no mu (i.e., nkyerɛwdeɛ a wopɛ sɛ wɔkyerɛ aseɛ no din) na nkyerɛwdeɛ a ɛne no hyia biara nni hɔ a wobɛkyerɛ aseɛ akɔ a, saa nkyerɛwdeɛ no bɛyi afiri afiri no mu. Enti, eyi:

translate('Hello, Me Din ne Inigo Montoya, wokum me papa, siesie wo ho sɛ wobɛwu','abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,','*')

...ɛfiri mu ba wɔ ahama no mu, a spaces ka ho: [" * * ** "]

Wei kyerɛ sɛ wɔrekyerɛ nkyerɛwde “a” ase akɔ nsoromma (*) mu, nanso wɔayi nkyerɛwde foforo biara a enni nkyerɛase a wɔde ama hama a wɔde asi wɔn ani so no afi hɔ koraa. Whitespace no nkutoo ne nea akankyerɛwde “a” a wɔakyerɛ ase no ntam. Afei bio, asɛmmisa yi:

translate('Hello, Me Din ne Inigo Montoya, wokum me papa, siesie wo ho sɛ wubewu','abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,','******************************************************')")

...enni ɔhaw no na ɛde aba a ɛte sɛ eyi ba:

"***** ** **** ** ***** ******* *** ****** ** ****** ******* ** ***"

Ebia ɛbɛyɛ wo nwonwa sɛ ɔkwan biara nni hɔ a ɛyɛ mmerɛw wɔ JavaScript mu a wobɛfa so ayɛ nea XPath nkyerɛase adwuma no yɛ no pɛpɛɛpɛ, ɛwom sɛ wɔ nsɛm pii a wɔde di dwuma mu no, replaceAll ne daa nsɛmfua betumi adi ho dwuma de. Wubetumi de ɔkwan koro no ara a mada no adi no adi dwuma, nanso ɛno yɛ suboptimal sɛ nea wopɛ ara ne sɛ wobɛkyerɛ nhama no ase a. Demo a edidi so yi kyekyere XPath’s translate function no de JavaScript version ma: Hwɛ Pen nkyerɛase adwuma [forked] a Bryan Rasmussen yɛe no. Ɛhe na wubetumi de biribi a ɛte sɛɛ adi dwuma? Susuw Caesar Cipher encryption a ɛwɔ mmeae abiɛsa offset (e.g., top-of-the-line encryption a efi 48 A.Y.B.):

translate("Kaesare reyɛ nhyehyɛe sɛ obetwa Rubicon!", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" a ɔyɛ ɔbarima a ɔyɛ ɔbarima a ɔyɛ ɔdefo. "XYZABCDEFGHIJKLMNOPQRSTUVWxyzabcdefghijklmnopqrstuvw") Ɔde ne nsa kyerɛɛ ne so, na ɔde ne nsa kyerɛɛ ne so bio.

The input text “Kaesare reyɛ nhyehyɛe sɛ obetwa Rubicon!” nea efi mu ba ne “Zxbpxo fp mixkkfkd ql zolpp qeb Oryfzlk!” Sɛ mɛma nhwɛsoɔ foforɔ a ɛyɛ ntɛm a ɛfa nneɛma ahodoɔ a ɛbɛtumi aba ho a, meyɛɛ dadeɛ dwumadie a ɛfa ahama input na ɛde nkyerɛaseɛ dwumadie di dwuma de san nsɛm no ba, a nkyerɛwdeɛ a ɛfa umlauts nyinaa ka ho. Hwɛ Pen dade dwumadi [forked] a Bryan Rasmussen yɛe no.

const dade = (abɔnten so) => { . san kɔ nkyerɛase (str, "AOUaou","ÄÖÜäöü"); } .

Na, sɛ wɔde nkyerɛwee a ɛne “Motley Crue di mmara, rock on dudes!”, ma a, ɛsan de “Mötley Crüe rüles, röck ön düdes!” Ɛda adi sɛ ebia obi benya saa dwumadi yi a wɔde di dwuma wɔ aseresɛm mu ahorow nyinaa. Sɛ ɛno ne wo a, ɛnde ɛsɛ sɛ TVTropes asɛm yi ma wo nhyɛso pii. CSS a Wɔde Di Dwuma Ne XPath Kae yɛn ade titiriw nti a yɛde CSS selectors di dwuma bom ne XPath: CSS te nea class yɛ ase yiye, bere a nea eye sen biara a wubetumi de XPath ayɛ ne string ntotoho a ɛfa class attribute no ho. Ɛno bɛyɛ adwuma wɔ nsɛm dodow no ara mu. Nanso sɛ wobɛkɔ tebea bi mu da bi a, sɛ yɛbɛka no yiye a, obi abɔ adesua ahorow a wɔato din .primaryLinks ne .primaryLinks2 na wode XPath redi dwuma de anya .primaryLinks adesuakuw no a, ɛnde ɛda adi sɛ wubehyia ɔhaw ahorow. Bere tenten a nkwaseasɛm biara nni hɔ a ɛte saa no, ebia wode XPath bedi dwuma. Nanso ɛyɛ me yaw sɛ mɛbɔ amanneɛ sɛ mayɛ adwuma wɔ mmeae a nkurɔfo yɛ saa nkwaseasɛm ahorow no. Here’s another demo a wɔde CSS ne XPath bom di dwuma. Ɛkyerɛ nea ɛba bere a yɛde code no di dwuma de tu XPath wɔ context node a ɛnyɛ document’s node so. Hwɛ Pen css ne xpath a wɔaka abom [forked] a Bryan Rasmussen yɛe. CSS asɛmmisa no yɛ .relatedarticles a, a ɛgye a element mmienu no wɔ div a wɔde .relatedarticles adesua ama no mu. Ɛno akyi no, nsɛmmisa abiɛsa “bɔne” na ɛwɔ hɔ, kyerɛ sɛ, nsɛmmisa a ɛnyɛ nea yɛpɛ sɛ wɔyɛ bere a wɔde saa nneɛma yi retu mmirika sɛ nsɛm a ɛfa ho node no. Metumi akyerɛkyerɛ nea enti a wɔreyɛ wɔn ade wɔ ɔkwan soronko so sen sɛnea ebia wobɛhwɛ kwan no mu. Nsɛmmisa bɔne abiɛsa a yɛreka ho asɛm no ne:

//text(): Sane de nsɛm a ɛwɔ krataa no mu nyinaa ba. //a/text(): Sane de nsɛm a ɛwɔ link ahorow a ɛwɔ krataa no mu nyinaa ba. ./a/text(): Ɛsan de aba biara ba.

Nea enti a saa aba yi ba ne sɛ bere a wo nsɛm a ɛfa ho no yɛ elements a wɔasan de afi CSS asɛmmisa no mu no, // kɔ tia krataa no nyinaa. Eyi ne ahoɔden a ɛwɔ XPath mu; CSS ntumi mfi node bi so nkɔ nana bi so na afei nkɔ saa nana no nua bi nkyɛn, na ɛnkɔ fam nkɔ saa onua no aseni bi nkyɛn. Nanso XPath betumi. Saa bere yi mu no, ./ bisa mprempren node no mma, faako a dot (.) gyina hɔ ma mprempren node no, na forward slash (/) gyina hɔ ma sɛ wobɛkɔ abofra node bi mu — sɛ ɛyɛ su, element, anaa nkyerɛwee no, ɔkwan no fã a edi hɔ no na ɛkyerɛ. Nanso abofra biara nni hɔ a element a CSS asɛmmisa no apaw, enti saa asɛmmisa no nso nsan mfa hwee mma. Nsɛmmisa pa abiɛsa na ɛwɔ saa demo a etwa to no mu:

.//nkyerɛwee (), . ./nkyerɛwee (), . normalize-space (. / nkyerɛwee ()).

Normalize-space asɛmmisa no kyerɛ XPath dwumadie dwumadie, nanso ɛsan siesie ɔhaw bi a ɛka asɛmmisa afoforɔ no ho. Wɔahyehyɛ HTML no sɛnea ɛte yi:

Wo Feature Sɔhwɛ a Wobɛyɛ no Automating ne Selenium WebDriver

Asɛmmisa no san de line feed bi ba wɔ text node no mfiase ne n’awiei, .na normalize-space yi eyi fi hɔ. XPath dwumadie biara a ɛsan de biribi foforɔ a ɛnyɛ boolean a ɛwɔ input XPath di dwuma no fa dwumadie foforɔ ho. Demo a edidi so yi kyerɛ nhwɛso ahorow bi: Hwɛ Pen xpath dwumadie nhwɛsoɔ [forked] a Bryan Rasmussen yɛeɛ. Nhwɛso a edi kan no kyerɛ ɔhaw bi a ɛsɛ sɛ wohwɛ yiye wɔ ho. Ne titiriw no, mmara a edidi so yi:

document.queryXPaths ("substring-akyi (//a/@href,'https://')");

...san de ahama baako ba:

"www.smashingmagazine.com/2018/04/afã-sɔhwɛ-selenium-wɛbdraiver/".

Ntease wom, ɛnte saa? Saa dwumadie yi nsan mma arrays na mmom string baako anaa nɔma baako. Sɛ wode dwumadie no kɔ baabiara a nsunsuansoɔ pii wɔ mu a, ɛde aba a ɛdi kan no nko ara na ɛba. Nea ɛto so abien a efi mu ba no kyerɛ nea yɛpɛ ankasa:

document.queryCSSSelectors ("a").queryXPaths ("substring-akyi (./@href,'https://')");

Nea ɛsan de nhama abien a wɔahyehyɛ no ba:

["www.smashingmagazine.com/2018/04/feature-testing-selenium-webdriver/","www.smashingmagazine.com/2022/11/afiri-sɔhwɛ-aba-a-ɛma-ayɛ-nkɔso-tu mpɔn/"]

XPath dwumadie no betumi ayɛ nested te sɛ dwumadie a ɛwɔ JavaScript mu no ara pɛ. Enti, sɛ yenim Smashing Magazine URL nhyehyɛe no a, yebetumi ayɛ nea edidi so yi (wɔkamfo kyerɛ sɛ yɛmfa template literals nni dwuma): `kyerɛ ase( substring( ) . substring-akyi (./@href, ‘www.nsɛmma nhoma a wɔsɛe no.com/’) ,9), . '/','')`

Eyi reyɛ den kakra dodo akodu baabi a ehia nsɛm a ɛkyerɛkyerɛ nea ɛyɛ mu: fa URL no nyinaa fi href su no mu wɔ www.smashingmagazine.com/ akyi, yi nkyerɛwde akron a edi kan no, afei kyerɛ anim nkyerɛwde (/) nkyerɛwde no ase kɔ hwee mu sɛnea ɛbɛyɛ a wubeyi anim nkyerɛwde a ɛba awiei no afi hɔ. Array a efi mu ba no:

["feature-testing-selenium-webdriver","sɔhwɛ-a-wɔde-sɔhwɛ-a-ɛma-ɛma-tumi-ayɛ-tu mpɔn"].

XPath Dwumadie Nsɛm pii XPath betumi ahyerɛn ankasa wɔ sɔhwɛ mu. Nea enti a ɛte saa no nyɛ den sɛ wobɛhunu, ɛfiri sɛ wɔbɛtumi de XPath adi dwuma de anya element biara a ɛwɔ DOM no mu, afiri gyinabea biara a ɛwɔ DOM no mu, berɛ a CSS ntumi nyɛ saa. Worentumi mmu CSS adesua ahorow a ɛbɛkɔ so ayɛ pɛpɛɛpɛ wɔ nnɛyi adansi nhyehyɛe pii mu, nanso ɛnam XPath so no, yetumi yɛ nhyiam a ɛyɛ den kɛse wɔ nea nsɛm a ɛwɔ element bi mu yɛ ho, a DOM nhyehyɛe a ɛresakra mfa ho. Wɔayɛ nhwehwɛmu wɔ akwan horow a ɛma wutumi yɛ XPath sɔhwɛ ahorow a ɛyɛ den ho. Biribiara nni hɔ a enye sen sɛ wobɛma sɔhwɛ ahorow no ayɛ mmerɛw na adi nkogu esiane sɛ CSS selector bi nyɛ adwuma bio esiane sɛ wɔasesa biribi din anaasɛ wɔayi afi hɔ nti. XPath nso yɛ kɛse ankasa wɔ multiple locator extraction. Ɔkwan bɛboro baako na ɛwɔ hɔ a wobɛfa so de XPath nsɛmmisa adi dwuma de ahyia element bi. Saa ara na ɛte wɔ CSS ho. Nanso XPath abisadeɛ tumi drill wɔ nneɛma mu wɔ ɔkwan a wɔde wɔn ani asi so kɛseɛ a ɛto deɛ wɔsan de ba no ano hye, na ɛma wo kwan ma wo hwehwɛ match pɔtee bi a ebia matches dodoɔ bi bɛtumi aba. Sɛ nhwɛsoɔ no, yɛbɛtumi de XPath adi dwuma de asan de h2 element pɔtee bi a ɛwɔ div mu a ɛdi onua div akyi ntɛm ara a, ɛno nso, ɛwɔ abofra mfonini element a data-testID="leader" su wɔ so:

na ɛyɛ
na ɛyɛ

nnya saa asɛmti yi

na ɛyɛ

Nnya saa asɛmti yi nso

na ɛyɛ

Atiri a ɛwɔ ɔkannifo mfonini

na ɛyɛ

Eyi ne asɛmmisa no: krataa.asɛmmisaXPaths (` //div [ odi-onua::div[1] . /img [@data-testID='ɔkannifo']. ] . /h2/ . nkyerɛwee() . `);

Momma yɛmfa demo bi nhyɛ mu nhwɛ sɛnea ɛno nyinaa bom: Hwɛ Pen Complex H2 Asɛmmisa [a wɔde forked] a Bryan Rasmussen kyerɛwee no. Enti, yiw. Akwan pii wɔ hɔ a ebetumi aba sɛ ɛkɔ element biara mu wɔ sɔhwɛ a wɔde XPath di dwuma mu. XSLT 1.0 Nsɛm a Wɔka Kyerɛ Mekaa no ntɛm sɛ Chrome kuw no ayɛ nhyehyɛe sɛ wobeyi XSLT 1.0 mmoa afi browser no so. Ɛno ho hia ɛfiri sɛ XSLT 1.0 de XML-focused programming di dwuma ma document nsakraeɛ a, ɛno nso, ɛde ne ho to XPath 1.0 so, a ɛyɛ deɛ wɔhunu wɔ browser dodoɔ no ara mu. Sɛ ɛba saa a, yɛbɛhwere XPath no fã titiriw bi. Nanso sɛ yɛhwɛ nokwasɛm a ɛyɛ sɛ XPath yɛ kɛse ankasa ma sɔhwɛ ahorow a wɔkyerɛw a, mihu sɛ ɛnyɛ nea ɛbɛyɛ yiye sɛ XPath nyinaa bɛyera nnansa yi ara. Ɛno akyi no, mahyɛ no nsow sɛ nkurɔfo ani gye feature bi ho bere a wɔayi afi hɔ no. Na ɛno yɛ nokware ampa wɔ XSLT 1.0 a wɔagyae no mu. There’s an entire discussion happening over at Hacker News a akyinnyegye ahorow a ɛkasa tia animtiaabu no ahyɛ mu ma. Post no ankasa yɛ nhwɛsoɔ kɛseɛ a ɛkyerɛ sɛ wɔde XSLT ayɛ blogging framework. Wobetumi akenkan nkɔmmɔbɔ no ama w’ankasa, nanso ɛkɔ sɛnea ebia wɔde JavaScript bedi dwuma sɛ shim ama XLST de adi saa nsɛm ahorow no ho dwuma no mu. Mahu nyansahyɛ ahorow nso sɛ ɛsɛ sɛ browser ahorow de SaxonJS di dwuma, a ɛyɛ port a ɛkɔ JavaScript’s Saxon XSLT, XQUERY, ne XPath engine ahorow so. Ɛno yɛ adwene a ɛyɛ anigyeɛ, titire sɛ Saxon-JS de mprempren nkyerɛaseɛ yi di dwuma, berɛ a browser biara nni hɔ a ɛde XPath anaa XSLT nkyerɛaseɛ biara di dwuma a ɛboro 1.0, na biara nni hɔ a ɛde XQuery di dwuma. Mede me nsa kɔtoo Norm Tovey-Walsh nkyɛn wɔ Saxonica, adwumakuw a ɛwɔ SaxonJS ne Saxon engine no nkyerɛase afoforo akyi. Ɔkaa sɛ: “Sɛ obiara a ɔtɔn browser no ani gye ho sɛ obegye SaxonJS sɛ nea obefi ase de nnɛyi XML mfiridwuma ahorow ahyɛ browser no mu a, yɛn ani begye sɛ yɛne wɔn besusuw ho.”— Norm Tovey-Walsh

Nanso ɔde kaa ho nso sɛ: "Sɛ obi susuw sɛ SaxonJS a ɔbɛfa wɔ ne mprempren tebea mu na watow agu browser no mu a ɛnsakra no bɛyɛ ɔkwan a eye sen biara. Browser tɔnfo, esiane nokwasɛm a ɛyɛ sɛ wɔyɛ browser no nti, betumi abɛn nkabom no wɔ ɔkwan a emu dɔ kɛse sen sɛnea yebetumi ‘afi abɔnten’.”— Norm Tovey-Walsh

Ɛfata sɛ yɛhyɛ no nsow sɛ Tovey-Walsh nsɛm no bae bɛyɛ dapɛn biako ansa na wɔrebɔ XSLT animtiaabu ho dawurubɔ no. Awiei Ná metumi akɔ so akɔ so. Nanso mewɔ anidaso sɛ eyi ada tumi a ɛwɔ XPath mu adi na ama mo nhwɛso pii a ɛkyerɛ sɛnea wɔde bedi dwuma de ayɛ nneɛma akɛse. Ɛyɛ mfiridwuma dedaw a ɛwɔ browser stack no mu a ɛda so ara wɔ mfaso pii nnɛ, sɛ mpo wunnim da sɛ ɛwɔ hɔ anaasɛ wunsusuw ho da sɛ wobɛkɔ so a. Akenkan a Ɛkɔ Akyiri

“Enhancing the Resiliency of Automated Web Tests with Natural Language” (ACM Digital Library) a Maroun Ayli, Youssef Bakouny, Nader Jalloul, ne Rima Kilany kyerɛweeSaa asɛm yi de XPath nhwɛsoɔ pii ma wɔ sɔhwɛ a ɛtumi gyina ano a wɔkyerɛw ho. XPath (MDN)Eyi yɛ beae pa a wubetumi afi ase sɛ wopɛ mfiridwuma mu nkyerɛkyerɛmu a ɛkyerɛkyerɛ sɛnea XPath yɛ adwuma mu kɔ akyiri a. XPath Tutorial (ZVON)M’ahu sɛ saa nkyerɛkyerɛ yi boa kɛse wɔ m’ankasa adesua mu, esiane nhwɛso ahorow pii ne nkyerɛkyerɛmu a emu da hɔ nti. XPatherSaa nkitahodi adwinnade yi ma wotumi ne koodu no yɛ adwuma tẽẽ.

You May Also Like

Enjoyed This Article?

Get weekly tips on growing your audience and monetizing your content — straight to your inbox.

No spam. Join 138,000+ creators. Unsubscribe anytime.

Create Your Free Bio Page

Join 138,000+ creators on Seemless.

Get Started Free