Hvad er DOM i Selenium WebDriver: Struktur, fuld form

Hvad er DOM i Selenium WebDriver?

DOM in Selenium WebDriver er en vรฆsentlig komponent i webudvikling ved hjรฆlp af HTML5 og JavaManuskript. Den fulde form for DOM er Document Object Model. DOM er ikke et datalogisk koncept. Det er et simpelt sรฆt grรฆnseflader, der er standardiseret blandt webudviklere til at fรฅ adgang til og manipulere dokumenter i HTML eller XML vha. JavaManuskript.

Disse standarder hjรฆlper udviklere med at bygge en webside uden at bekymre sig om implementeringsdetaljer. Nogle af de organisationer, der er involveret i standardisering af disse grรฆnseflader, er som Mozilla, Apple, Microsoft, Google, Adobe osv. Det er dog W3C, der formaliserer en standard og udgiver den โ€“ se her (https://dom.spec.whatwg.org/).

Denne tutorial har til formรฅl at dรฆkke grundlรฆggende begreber i HTML-dokumentstruktur og hvordan man manipulerer den ved hjรฆlp af JavaManuskript. Vi vil dรฆkke fรธlgende emner i denne tutorial:

Forstรฅelse af DOM-strukturen

Du bliver nรธdt til at forstรฅ DOM-strukturen, hvis du bygger et websted, der involverer scripting JavaManuskript. At forstรฅ DOM er endnu mere kritisk, hvis du udfรธrer en eller alle af fรธlgende komplicerede opgaver pรฅ dit websted โ€“

  1. Udviklingping indhold, der opdateres lรธbende uden at opdatere hele siden โ€“ f.eks. den aktuelle pris pรฅ alle aktier i din brugers portefรธlje
  2. Udviklingping avancerede brugerinteraktioner sรฅsom dynamisk tilfรธjelse eller รฆndring af indhold โ€“ f.eks. muligheden for at tilfรธje flere aktier til din portefรธlje
  3. Udviklingping indhold, der kan tilpasses af brugeren โ€“ f.eks. muligheden for at รฆndre layoutet, sรฅ investeringsforeningsportefรธljen vises fรธr aktieportefรธljen
  4. Udviklingping responsivt indhold pรฅ din hjemmeside, sรฅ din hjemmeside automatisk tilpasser sig forskellige medieskรฆrme, f.eks. iPhone, desktop, tablet osv.

En grundlรฆggende 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 ud for en browsers DOM PARSER?

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

Hvordan fรฅr du adgang til kropselementet?

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

Hvordan siger man "Hej verden"?

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

Endelig vil hele HTML-filen se ud

ร…bne Windows Notesblok og indsรฆt fรธlgende indhold i den. Gem derefter filen som "MyFileNewFile.html" (sรธrg for, at dit filnavn 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 sidst skal du blot รฅbne filen ved hjรฆlp af en af โ€‹โ€‹dine foretrukne browsere, og du vil se "Hello World!"

Komponenter af DOM i Selenium

Nedenfor er de vigtigste komponenter i DOM er Selenium WebDriver:

  • Window
  • Dokument
  • Element

Window

Window er det objekt, der indeholder dokumentobjektet i en DOM. Den sidder oven pรฅ alt.

For at komme til et vinduesobjekt fra et givet dokument

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

I et fanemiljรธ har hver fane sit eget vinduesobjekt. Men hvis man gerne vil fange og implementere begivenheder som window.resizeTo og window.resizeBy, gรฆlder de for hele vinduet og ikke for fanen alene.

Egenskaber for vinduesobjekt i DOM

window.localStorage โ€“ giver adgang til browserens lokale lager. Det lokale lager kan bruges til at gemme og hente data fra en session.

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

vindue.รฅbner - henter referencen til vinduesobjektet, der รฅbnede dette vindue (enten ved at klikke pรฅ et link eller bruge window.open-metoden)

Nyttige metoder til vinduesobjekt

window.alert() โ€“ viser en advarselsdialog med en besked.

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

Der er mange nyttige hรฆndelser, som vinduesobjektet afslรธrer. Vi vil diskutere dem i afsnittet "Begivenheder" under Avancerede emner

Dokument

Dokumentet markerer begyndelsen pรฅ et DOM-trรฆ. Dokumentet er den fรธrste node i et DOM. Det har flere metoder og egenskaber, hvis omfang gรฆlder for hele dokumentet, f.eks. URL, getElementById, querySelector osv.

Egenskaber for dokumentobjekt i DOM

Document.documentURI og Dokument.URL โ€“ De returnerer begge dokumentets aktuelle placering. Hvis dokumentet derimod ikke er af typen HTML-dokument.URL vil ikke virke.

Document.activeElement โ€“ Denne metode returnerer det element i DOM'en, der er i fokus. Det betyder, at hvis en bruger erping I en tekstboks returnerer Document.activeElement en reference til den pรฅgรฆldende tekstboks.

Document.title โ€“ Dette bruges til at lรฆse eller angive en titel pรฅ et givet dokument.

Nyttige metoder til dokumentobjekt

Document.getElementById(String id) โ€“ dette er langt den mest relevante og brugbare metode i DOM-manipulation. Det bruges til at slรฅ et element op i DOM-trรฆet ved hjรฆlp af dets unikke identifikator. Opslaget skelner mellem store og smรฅ bogstaver, dvs. i fรธlgende eksempel " โ€ element kan ikke slรฅs op ved hjรฆlp af 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(strengvรฆlger) โ€“ dette er en anden meget brugt metode til at vรฆlge et element mere baseret pรฅ regler for CSS-vรฆlger (hvis du er bekendt med jQuerys $-notation, bruger den selv denne metode). Vi vil ikke dykke meget ned i CSS-vรฆlgere. CSS-vรฆlger er et sรฆt regler, som du kan bruge til at fรฅ en liste over lignende elementer (baseret pรฅ vรฆlgerreglen). Vi har brugt denne metode fรธr i afsnittet "Hello World".

Element

Elementobjekt i DOM

Elementobjekt i DOM

Element er ethvert objekt, der er reprรฆsenteret af en node i et DOM-trรฆ i et dokument. Som altid er Element-objektet i sig selv blot en ulempe.tracaf egenskaber, metoder og hรฆndelser mellem en browser og et HTML-dokument. Der findes sรฆrlige typer elementer som HTMLElement, SVGElement, XULElement osv. Vi vil kun fokusere pรฅ HTMLElement i denne vejledning.

Egenskaber for elementobjekt i DOM

Element.id โ€“ Denne egenskab kan bruges til at indstille eller lรฆse "ID" (en unik identifikator) for et HTML-element. ID skal vรฆre unikt blandt elementerne i et DOM-trรฆ. Som nรฆvnt fรธr bruges ID ogsรฅ af Document.getElementById-metoden til at vรฆlge et bestemt Element-objekt i et DOM-trรฆ.

HTMLElement.contentEditable โ€“ contentEditable-egenskaben for et element bestemmer, om indholdet er af det element, er redigerbart/modificerbart. Denne egenskab kan indstilles som vist i scriptet nedenfor. Denne egenskab kan ogsรฅ bruges til at bestemme, om et givet element er redigerbart eller ej. Prรธv fรธlgende script i enhver HTML-tekst, og du vil bemรฆrke, at du kan redigere ethvert indhold i brรธdteksten.

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

Element.innerHTML โ€“ innerHTML er en anden vigtig egenskab, som vi bruger til at fรฅ adgang til HTML-indhold inde i et element. Det bruges ogsรฅ til at indstille nyt HTML-indhold for elementet. Det er meget brugt til at indstille/รฆndre indholdet af datafelter. Sig for eksempel, at du vil have din webside til at opdatere temperaturen i Mumbai City hver time, du kan kรธre scriptet i det 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 til elementobjekt

HTMLElement.blur() & HTMLElement.focus() โ€“ slรธring og fokusmetoder bruges til at fjerne fokus fra henholdsvis eller give fokus til et HTML-element. Disse metoder er mest brugt til at flytte en markรธrs fokus mellem tekstbokse pรฅ en dataindtastningswebside.

Element.querySelectorAll โ€“ Denne metode ligner den allerede diskuterede querySelector-metode for dokumentobjektet. Denne metode vil dog begrรฆnse dens sรธgning inden for efterkommerne af selve elementet.

Fejlretning i DOM

Udviklervรฆrktรธjer af Google Chrome, Mozilla Firefox, Internet Explorer (10 eller derover) eller Safari tillader nem fejlfinding direkte inde i browseren. Nogle gange fortolker forskellige browsere den samme HTML-markering forskelligt, og det er nรฅr fejlretning hjรฆlper dig med at inspicere DOM, som det er blevet fortolket af den pรฅgรฆldende browsers DOM-motor.

Lad os nu sige, at du vil รฆndre temperaturvรฆrdien fra 26oC til 32oC i dit sidste eksempel. Vi vil tage nogle fรฅ enkle trin for at gรธre det. Skรฆrmbilleder vist her er fra Mozilla's Firefoxโ€“ trinene er dog de samme i alle andre browsere.

  1. ร…bn MyFileNewFile.html (eller hvilket som helst navn du gav til din HTML-fil i รธvelserne ovenfor) ved hjรฆlp af din browser
  2. Brug din mus og hรธjreklik pรฅ temperaturvรฆrdien 26oC og klik pรฅ "Inspicer element"

    Fejlretning i DOM

  3. Bemรฆrk, at det element, hvor du valgte at "Inspicere element", vises fremhรฆvet i din browser (debugger-vindue vises normalt nederst pรฅ skรฆrmen)

    Fejlretning i DOM Engine

  4. ร…bn elementet ved at klikke pรฅ den skrรฅ trekant ved siden af โ€‹โ€‹det

    Fejlretningsproces i DOM

  5. Vรฆlg, hvad du vil redigere, og dobbeltklik pรฅ det. Du fรฅr mulighed for at รฆndre teksten. Gรธr som anvist i det animerede billede nedenfor.

    Fejlretning i DOM

  6. Bemรฆrk รฆndringen i indholdet pรฅ din HTML-side. Du kan lukke fejlfindingsvinduet nu.

    Bemรฆrk, at dine รฆndringer kun bevares for denne session. Sรฅ snart du genindlรฆser eller opdaterer (tryk F5), vil รฆndringerne blive fรธrt tilbage. Dette indikerer, at du ikke har รฆndret den faktiske HTML-kilde, men blot den lokale fortolkning af din browser.

    Prรธv at gรธre fรธlgende som en sjov รธvelse. ร…ben www.facebook.com i din browser og brug debugger-vรฆrktรธjet til at fรธlge resultatet โ€“ lรฆg mรฆrke til, hvordan der stรฅr "Jeg har hacket Facebook".

Fejlretningsproces i DOM

DOM-begivenheder

Hvad er begivenheder i DOM?

Hรฆndelser er en programmeringsmodel, hvor brugerudlรธste (eller browsersidens livscyklusudlรธste) hรฆndelser udsendes som beskeder. Nรฅr en side f.eks. er fรฆrdig med at indlรฆse, udlรธser den window.load-hรฆndelsen og pรฅ samme mรฅde, nรฅr brugeren klikker pรฅ en knap, der elementets klikhรฆndelse udlรธses.

Disse beskeder kan opsnappes af enhver JavaScript kode, og derefter kan en udviklerdefineret handling udfรธres. Lad os sige, at du kun vil have, at tallene pรฅ din webside opdateres, nรฅr brugeren klikker pรฅ en knap. Du kan opnรฅ det ved hjรฆlp af en af โ€‹โ€‹fรธlgende metoder -

  1. Tildel handling til onclick-hรฆndelsen for HTML-elementet
  2. Tildel handling til klikhรฆndelsen ved hjรฆlp af 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>

Fejlfinding i DOM

Q. Hvordan ved jeg, om et element eksisterer eller ej?

A. Prรธv at slรฅ elementet op ved hjรฆlp af en af โ€‹โ€‹vรฆlgerne og tjek, om det returnerede element er et nul. Se eksempel nedenfor โ€“

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

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

A. Sรธrg for, at metodenavnet svarer nรธjagtigt til API-metoden. Ligesom i spรธrgsmรฅlet ovenfor - det er getElementById og ikke getElementByID.

Q. Hvad er forskellen mellem bรธrn og childNodes?

A. Metoden bรธrn fรฅr os til samlingen af โ€‹โ€‹alle elementer inden for det kaldende element. Den returnerede samling er af typen HTMLCollection. Metoden childNodes giver os dog samlingen af โ€‹โ€‹alle noderne i det kaldende element. Tilfรธj fรธlgende scripts til vores eksempel og se forskellen โ€“

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 bรธrnemetoden kun returnerer 7 varer

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 lรฆse egenskaben 'innerHTML' af undefined...

A. Sรธrg for, at den forekomst af HTMLElement, du kalder egenskaben innerHTML pรฅ, blev indstillet efter den fรธrste erklรฆring. Denne fejl opstรฅr generelt i fรธlgende scenarie. Se, hvordan fejlen kan undgรฅs i nรฆste kodeblok...

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';
}

Resumรฉ

  • I denne tutorial lรฆrte vi, hvad en DOM er, og hvordan det er vigtigt at forstรฅ for at bygge dynamiske websider.
  • Vi kom ogsรฅ ind pรฅ typer af DOM-elementer som Window, Document og Element.
  • Vi lรฆrte nogle nyttige DOM-metoder og egenskaber tilgรฆngelige inden for hver type.
  • Vi sรฅ, hvordan de fleste browsere tilbyder udviklervรฆrktรธjer til at spille med en hvilken som helst webside, der er tilgรฆngelig pรฅ internettet โ€“ og dermed lรฆre at fejlsรธge og lรธse problemer med vores egen hjemmeside.
  • Vi kom ogsรฅ kort ind pรฅ DOM-hรฆndelsesmekanismer.
  • Til sidst dรฆkkede vi nogle fejlfindingselementer i DOM.
  • Internettet er fyldt med ressourcer pรฅ DOM. Et af de bedste og opdaterede referencematerialer er tilgรฆngeligt pรฅ Mozillas udviklernetvรฆrk. Se - https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model

Opsummer dette indlรฆg med: