เลือกองค์ประกอบหลักขององค์ประกอบที่รู้จักในซีลีเนียม


116

ฉันมีองค์ประกอบบางอย่างที่สามารถเลือกได้ด้วยซีลีเนียม 1

น่าเสียดายที่ฉันต้องคลิกองค์ประกอบหลักเพื่อให้ได้พฤติกรรมที่ต้องการ องค์ประกอบที่ฉันสามารถค้นหาได้อย่างง่ายดายมีแอตทริบิวต์ที่ไม่สามารถเลือกได้ทำให้ไม่สามารถคลิกได้ ฉันจะเลื่อนขึ้นไปข้างบนด้วยXPath ได้อย่างไร

คำตอบ:


169

มีสองตัวเลือกที่นั่น โค้ดตัวอย่างอยู่ใน Java แต่พอร์ตไปยังภาษาอื่นควรตรงไปตรงมา

JavaScript:

WebElement myElement = driver.findElement(By.id("myDiv"));
WebElement parent = (WebElement) ((JavascriptExecutor) driver).executeScript(
                                   "return arguments[0].parentNode;", myElement);

XPath:

WebElement myElement = driver.findElement(By.id("myDiv"));
WebElement parent = myElement.findElement(By.xpath("./.."));

การขอรับไดรเวอร์จากไฟล์ WebElement

หมายเหตุ:อย่างที่คุณเห็นสำหรับเวอร์ชัน JavaScript คุณจะต้องมีไฟล์driver. หากคุณไม่สามารถเข้าถึงได้โดยตรงคุณสามารถดึงข้อมูลได้จากการWebElementใช้:

WebDriver driver = ((WrapsDriver) myElement).getWrappedDriver();

41
และถ้าคุณต้องการนำทางไปยังปู่ย่าตายายให้ใช้ By.Xpath ("../ .. ")
พระคุณเจ้า

@Monsignor ทำงานเหมือนกับเส้นทางไฟล์ ... หรือเส้นทาง URL: stackoverflow.com/questions/8577636/../../questions/8577636/…
jpaugh

XPaths เหล่านี้ไม่ถูกต้องสำหรับใช้กับซีลีเนียม หนึ่งในความต้องการที่จะใช้By.xpath(“./..”)อย่างถูกต้องเดินขึ้นไปบนต้นไม้ DOM element.findElementเมื่อใช้ จำเป็นต้องมี“ ./” นำหน้าเพื่อตั้งค่าโหนดบริบท
JimEvans

35

เพิ่มเติมเล็กน้อยเกี่ยวกับ XPath axes

สมมติว่าเรามีHTMLโครงสร้างด้านล่าง:

<div class="third_level_ancestor">
    <nav class="second_level_ancestor">
        <div class="parent">
            <span>Child</span>
        </div>
    </nav>
</div>
  1. //span/parent::*- ส่งคืนองค์ประกอบใด ๆที่เป็นพาเรนต์โดยตรง

ในกรณีนี้ผลลัพธ์คือ <div class="parent">

  1. //span/parent::div[@class="parent"]- องค์ประกอบของผลตอบแทนที่ผู้ปกครองเพียงประเภทโหนดที่แน่นอนและเพียงถ้ากริยาที่ระบุเป็น True

เอาท์พุท: <div class="parent">

  1. //span/ancestor::*- ส่งคืนบรรพบุรุษทั้งหมด (รวมทั้งผู้ปกครอง)

เอาท์พุท: <div class="parent">, <nav class="second_level_ancestor">, <div class="third_level_ancestor">...

  1. //span/ancestor-or-self::*- ผลตอบแทนทุกบรรพบุรุษและองค์ประกอบปัจจุบันตัวเอง

เอาท์พุท: <span>Child</span>, <div class="parent">, <nav class="second_level_ancestor">, <div class="third_level_ancestor">...

  1. //span/ancestor::div[2]- ผลตอบแทนบรรพบุรุษที่สอง (เริ่มต้นจากผู้ปกครอง) divของประเภท

เอาท์พุท: <div class="third_level_ancestor">


สวัสดี @ แอนเดอร์สันฉันต้องการความช่วยเหลือเกี่ยวกับคำถามของฉันคุณมีเวลาดูไหม? ขอบคุณล่วงหน้า. stackoverflow.com/questions/54647055/…

18

ลองพิจารณา 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']]"));
ใจประกอก

14

ลองดูที่เป็นไปได้แกน XPathparentคุณอาจจะมองหา ขึ้นอยู่กับว่าคุณกำลังค้นหาองค์ประกอบแรกอย่างไรคุณสามารถปรับ xpath สำหรับสิ่งนั้นได้

หรือคุณสามารถลองไวยากรณ์แบบ double-dot , ..ที่เลือกแม่ของโหนดปัจจุบัน


5

สิ่งนี้อาจเป็นประโยชน์สำหรับคนอื่น: การใช้ 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มีDontSelectdiv เป็นพาเรนต์

เคล็ดลับคือคุณสามารถลดพื้นที่การค้นหาสำหรับองค์ประกอบได้โดยไปที่พาเรนต์ก่อนจากนั้นค้นหาผู้สืบทอดของพาเรนต์นั้นสำหรับองค์ประกอบที่คุณต้องการ following-sibling::h2นอกจากนี้ยังสามารถใช้ไวยากรณ์อื่น ๆ เช่นในบางกรณี h2ซึ่งหมายความว่าพี่น้ององค์ประกอบดังต่อไปนี้ สิ่งนี้จะใช้ได้กับองค์ประกอบในระดับเดียวกันโดยมีพาเรนต์เดียวกัน


0

คุณสามารถทำได้โดยใช้/ parent :: node ()ใน xpath เพียงแค่ผนวก / parent :: node ()เข้ากับองค์ประกอบลูก xpath

ตัวอย่างเช่น: Let XPath ขององค์ประกอบเด็กchildElementXpath

XPath ของบรรพบุรุษของมันทันทีแล้วก็จะchildElementXpath / ผู้ปกครอง :: โหนด ()

Xpath ของบรรพบุรุษถัดไปจะเป็นchildElementXpath / parent :: node () / parent :: node ()

และอื่น ๆ ..

'childElementXpath/ancestor::*[@attr="attr_value"]'นอกจากนี้คุณยังสามารถนำทางไปยังบรรพบุรุษขององค์ประกอบในการใช้ สิ่งนี้จะมีประโยชน์เมื่อคุณมีองค์ประกอบลูกที่รู้จักซึ่งไม่ซ้ำกัน แต่มีองค์ประกอบหลักที่ไม่สามารถระบุได้โดยเฉพาะ


0

เราสามารถเลือกแท็กหลักด้วยความช่วยเหลือของซีลีเนียมได้ดังนี้:

driver.findElement(By.xpath("//table[@id='abc']//div/nobr[.='abc']/../.."));

สิ่งนี้จะช่วยให้คุณพบปู่ย่าตายายของธาตุที่รู้จัก เพียงลบหนึ่ง (/ .. ) เพื่อค้นหาองค์ประกอบหลักในทันที

ชอบ:

driver.findElement(By.xpath("//table[@id='abc']//div/nobr[.='abc']/..));

มีวิธีอื่นในการนำไปใช้ แต่มันก็ใช้ได้ดีสำหรับฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.