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
- Komponenter af DOM i Selenium
- Fejlretning i DOM
- DOM-begivenheder
- Fejlfinding i DOM
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 โ
- Udviklingping indhold, der opdateres lรธbende uden at opdatere hele siden โ f.eks. den aktuelle pris pรฅ alle aktier i din brugers portefรธlje
- 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
- Udviklingping indhold, der kan tilpasses af brugeren โ f.eks. muligheden for at รฆndre layoutet, sรฅ investeringsforeningsportefรธljen vises fรธr aktieportefรธljen
- 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
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.
- ร bn MyFileNewFile.html (eller hvilket som helst navn du gav til din HTML-fil i รธvelserne ovenfor) ved hjรฆlp af din browser
-
Brug din mus og hรธjreklik pรฅ temperaturvรฆrdien 26oC og klik pรฅ "Inspicer element"
-
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)
-
ร bn elementet ved at klikke pรฅ den skrรฅ trekant ved siden af โโdet
-
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.
-
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".
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 -
- Tildel handling til onclick-hรฆndelsen for HTML-elementet
- 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





