Hva er DOM i Selenium WebDriver? Struktur og full form

โšก Smart oppsummering

Dokumentobjektmodellen eksponerer en HTML-side for JavaSkript som et tre av objekter, slik at skript og Selenium WebDriver leser, finner og endrer ethvert element pรฅ siden mens nettleseren kjรธrer.

  • ๐Ÿ”˜ Fullstendig skjema: DOM stรฅr for Document Object Model, et W3C-standardisert grensesnitt for HTML- og XML-dokumenter.
  • โ˜‘๏ธ Trestruktur: Hver tag blir en node, sรฅ html, head, body, artikkel og p danner et foreldre-barn-hierarki.
  • โœ… Tre objekter: Window bryter fanen, Document markerer treroten, og Element representerer hver enkelt tagg.
  • ๐Ÿงช Kjernemetoder: getElementById, querySelector og querySelectorAll henter noder; innerHTML leser og skriver innholdet deres om.
  • ๐Ÿ› ๏ธ Feilsรธking: Verktรธy for nettleserutviklere eksponerer det analyserte treet, og redigeringer som gjรธres der varer bare til siden lastes inn pรฅ nytt.
  • ๐Ÿ“Š Begivenheter: Handlinger som klikk og last inn kringkastingsmeldinger som onclick-attributter eller addEventListener kan fange opp.

Hva er DOM i Selenium WebDriver-struktur og fullstendig form

Hva er DOM i Selenium WebDriver?

DOM in Selenium WebDriver er en viktig del av webutvikling ved hjelp av HTML5 og JavaManus. Den fullstendige formen for DOM er Document Object Model. DOM er ikke et datavitenskapelig konsept. Det er et enkelt sett med grensesnitt standardisert blant nettutviklere for รฅ fรฅ tilgang til og manipulere dokumenter i HTML eller XML ved hjelp av JavaManus.

Disse standardene hjelper utviklere med รฅ bygge en nettside uten รฅ bekymre seg for implementeringsdetaljer. Noen av organisasjonene som er involvert i standardisering av disse grensesnittene er som Mozilla, Apple, Microsoft, Google, Adobe osv. Det er imidlertid W3C som formaliserer en standard og publiserer den โ€“ se her (https://dom.spec.whatwg.org/).

Avsnittene nedenfor dekker dokumentstruktur, objektene DOM-en eksponerer og hvordan man inspiserer dem. Mozilla beholder den gjeldende API-referansen pรฅ MDN-dokumentobjektmodellsider.

Hver Selenium locator lรธser opp mot dette samme treet, sรฅ strukturen nedenfor er det findElement() sรธk.

Forstรฅ DOM-strukturen

Du mรฅ forstรฅ DOM-strukturen hvis du bygger et nettsted som involverer skripting JavaManus. ร… forstรฅ DOM er enda viktigere hvis du gjรธr en eller alle de fรธlgende kompliserte oppgavene pรฅ nettstedet ditt โ€“

  1. Utviklingping innhold som oppdaterer seg selv kontinuerlig uten รฅ oppdatere hele siden โ€“ som gjeldende pris pรฅ alle aksjene i brukerens portefรธlje
  2. Utviklingping avanserte brukerinteraksjoner, som รฅ legge til eller endre innhold dynamisk โ€“ som muligheten til รฅ legge til flere aksjer i portefรธljen din
  3. Utviklingping innhold som kan tilpasses av brukeren โ€“ som muligheten til รฅ endre oppsettet slik at fondsportefรธljen vises fรธr aksjeportefรธljen
  4. Utviklingping responsivt innhold pรฅ nettstedet ditt, slik at nettstedet ditt automatisk tilpasser seg ulike medieskjermer, f.eks. iPhone, datamaskin, nettbrett osv.

En grunnleggende HTML-side

<!DOCTYPE html>
<meta charset="UTF-8">
<html>
         <head>
            <title>my page title</title>
          </head>
<body>
         <article>
                  <p>
                         my first article
                   </p>
         </article>
        <aside>side bar content</aside>
</body>
</html>

Hvordan ser det ut for en nettlesers DOM PARSER?

html    >     head    >    title
    >    body    >    aside
            >    article    >    p

Hvordan fรฅr du tilgang til kroppselementet?

<script>
    var body = window.document.body;
</script>

Hvordan sier du "Hello World"?

<script>
    var body = document.querySelector("body > article > p").innerHTML = "Hello World!";
			</script>

Til slutt vil hele HTML-filen se ut

Open Windows Notisblokk og lim inn fรธlgende innhold i den. Lagre deretter filen som "MyFileNewFile.html" (sรธrg for at filnavnet slutter med .html).

<!DOCTYPE html>
<meta charset="UTF-8">
<html>
<head>
<title>my page title</title>
</head>
<body>
<article><p>my first article</p></article>
<aside>side bar content</aside>
<script>

    var body = document.querySelector("body > article > p").innerHTML = "Hello World!";
			</script>
</body>
</html>

Til slutt รฅpner du bare filen ved รฅ bruke en av dine foretrukne nettlesere, og du vil se "Hello World!"

Komponenter av DOM i Selenium

Nedenfor er hovedkomponentene i DOM er Selenium WebDriver:

  • Vindu
  • Document
  • Element

Hver komponent sitter pรฅ et annet nivรฅ i treet, og starter fra det ytterste.

Vindu

Window er objektet som inneholder dokumentobjektet i en DOM. Den sitter pรฅ toppen av alt.

For รฅ komme til et vindusobjekt fra et gitt dokument

<script>
      var window = document.defaultView;
</script>

I et fanemiljรธ har hver fane sitt eget vindusobjekt. Men hvis man รธnsker รฅ fange opp og implementere hendelser som window.resizeTo og window.resizeBy, gjelder de for hele vinduet og ikke for fanen alene.

Egenskaper til Window Object i DOM

window.localStorage โ€“ gir tilgang til nettleserens lokale lagring. Den lokale lagringen kan brukes til รฅ lagre og hente data fra en รธkt.

<script>
    window.localStorage.setItem('name','xyz');
	var name = window.localStorage.getItem('name');
</script>

vindu.รฅpner - henter referansen til vindusobjektet som รฅpnet dette vinduet (enten ved รฅ klikke pรฅ en lenke eller bruke window.open-metoden)

Nyttige metoder for vindusobjekt

window.alert() โ€“ viser en varseldialog med en melding.

<script>
		window.alert('say hello');
</script>

Det er mange nyttige hendelser som vindusobjektet viser. Vi vil diskutere dem i "Arrangementer"-delen under Advance Topics

Document

Dokumentet markerer begynnelsen pรฅ et DOM-tre. Dokumentet er den fรธrste noden i en DOM. Det har flere metoder og egenskaper, hvis omfang gjelder for hele dokumentet, som URL, getElementById, querySelector osv.

Egenskaper for dokumentobjekt i DOM

Document.documentURI og Dokument.URL โ€“ Begge returnerer dokumentets nรฅvรฆrende plassering. Hvis dokumentet derimot ikke er av typen HTML-dokument.URL vil ikke fungere.

Document.activeElement โ€“ Denne metoden returnerer elementet i DOM-en som er i fokus. Dette betyr at hvis en bruker erping I en tekstboks vil Document.activeElement returnere referanse til den tekstboksen.

Document.title โ€“ Dette brukes til รฅ lese eller angi en tittel pรฅ et gitt dokument.

Nyttige metoder for dokumentobjekt

Document.getElementById(String id) โ€“ dette er den klart mest relevante og nyttige metoden i DOM-manipulering. Den brukes til รฅ slรฅ opp et element i DOM-treet. ved hjelp av sin unike identifikatorOppslaget skiller mellom store og smรฅ bokstaver, dvs. i fรธlgende eksempel er ยซ โ€-elementet kan ikke slรฅs opp med ord som IntroDiv eller introdiv eller iNtrodiv osv.

<!DOCTYPE html>
<meta charset="UTF-8">
<html>
<head></head>
<body>
<div id='introDiv'></div>
<script>
		var label = Document.getElementById('introDiv');
		label.setInnerHTML('say hello again');
	</script>
</body>
</html>

Document.querySelectorAll(strengvelger) โ€“ dette er en annen mye brukt metode for รฅ velge ett element til basert pรฅ regler for CSS-velger (Hvis du er kjent med jQuerys $-notasjon, bruker den i seg selv denne metoden). Vi skal ikke gรฅ sรฅ mye inn pรฅ CSS-selektorer. En CSS-selektor er et sett med regler som du kan bruke til รฅ fรฅ en liste over lignende elementer (basert pรฅ selektorregelen). Vi har brukt denne metoden fรธr i ยซHello Worldยป-delen.

Element

Diagrammet nedenfor viser hvordan et Element-objekt sitter inne i DOM-treet, under dokumentnoden.

Elementobjekt vist som en node i DOM-trehierarkiet

Elementobjekt i DOM

Element er ethvert objekt representert av en node i et DOM-tre i et dokument. Som alltid er Element-objektet i seg selv bare en ulempe.tracav egenskaper, metoder og hendelser mellom en nettleser og et HTML-dokument. Det finnes spesielle typer elementer som HTMLElement, SVGElement, XULElement osv. Vi vil kun fokusere pรฅ HTMLElement i denne veiledningen.

Egenskaper for elementobjekt i DOM

Element.id โ€“ Denne egenskapen kan brukes til รฅ angi eller lese "ID" (en unik identifikator) for et HTML-element. ID mรฅ vรฆre unik blant elementene i et DOM-tre. Som nevnt fรธr, brukes ID ogsรฅ av Document.getElementById-metoden for รฅ velge et bestemt Element-objekt i et DOM-tre.

HTMLElement.contentEditable โ€“ contentEditable-egenskapen til et element bestemmer om innholdet er av det elementet er redigerbart/modifiserbart. Denne egenskapen kan settes som vist i skriptet nedenfor. Denne egenskapen kan ogsรฅ brukes til รฅ bestemme om et gitt element er redigerbart eller ikke. Prรธv fรธlgende skript i hvilken som helst HTML-tekst, og du vil legge merke til at du kan redigere innholdet i brรธdteksten.

<script>
		document.body.contentEditable = true;
</script>

Element.innerHTML โ€“ innerHTML er en annen viktig egenskap som vi bruker for รฅ fรฅ tilgang til HTML-innhold i et element. Den brukes ogsรฅ til รฅ angi nytt HTML-innhold for elementet. Det er mye brukt for รฅ sette/endre innholdet i datafelt. Si for eksempel at du vil at nettsiden din skal oppdatere temperaturen i Mumbai City hver time, du kan kjรธre skriptet i fรธlgende eksempel hver time.

<!DOCTYPE html>
<meta charset="UTF-8">
<html>
<head>
<title>my page title</title>
</head>
<body>
<section>
<h1>Mumbai</h1>
<h2>Temperature</h2>
<span id='tempValue'></span><sup>o</sup>C
</section>
<script>
    document.getElementById('tempValue').innerHTML = '26';
			</script>
</body>
</html>

Nyttige metoder for elementobjekt

HTMLElement.blur() & HTMLElement.focus() โ€“ uskarphet og fokusmetoder brukes til รฅ fjerne fokus fra henholdsvis eller gi fokus til et HTML-element. Disse metodene er mest brukt for รฅ flytte fokuset til en markรธr mellom tekstbokser pรฅ en nettside for dataregistrering.

Element.querySelectorAll โ€“ Denne metoden ligner den allerede diskuterte querySelector-metoden for dokumentobjektet. Denne metoden vil imidlertid begrense sรธket innenfor etterkommerne av selve elementet.

Nรธyaktighetsmerknad: Blokken ovenfor er gjengitt som publisert. Bruk av arbeidskode dokument med en liten d og innerHTML egenskap, ikke setInnerHTML().

Feilsรธking i DOM

Utviklerverktรธy av Google Chrome, Mozilla Firefox, Internet Explorer (10 eller hรธyere) eller Safari tillater enkel feilsรธking rett inne i nettleseren. Noen ganger tolker forskjellige nettlesere samme HTML-oppmerking forskjellig, og det er nรฅr feilsรธking hjelper deg รฅ inspisere DOM slik det har blitt tolket av den aktuelle nettleserens DOM-motor.

Merknad om nettleser: Internet Explorer ble pensjonert i 2022, sรฅ utviklerverktรธyene finnes nรฅ i Microsoft EdgeTrinnene nedenfor er uendret; DevTools รฅpnes med F12.

La oss nรฅ si at du vil endre temperaturverdien fra 26oC til 32oC i ditt siste eksempel. Vi vil ta noen enkle trinn for รฅ gjรธre det. Skjermbilder som vises her er fra Mozilla's Firefoxโ€“ trinnene er imidlertid de samme i alle andre nettlesere.

  1. ร…pne MyFileNewFile.html (eller hvilket navn du ga til HTML-filen i veiledningene ovenfor) ved รฅ bruke nettleseren din
  2. Bruk musen og hรธyreklikk pรฅ temperaturverdien 26oC og klikk pรฅ "Inspiser element"

    Hรธyreklikk pรฅ temperaturverdien og velg Inspiser element i nettleseren

  3. Legg merke til at elementet der du valgte รฅ "Inspisere element" vises uthevet i nettleseren din (feilsรธkingsvinduet vises vanligvis nederst pรฅ skjermen)

    Verktรธy for nettleserutviklere som fremhever det inspiserte span-elementet i DOM-treet

  4. ร…pne elementet ved รฅ klikke pรฅ den skrรฅstilte trekanten ved siden av det

    Utvide span-elementet i DOM-inspektรธren ved hjelp av trekantbryteren

  5. Velg hva du vil redigere og dobbeltklikk pรฅ det. Du vil fรฅ en mulighet til รฅ endre teksten. Gjรธr som anvist i det animerte bildet nedenfor.

    Animert demonstrasjon av redigering av DOM-tekstverdien fra 26 til 32 i inspektรธren

  6. Legg merke til endringen i innholdet pรฅ HTML-siden din. Du kan lukke feilsรธkingsvinduet nรฅ.

    Vรฆr oppmerksom pรฅ at endringene dine bare vil fortsette for denne รธkten. Sรฅ snart du laster inn eller oppdaterer (trykk F5) vil siden endres tilbake. Dette indikerer at du ikke endret den faktiske HTML-kilden, men bare den lokale tolkningen av nettleseren din.

    Prรธv รฅ gjรธre fรธlgende som en morsom รธvelse. ร…pne www.facebook.com i nettleseren din og bruk feilsรธkingsverktรธyet for รฅ fรธlge resultatet โ€“ legg merke til hvordan det stรฅr ยซJeg har hacket Facebookยป.

Resultatet av รธvelsen ser ut som skjermbildet nedenfor.

Facebook-siden er redigert live i nettleserinspektรธren for รฅ lese at jeg har hacket Facebook

Lesing og redigering av noder dekker statiske sider. Interaktive sider reagerer ogsรฅ pรฅ hva brukeren gjรธr.

DOM-hendelser

Hva er hendelser i DOM?

Hendelser er en programmeringsmodell der brukerutlรธste (eller nettlesersidens livssyklusutlรธste) hendelser kringkastes som meldinger. For eksempel, nรฅr en side er ferdig lastet, utlรธser den window.load-hendelsen og pรฅ lignende mรฅte nรฅr brukeren klikker pรฅ en knapp som elementets klikkhendelse utlรธses.

Disse meldingene kan fanges opp av alle JavaScript kode og deretter en utviklerdefinert handling kan tas. La oss for eksempel si at du รธnsker at tallene pรฅ nettsiden din bare skal oppdateres nรฅr brukeren klikker pรฅ en knapp. Du kan oppnรฅ dette ved hjelp av en av fรธlgende metoder โ€“

  1. Tilordne handling til onclick-hendelsen til HTML-elementet
  2. Tilordne handling til klikkhendelsen ved รฅ bruke addEventListener-metoden

Metode 1

<!DOCTYPE html>
<html>
<head>
    <title>my page title</title>
</head>
<body>
    <section>
        <h1>Mumbai<h1>
        <h2>Temperature</h2>
        <span id='tempValue'></span><sup>o</sup>C
        <br/>
        <br/>
        <button onclick='onRefreshClick()'>Refresh</button>
    </section>
<script>
    	document.getElementById('tempValue').innerHTML = '26';

 function onRefreshClick(e) {
   document.getElementById('tempValue').innerHTML = '32';
}
			</script>
</body>
</html>

Metode 2

<!DOCTYPE html>
<html>
<head>
    <title>my page title</title>
</head>
<body>
    <section>
        <h1>Mumbai<h1>
        <h2>Temperature</h2>
        <span id='tempValue'></span><sup>o</sup>C
        <br/>
        <br/>
        <button id='btnRefresh'>Refresh</button>
    </section>
<script>
    document.getElementById('tempValue').innerHTML = '26';
    document.getElementById('btnRefresh').addEventListener('click', function(event) {
    document.getElementById('tempValue').innerHTML = '32' },false);
			</script>
</body>
</html>

Feilsรธking i DOM

Merknad om eldre API: To av svarene nedenfor bruker document.write(). Det kjรธrer fortsatt, men et kall etter sideinnlasting sletter dokumentet. Foretrekker console.log() eller innerHTML.

Sp. Hvordan vet jeg om et element eksisterer eller ikke?

A. Prรธv รฅ slรฅ opp elementet ved รฅ bruke en av velgerne og sjekk om elementet som returneres er en null. Se eksempel nedenfor -

if(document.getElementById("elementIDWhichIsNotPresentInDOM") === null)
{
    //do something
}

Q. Jeg fรฅr TypeError: document.getElementByID er ikke en funksjon...

A. Sรธrg for at metodenavnet samsvarer nรธyaktig med API-metoden. Som i spรธrsmรฅlet ovenfor - det er getElementById og ikke getElementByID.

Sp. Hva er forskjellen mellom barn og childNodes?

A. Metoden barn fรฅr oss samlingen av alle elementene innenfor det kallende elementet. Samlingen som returneres er av typen HTMLCollection. Imidlertid gir metoden childNodes oss samlingen av alle nodene i det kallende elementet. Legg til fรธlgende skript til vรฅrt eksempel og se forskjellen โ€“

childNodes-metoden returnerer 14 elementer

document.write("Using childNodes method")
document.write("<br>");
document.write("<br>");
for(i=0;i<document.getElementsByTagName("section")[0].childNodes.length;i++)
{
    document.write((i+1)+".");
    document.write(document.getElementsByTagName("section")[0].childNodes[i].toString());
    document.write("<br>");
}
document.write("<br>");
document.write("Number of nodes in a section " + document.getElementsByTagName("section")[0].childNodes.length);

Mens barnemetoden returnerer bare 7 elementer

document.write("Using children method")
document.write("<br>");
document.write("<br>");
for(i=0;i<document.getElementsByTagName("section")[0].children.length;i++)
{
    document.write((i+1)+".");
    document.write(document.getElementsByTagName("section")[0].children[i].toString());
    document.write("<br>");
}
document.write("<br>");
document.write("Number of nodes in a section " + document.getElementsByTagName("section")[0].children.length);

Q. Jeg fรฅr Uncaught TypeError: Kan ikke lese egenskapen 'innerHTML' til undefined...

A. Sรธrg for at forekomsten av HTMLElement du kaller egenskapen innerHTML pรฅ ble satt etter den fรธrste deklarasjonen. Denne feilen oppstรฅr vanligvis i fรธlgende scenario. Se hvordan feilen kan unngรฅs i neste kodeblokk...

var element;
if(false) //say condition was false
{
    element = document.getElementById('tempValue1');
}
element.innerHTML = '32';
var element = null;
if(false) //say condition was false
{
    element = document.getElementById('tempValue1');
}
if(element != null)
{
    element.innerHTML = '32';
}

Spรธrsmรฅl og svar

Shadow DOM er en nettleserfunksjon som gir en komponent sitt eget isolerte undertre, slik at stiler og skript ikke lekker. Virtual DOM er en bibliotekteknikk, brukt av React og Vue, som differensierer en kopi i minnet for รฅ minimere reelle oppdateringer.

WebDriver sender en locator til nettleseren, som gรฅr gjennom det analyserte treet til et treff dukker opp, og deretter returnerer en WebElement-hรฅndtak. Lokalister som id, navn, CSS-selektor og XPath beskriver ganske enkelt forskjellige sรธkeregler over de samme nodene.

Bruk getElementById nรฅr mรฅlet har en unik ID; det er det raskeste oppslaget og returnerer รฉn node. Bruk querySelector eller querySelectorAll nรฅr treffet avhenger av klasser, attributter eller en foreldre-barn-sti.

Den kjรธrer fortsatt, men nettlesere frarรฅder det. ร… kalle document.write() etter at siden er lastet inn erstatter hele dokumentet, og det blokkerer parsing under lasting. Bruk console.log() for tracing, eller innerHTML for รฅ sette inn innhold.

DOM-modellenes sideinnhold: head, body og alle tagger. Nettleserobjektmodellen dekker den omkringliggende nettleseren, inkludert navigator, skjerm, plassering og historikk. Vindusobjektet er der begge mรธtes.

Internet Explorer ble pensjonert i 2022, sรฅ utviklerverktรธyene finnes nรฅ i den Microsoft EdgeArbeidsflyten er uendret: trykk F12 eller hรธyreklikk pรฅ et element, velg Inspiser, og rediger noden i panelet som รฅpnes.

Maskinlรฆringsverktรธy scorer flere nodeattributter samtidig, slik at nรฅr en klasse eller ID endres, matcher de det samme elementet pรฅ nytt i stedet for รฅ feile. Selvreparerende testplattformer bygger dette oppรฅ vanlige DOM-spรธrringer.

copilot utkaster hendelseslyttere, querySelector-kjeder og traverseringslรธkker fra en kommentar, og den er pรฅlitelig pรฅ vanlige mรธnstre. Test alltid forslaget mot den virkelige siden, fordi den ikke kan se markupen din.

Oppsummer dette innlegget med: