คำตอบ:
มีสองตัวเลือกที่นั่น โค้ดตัวอย่างอยู่ใน Java แต่พอร์ตไปยังภาษาอื่นควรตรงไปตรงมา
WebElement myElement = driver.findElement(By.id("myDiv"));
WebElement parent = (WebElement) ((JavascriptExecutor) driver).executeScript(
"return arguments[0].parentNode;", myElement);
WebElement myElement = driver.findElement(By.id("myDiv"));
WebElement parent = myElement.findElement(By.xpath("./.."));
WebElement
หมายเหตุ:อย่างที่คุณเห็นสำหรับเวอร์ชัน JavaScript คุณจะต้องมีไฟล์driver
. หากคุณไม่สามารถเข้าถึงได้โดยตรงคุณสามารถดึงข้อมูลได้จากการWebElement
ใช้:
WebDriver driver = ((WrapsDriver) myElement).getWrappedDriver();
By.xpath(“./..”)
อย่างถูกต้องเดินขึ้นไปบนต้นไม้ DOM element.findElement
เมื่อใช้ จำเป็นต้องมี“ ./” นำหน้าเพื่อตั้งค่าโหนดบริบท
เพิ่มเติมเล็กน้อยเกี่ยวกับ XPath axes
สมมติว่าเรามีHTML
โครงสร้างด้านล่าง:
<div class="third_level_ancestor">
<nav class="second_level_ancestor">
<div class="parent">
<span>Child</span>
</div>
</nav>
</div>
//span/parent::*
- ส่งคืนองค์ประกอบใด ๆที่เป็นพาเรนต์โดยตรงในกรณีนี้ผลลัพธ์คือ <div class="parent">
//span/parent::div[@class="parent"]
- องค์ประกอบของผลตอบแทนที่ผู้ปกครองเพียงประเภทโหนดที่แน่นอนและเพียงถ้ากริยาที่ระบุเป็น Trueเอาท์พุท: <div class="parent">
//span/ancestor::*
- ส่งคืนบรรพบุรุษทั้งหมด (รวมทั้งผู้ปกครอง)เอาท์พุท: <div class="parent">
, <nav class="second_level_ancestor">
, <div class="third_level_ancestor">
...
//span/ancestor-or-self::*
- ผลตอบแทนทุกบรรพบุรุษและองค์ประกอบปัจจุบันตัวเองเอาท์พุท: <span>Child</span>
, <div class="parent">
, <nav class="second_level_ancestor">
, <div class="third_level_ancestor">
...
//span/ancestor::div[2]
- ผลตอบแทนบรรพบุรุษที่สอง (เริ่มต้นจากผู้ปกครอง) div
ของประเภทเอาท์พุท: <div class="third_level_ancestor">
ลองพิจารณา DOM ของคุณเป็น
<a>
<!-- some other icons and texts -->
<span>Close</span>
</a>
ตอนนี้คุณต้องเลือกแท็กหลัก 'a' ตาม<span>
ข้อความจากนั้นใช้
driver.findElement(By.xpath("//a[.//span[text()='Close']]"));
คำอธิบาย: เลือกโหนดตามค่าของโหนดลูก
div
สิ่งที่ซ้อนกันอีกครั้งด้วย div หลาย ๆ ตัวแทนที่จะใช้.//span
ในBy.xpath("//div[.//span[text()='Close']]")
เรา*//span
จะมองหาองค์ประกอบ div หลักของช่วงที่กำหนด ตอนนี้จะเป็นแบบนี้driver.findElement(By.xpath("//div[*//span[text()='Close']]"));
ลองดูที่เป็นไปได้แกน XPathparent
คุณอาจจะมองหา ขึ้นอยู่กับว่าคุณกำลังค้นหาองค์ประกอบแรกอย่างไรคุณสามารถปรับ xpath สำหรับสิ่งนั้นได้
หรือคุณสามารถลองไวยากรณ์แบบ double-dot , ..
ที่เลือกแม่ของโหนดปัจจุบัน
สิ่งนี้อาจเป็นประโยชน์สำหรับคนอื่น: การใช้ html ตัวอย่างนี้
<div class="ParentDiv">
<label for="label">labelName</label>
<input type="button" value="elementToSelect">
</div>
<div class="DontSelect">
<label for="animal">pig</label>
<input type="button" value="elementToSelect">
</div>
ตัวอย่างเช่นฉันต้องการเลือกองค์ประกอบในส่วนเดียวกัน (เช่น div) เป็นป้ายกำกับคุณสามารถใช้สิ่งนี้ได้
//label[contains(., 'labelName')]/parent::*//input[@value='elementToSelect']
เพียงแค่นี้ก็หมายถึงการมองหาป้าย (มันสามารถอะไรเช่นa
, h2
) labelName
ที่เรียกว่า ไปที่พาเรนต์ของป้ายกำกับนั้น (เช่นdiv class="ParentDiv"
) ค้นหาภายในลูกหลานของพาเรนต์นั้นเพื่อค้นหาองค์ประกอบลูกที่มีค่าelementToSelect
เป็น ด้วยสิ่งนี้จะไม่เลือกวินาทีที่elementToSelect
มีDontSelect
div เป็นพาเรนต์
เคล็ดลับคือคุณสามารถลดพื้นที่การค้นหาสำหรับองค์ประกอบได้โดยไปที่พาเรนต์ก่อนจากนั้นค้นหาผู้สืบทอดของพาเรนต์นั้นสำหรับองค์ประกอบที่คุณต้องการ following-sibling::h2
นอกจากนี้ยังสามารถใช้ไวยากรณ์อื่น ๆ เช่นในบางกรณี h2
ซึ่งหมายความว่าพี่น้ององค์ประกอบดังต่อไปนี้ สิ่งนี้จะใช้ได้กับองค์ประกอบในระดับเดียวกันโดยมีพาเรนต์เดียวกัน
คุณสามารถทำได้โดยใช้/ parent :: node ()ใน xpath เพียงแค่ผนวก / parent :: node ()เข้ากับองค์ประกอบลูก xpath
ตัวอย่างเช่น: Let XPath ขององค์ประกอบเด็กchildElementXpath
XPath ของบรรพบุรุษของมันทันทีแล้วก็จะchildElementXpath / ผู้ปกครอง :: โหนด ()
Xpath ของบรรพบุรุษถัดไปจะเป็นchildElementXpath / parent :: node () / parent :: node ()
และอื่น ๆ ..
'childElementXpath/ancestor::*[@attr="attr_value"]'
นอกจากนี้คุณยังสามารถนำทางไปยังบรรพบุรุษขององค์ประกอบในการใช้
สิ่งนี้จะมีประโยชน์เมื่อคุณมีองค์ประกอบลูกที่รู้จักซึ่งไม่ซ้ำกัน แต่มีองค์ประกอบหลักที่ไม่สามารถระบุได้โดยเฉพาะ
เราสามารถเลือกแท็กหลักด้วยความช่วยเหลือของซีลีเนียมได้ดังนี้:
driver.findElement(By.xpath("//table[@id='abc']//div/nobr[.='abc']/../.."));
สิ่งนี้จะช่วยให้คุณพบปู่ย่าตายายของธาตุที่รู้จัก เพียงลบหนึ่ง (/ .. ) เพื่อค้นหาองค์ประกอบหลักในทันที
ชอบ:
driver.findElement(By.xpath("//table[@id='abc']//div/nobr[.='abc']/..));
มีวิธีอื่นในการนำไปใช้ แต่มันก็ใช้ได้ดีสำหรับฉัน