DOM คืออะไร Selenium WebDriver: โครงสร้าง แบบฟอร์มเต็ม
DOM คืออะไร Selenium เว็บไดร์เวอร์?
DOM in Selenium WebDriver เป็นองค์ประกอบสำคัญของการพัฒนาเว็บโดยใช้ HTML5 และ Javaสคริปต์ เวอร์ชันเต็มของ DOM คือ Document Object Model DOM ไม่ใช่แนวคิดของวิทยาการคอมพิวเตอร์ แต่เป็นชุดอินเทอร์เฟซที่เรียบง่ายซึ่งได้มาตรฐานสำหรับนักพัฒนาเว็บเพื่อเข้าถึงและจัดการเอกสารในรูปแบบ HTML หรือ XML โดยใช้ Javaต้นฉบับ
มาตรฐานเหล่านี้ช่วยให้นักพัฒนาสามารถสร้างเว็บเพจได้โดยไม่ต้องกังวลเกี่ยวกับรายละเอียดการใช้งาน องค์กรบางแห่งที่เกี่ยวข้องกับการกำหนดมาตรฐานอินเทอร์เฟซเหล่านี้ เช่น Mozilla, Apple Microsoft, Google, Adobe ฯลฯ อย่างไรก็ตาม W3C เป็นผู้กำหนดมาตรฐานอย่างเป็นทางการและเผยแพร่ – ดูที่นี่ (https://dom.spec.whatwg.org/).
บทช่วยสอนนี้มุ่งเน้นที่จะครอบคลุมแนวคิดพื้นฐานของโครงสร้างเอกสาร HTML และวิธีการจัดการโดยใช้ Javaสคริปต์ เราจะครอบคลุมหัวข้อต่อไปนี้ในบทช่วยสอนนี้:
- ทำความเข้าใจเกี่ยวกับโครงสร้าง DOM
- ส่วนประกอบของ DOM ใน Selenium
- การดีบักใน DOM
- กิจกรรม DOM
- การแก้ไขปัญหาใน DOM
ทำความเข้าใจเกี่ยวกับโครงสร้าง DOM
คุณจะต้องเข้าใจโครงสร้าง DOM หากคุณกำลังสร้างเว็บไซต์ที่เกี่ยวข้องกับการใช้สคริปต์ Javaสคริปต์ การทำความเข้าใจ DOM มีความสำคัญยิ่งขึ้นหากคุณกำลังทำสิ่งที่ซับซ้อนอย่างใดอย่างหนึ่งหรือทั้งหมดต่อไปนี้บนเว็บไซต์ของคุณ
- การพัฒนาเนื้อหาที่อัปเดตตัวเองอย่างต่อเนื่องโดยไม่ต้องรีเฟรชทั้งหน้า เช่น ราคาปัจจุบันของหุ้นทั้งหมดในพอร์ตโฟลิโอของผู้ใช้ของคุณ
- การพัฒนาการโต้ตอบกับผู้ใช้ขั้นสูง เช่น การเพิ่มหรือแก้ไขเนื้อหาแบบไดนามิก เช่น ความสามารถในการเพิ่มหุ้นในพอร์ตโฟลิโอของคุณ
- พัฒนาเนื้อหาที่ผู้ใช้ปรับแต่งได้เหมือนสามารถปรับเปลี่ยนรูปแบบเพื่อให้พอร์ตกองทุนรวมปรากฏก่อนพอร์ตหุ้น
- การพัฒนาเนื้อหาที่ตอบสนองในเว็บไซต์ของคุณ ทำให้เว็บไซต์ของคุณปรับให้เข้ากับหน้าจอสื่อต่างๆ เช่น iPhone, เดสก์ท็อป, แท็บเล็ต เป็นต้น โดยอัตโนมัติ
หน้า 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> </body> </html>
DOM PARSER ของเบราว์เซอร์มีลักษณะอย่างไร
html > head > title > body > aside > article > p
คุณจะเข้าถึงองค์ประกอบร่างกายได้อย่างไร?
<script> var body = window.document.body; </script>
คุณจะพูดว่า "สวัสดีชาวโลก" ได้อย่างไร?
<script> var body = document.querySelector("body > article > p").innerHTML = "Hello World!"; </script>
ในที่สุดไฟล์ HTML ทั้งหมดจะมีลักษณะเช่นนี้
จุดเปิด Windows Notepad และวางเนื้อหาต่อไปนี้ลงไป จากนั้นบันทึกไฟล์เป็น “MyFileNewFile.html” (ตรวจสอบให้แน่ใจว่าชื่อไฟล์ของคุณลงท้ายด้วย .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>
สุดท้าย เพียงแค่เปิดไฟล์โดยใช้เบราว์เซอร์ที่คุณต้องการ แล้วคุณจะเห็นข้อความ “Hello World!”
ส่วนประกอบของ DOM ใน Selenium
ด้านล่างนี้เป็นส่วนประกอบหลักของ DOM คือ Selenium เว็บไดร์เวอร์:
- หน้าต่าง
- เอกสาร
- ธาตุ
หน้าต่าง
หน้าต่างเป็นวัตถุที่มีวัตถุเอกสารใน DOM มันอยู่เหนือทุกสิ่ง
เพื่อเข้าถึงวัตถุหน้าต่างจากเอกสารที่กำหนด
<script> var window = document.defaultView; </script>
ในสภาพแวดล้อมแบบแท็บ แต่ละแท็บจะมีวัตถุหน้าต่างของตัวเอง อย่างไรก็ตาม หากต้องการจับและใช้งานเหตุการณ์ เช่น window.resizeTo และ window.resizeBy เหตุการณ์เหล่านี้จะมีผลกับทั้งหน้าต่าง ไม่ใช่กับแท็บเพียงอย่างเดียว
คุณสมบัติของวัตถุหน้าต่างใน DOM
window.localStorage – ให้การเข้าถึงที่เก็บข้อมูลในตัวเครื่องของเบราว์เซอร์ ที่เก็บข้อมูลในตัวเครื่องสามารถใช้เพื่อจัดเก็บและดึงข้อมูลจากเซสชันได้
<script> window.localStorage.setItem('name','xyz'); var name = window.localStorage.getItem('name'); </script>
หน้าต่าง.ที่เปิด - รับการอ้างอิงถึงวัตถุหน้าต่างที่เปิดหน้าต่างนี้ (ไม่ว่าจะโดยการคลิกที่ลิงค์หรือใช้วิธี window.open)
วิธีการที่เป็นประโยชน์ของ Window Object
หน้าต่าง.การแจ้งเตือน() – แสดงข้อความแจ้งเตือนพร้อมข้อความ
<script> window.alert('say hello'); </script>
มีเหตุการณ์ที่เป็นประโยชน์มากมายที่วัตถุหน้าต่างเปิดเผย เราจะพูดคุยกันในส่วน "กิจกรรม" ใต้หัวข้อขั้นสูง
เอกสาร
เอกสารเป็นจุดเริ่มต้นของแผนผัง DOM เอกสารเป็นโหนดแรกใน DOM มีวิธีการและคุณสมบัติหลายวิธี ซึ่งมีขอบเขตใช้กับเอกสารทั้งหมด เช่น URL, getElementById, querySelector เป็นต้น
คุณสมบัติของวัตถุเอกสารใน DOM
เอกสาร.documentURI และ เอกสาร.URL – ทั้งคู่ส่งคืนตำแหน่งปัจจุบันของเอกสาร อย่างไรก็ตาม หากเอกสารไม่ใช่ประเภท HTML Document.URL จะไม่ทำงาน
เอกสาร.activeElement – วิธีการนี้ส่งคืนองค์ประกอบใน DOM ที่อยู่ในโฟกัส ซึ่งหมายความว่าหากผู้ใช้กำลังพิมพ์ในกล่องข้อความ Document.activeElement จะส่งคืนการอ้างอิงไปยังกล่องข้อความนั้น
เอกสาร.หัวเรื่อง – ใช้เพื่ออ่านหรือตั้งชื่อเรื่องของเอกสารที่กำหนด
วิธีการที่เป็นประโยชน์ของวัตถุเอกสาร
Document.getElementById(รหัสสตริง) – นี่คือวิธีที่เกี่ยวข้องและมีประโยชน์มากที่สุดในการจัดการ DOM ใช้เพื่อค้นหาองค์ประกอบใน DOM tree โดยใช้ตัวระบุเฉพาะ การค้นหาจะคำนึงถึงตัวพิมพ์เล็ก/ใหญ่ เช่น ในตัวอย่างต่อไปนี้ “ ” ไม่สามารถค้นหาองค์ประกอบได้โดยใช้คำเช่น IntroDiv, introdiv หรือ iNtrodiv เป็นต้น
<!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 (ตัวเลือกสตริง) – นี่เป็นอีกวิธีที่ใช้กันอย่างแพร่หลายในการเลือกองค์ประกอบเพิ่มเติมตามกฎของตัวเลือก CSS (หากคุณคุ้นเคยกับสัญลักษณ์ $ ของ jQuery นั่นก็ใช้วิธีนี้) เราจะไม่เจาะลึกตัวเลือก CSS มากนัก ตัวเลือก CSS คือชุดของกฎที่คุณอาจได้รับรายการองค์ประกอบที่คล้ายกัน (ตามกฎของตัวเลือก) เราเคยใช้วิธีนี้มาก่อนในส่วน “Hello World”
ธาตุ
วัตถุองค์ประกอบใน DOM
องค์ประกอบคือวัตถุใด ๆ ที่แสดงโดยโหนดในแผนผัง DOM ของเอกสาร เช่นเคย ออบเจ็กต์ Element นั้นเป็นเพียงสัญญาคุณสมบัติ วิธีการ และเหตุการณ์ระหว่างเบราว์เซอร์และเอกสาร HTML มีองค์ประกอบประเภทพิเศษ เช่น HTMLElement, SVGElement, XULElement เป็นต้น เราจะเน้นเฉพาะ HTMLElement ในบทช่วยสอนนี้
คุณสมบัติของวัตถุองค์ประกอบใน DOM
องค์ประกอบ.id – คุณสมบัตินี้สามารถใช้เพื่อตั้งค่าหรืออ่าน “ID” (ตัวระบุที่ไม่ซ้ำกัน) สำหรับองค์ประกอบ HTML รหัสจะต้องไม่ซ้ำกันในองค์ประกอบต่างๆ ในแผนผัง DOM ตามที่กล่าวไว้ก่อนหน้านี้ ID ยังถูกใช้โดยเมธอด Document.getElementById เพื่อเลือกออบเจ็กต์องค์ประกอบเฉพาะภายในแผนผัง DOM
HTMLElement.contentแก้ไขได้ คุณสมบัติ contentEditable ขององค์ประกอบจะกำหนดว่าเนื้อหาขององค์ประกอบนั้นสามารถแก้ไขหรือปรับเปลี่ยนได้หรือไม่ คุณสมบัตินี้สามารถตั้งค่าได้ตามที่แสดงในสคริปต์ด้านล่าง คุณสมบัตินี้ยังใช้เพื่อกำหนดว่าองค์ประกอบที่กำหนดนั้นสามารถแก้ไขได้หรือไม่ ลองใช้สคริปต์ต่อไปนี้ภายในเนื้อหา HTML ใดๆ แล้วคุณจะสังเกตเห็นว่าคุณสามารถแก้ไขเนื้อหาใดๆ ของเนื้อหาได้
<script> document.body.contentEditable = true; </script>
Element.innerHTML – innerHTML เป็นคุณสมบัติสำคัญอีกประการหนึ่งที่เราใช้ในการเข้าถึงเนื้อหา HTML ภายในองค์ประกอบ นอกจากนี้ยังใช้ในการตั้งค่าเนื้อหา HTML ใหม่ขององค์ประกอบอีกด้วย มักใช้ในการตั้งค่า/เปลี่ยนแปลงเนื้อหาของฟิลด์ข้อมูล ตัวอย่างเช่น หากคุณต้องการให้เว็บเพจของคุณอัปเดตอุณหภูมิของเมืองมุมไบทุกชั่วโมง คุณสามารถเรียกใช้สคริปต์ในตัวอย่างต่อไปนี้ทุกชั่วโมง
<!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>
วิธีการที่เป็นประโยชน์ของวัตถุองค์ประกอบ
HTMLElement.เบลอ() & HTMLElement.โฟกัส() วิธีการเบลอและโฟกัสใช้เพื่อลบโฟกัสออกจากหรือให้โฟกัสไปที่องค์ประกอบ HTML ตามลำดับ วิธีการเหล่านี้ใช้กันอย่างแพร่หลายเพื่อย้ายโฟกัสของเคอร์เซอร์ระหว่างกล่องข้อความในหน้าเว็บป้อนข้อมูล
Element.querySelectorAll – วิธีการนี้คล้ายกับวิธี querySelector ที่กล่าวถึงแล้วสำหรับวัตถุเอกสาร อย่างไรก็ตาม วิธีนี้จะจำกัดการค้นหาภายในองค์ประกอบสืบทอดขององค์ประกอบนั้นเอง
การดีบักใน DOM
เครื่องมือสำหรับนักพัฒนาของ Google Chrome, มอซิลล่า Firefox, Internet Explorer (10 หรือสูงกว่า) หรือ Safari ช่วยให้แก้ไขจุดบกพร่องได้ง่ายภายในเบราว์เซอร์ บางครั้งเบราว์เซอร์ที่ต่างกันจะตีความมาร์กอัป HTML เดียวกันแตกต่างกัน และนั่นคือเมื่อการดีบักช่วยให้คุณตรวจสอบ DOM ตามที่ได้รับการตีความโดยกลไก DOM ของเบราว์เซอร์นั้น ๆ
ตอนนี้ สมมติว่าคุณต้องการเปลี่ยนค่าอุณหภูมิจาก 26oC ถึง 32oC ในตัวอย่างสุดท้ายของคุณ เราจะดำเนินการตามขั้นตอนง่ายๆ ไม่กี่ขั้นตอนในการทำเช่นนั้น ภาพหน้าจอที่แสดงที่นี่มาจาก Mozilla's Firefox– อย่างไรก็ตาม ขั้นตอนจะเหมือนกันในเบราว์เซอร์อื่นๆ ทั้งหมด
- เปิด MyFileNewFile.html (หรือชื่อใดก็ตามที่คุณตั้งให้กับไฟล์ HTML ในบทช่วยสอนด้านบน) โดยใช้เบราว์เซอร์
-
ใช้เมาส์และคลิกขวาที่ค่าอุณหภูมิ 26oC และคลิกที่ “ตรวจสอบองค์ประกอบ”
-
โปรดสังเกตว่าองค์ประกอบที่คุณเลือก "ตรวจสอบองค์ประกอบ" จะถูกเน้นในเบราว์เซอร์ของคุณ (หน้าต่างดีบักเกอร์มักจะปรากฏที่ด้านล่างของหน้าจอ)
-
เปิด องค์ประกอบโดยคลิกสามเหลี่ยมเอียงด้านข้าง
-
เลือกสิ่งที่คุณต้องการแก้ไขแล้วดับเบิลคลิก คุณจะได้รับตัวเลือกในการเปลี่ยนแปลงข้อความ ทำตามขั้นตอนในภาพเคลื่อนไหวด้านล่าง
-
สังเกตเห็นการเปลี่ยนแปลงในเนื้อหาของหน้า HTML ของคุณ คุณสามารถปิดหน้าต่างการแก้ไขข้อบกพร่องได้ทันที
โปรดทราบว่าการเปลี่ยนแปลงของคุณจะยังคงอยู่สำหรับเซสชันนี้เท่านั้น ทันทีที่คุณโหลดซ้ำหรือรีเฟรช (กด F5) หน้าเว็บ การเปลี่ยนแปลงจะถูกเปลี่ยนกลับ สิ่งนี้บ่งชี้ว่าคุณไม่ได้เปลี่ยนซอร์ส HTML จริง แต่เป็นเพียงการตีความท้องถิ่นของเบราว์เซอร์ของคุณ
ลองทำสิ่งต่อไปนี้เพื่อความสนุกสนาน www.facebook.com ในเบราว์เซอร์ของคุณและใช้เครื่องมือดีบักเกอร์เพื่อติดตามผลลัพธ์ – สังเกตว่ามีข้อความว่า “ฉันแฮ็ก Facebook”
กิจกรรม DOM
กิจกรรมใน DOM คืออะไร
เหตุการณ์คือรูปแบบการเขียนโปรแกรมที่เหตุการณ์ที่ผู้ใช้ทริกเกอร์ (หรือวงจรชีวิตของหน้าเบราว์เซอร์ที่ทริกเกอร์) จะถูกถ่ายทอดเป็นข้อความ ตัวอย่างเช่น เมื่อเพจโหลดเสร็จแล้ว จะทำให้เกิดเหตุการณ์ window.load และในทำนองเดียวกันเมื่อผู้ใช้คลิกปุ่มนั้น เหตุการณ์การคลิกขององค์ประกอบถูกทริกเกอร์
ข้อความเหล่านี้สามารถดักจับได้ Javaต้นฉบับ รหัสแล้วจึงดำเนินการตามที่ผู้พัฒนากำหนดได้ ตัวอย่างเช่น คุณต้องการให้ตัวเลขบนเว็บเพจของคุณอัปเดตเฉพาะเมื่อผู้ใช้คลิกปุ่มเท่านั้น คุณสามารถทำได้โดยใช้วิธีใดวิธีหนึ่งต่อไปนี้
- กำหนดการดำเนินการให้กับเหตุการณ์ onclick ขององค์ประกอบ HTML
- กำหนดการดำเนินการให้กับเหตุการณ์การคลิกโดยใช้วิธี addEventListener
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>
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>
การแก้ไขปัญหาใน DOM
ถาม ฉันจะรู้ได้อย่างไรว่ามีองค์ประกอบอยู่หรือไม่
A. ลองค้นหาองค์ประกอบโดยใช้ตัวเลือกใดๆ และตรวจสอบว่าองค์ประกอบที่ส่งคืนเป็นค่าว่างหรือไม่ ดูตัวอย่างด้านล่าง –
if(document.getElementById("elementIDWhichIsNotPresentInDOM") === null) { //do something }
ถาม ฉันได้รับ TypeError: document.getElementByID ไม่ใช่ฟังก์ชัน...
A. ตรวจสอบให้แน่ใจว่าชื่อวิธีการตรงกับวิธีการ API ทุกประการ เช่นเดียวกับในคำถามข้างต้น - มันคือ getElementById และไม่ใช่ getElementByID
ถาม Children และ ChildNodes แตกต่างกันอย่างไร
A. วิธี children ช่วยให้เรารวบรวมองค์ประกอบทั้งหมดภายในองค์ประกอบที่เรียก คอลเลกชันที่ส่งคืนเป็นประเภท HTMLCollection อย่างไรก็ตาม วิธี childNodes ช่วยให้เรารวบรวมโหนดทั้งหมดภายในองค์ประกอบที่เรียก เพิ่มสคริปต์ต่อไปนี้ลงในตัวอย่างของเราและดูความแตกต่าง –
วิธีการ childNodes ส่งคืน 14 รายการ
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);
ในขณะที่วิธีลูกส่งคืนเพียง 7 รายการ
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);
ถาม ฉันได้รับ Uncaught TypeError: ไม่สามารถอ่านคุณสมบัติ 'innerHTML' ของ undefinition...
A. ตรวจสอบให้แน่ใจว่าอินสแตนซ์ของ HTMLElement ที่คุณเรียกใช้คุณสมบัติ innerHTML นั้นถูกตั้งค่าหลังจากการประกาศครั้งแรก ข้อผิดพลาดนี้มักเกิดขึ้นในสถานการณ์ต่อไปนี้ ดูวิธีหลีกเลี่ยงข้อผิดพลาดในบล็อกโค้ดถัดไป...
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'; }
สรุป
- ในบทช่วยสอนนี้ เราได้เรียนรู้ว่า DOM คืออะไร และแนวคิดสำคัญในการทำความเข้าใจเพื่อสร้างหน้าเว็บแบบไดนามิกเป็นอย่างไร
- นอกจากนี้เรายังได้กล่าวถึงประเภทขององค์ประกอบ DOM เช่น หน้าต่าง เอกสาร และองค์ประกอบ
- เราได้เรียนรู้วิธีการและคุณสมบัติ DOM ที่เป็นประโยชน์ซึ่งมีอยู่ในแต่ละประเภท
- เราได้เห็นวิธีที่เบราว์เซอร์ส่วนใหญ่นำเสนอเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์เพื่อเล่นกับหน้าเว็บใดๆ ก็ตามที่มีอยู่บนอินเทอร์เน็ต ดังนั้นการเรียนรู้ที่จะแก้ไขจุดบกพร่องและแก้ไขปัญหาเกี่ยวกับเว็บไซต์ของเราเอง
- นอกจากนี้เรายังกล่าวถึงกลไกเหตุการณ์ DOM สั้นๆ ด้วย
- สุดท้ายนี้ เราได้กล่าวถึงรายการแก้ไขปัญหาบางประการใน DOM
- อินเทอร์เน็ตเต็มไปด้วยทรัพยากรบน DOM หนึ่งในเอกสารอ้างอิงที่ดีที่สุดและทันสมัยมีอยู่ที่เครือข่ายนักพัฒนาของ Mozilla ดู - https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model