सेलेनियम में ज्ञात तत्व के मूल तत्व का चयन करें


116

मेरे पास एक निश्चित तत्व है जिसे मैं सेलेनियम 1 के साथ चुन सकता हूं ।

दुर्भाग्य से मुझे वांछित व्यवहार प्राप्त करने के लिए मूल तत्व पर क्लिक करने की आवश्यकता है। जिस तत्व का मैं आसानी से पता लगा सकता हूं, वह अचूक है, जिससे यह क्लिक करने के लिए मृत हो जाता है। मैं XPath के साथ ऊपर की ओर कैसे नेविगेट करूं ?

जवाबों:


169

वहाँ विकल्पों में से एक जोड़े हैं। नमूना कोड जावा में है, लेकिन अन्य भाषाओं के लिए एक पोर्ट सीधा होना चाहिए।

जावास्क्रिप्ट:

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

नोट: जैसा कि आप देख सकते हैं, जावास्क्रिप्ट संस्करण के लिए आपको आवश्यकता होगी driver। यदि आपके पास इसकी सीधी पहुँच नहीं है, तो आप इसे WebElementउपयोग से पुनः प्राप्त कर सकते हैं :

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

41
और अगर आप दादा-दादी के लिए नेविगेट करना चाहते हैं, तो By.Xpath ("../ ..") का उपयोग करें।
मोनसिग्नॉर

@ मेनसिनर फ़ाइल पथों की तरह ही काम करता है ... या URL पथ: stackoverflow.com/questions/8577636/../../questions/8577636/…
jpaugh

इनमें से कोई भी XPaths सेलेनियम के साथ उपयोग के लिए सही नहीं है। उपयोग By.xpath(“./..”)करते समय DOM ट्री को सही ढंग से चलने के लिए उपयोग करने की आवश्यकता है element.findElement। संदर्भ नोड सेट करने के लिए अग्रणी "./" आवश्यक है।
जिमेवान्स

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"]- केवल सटीक नोड प्रकार के मूल तत्व देता है और केवल यदि निर्दिष्ट विधेय सत्य है।

आउटपुट: <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">


हैलो @Anderson मुझे अपने प्रश्न के साथ मदद की ज़रूरत है क्या आपके पास एक बार देखने का समय है? पहले ही, आपका बहुत धन्यवाद। stackoverflow.com/questions/54647055/…

18

चलो अपने डोम के रूप में विचार करें

<a>
    <!-- some other icons and texts -->
    <span>Close</span>
</a>

अब जब आपको <span>टेक्स्ट के आधार पर पैरेंट टैग 'a' का चयन करना है , तो उपयोग करें

driver.findElement(By.xpath("//a[.//span[text()='Close']]"));

स्पष्टीकरण: इसके बाल नोड के मूल्य के आधार पर नोड का चयन करें


हम देख रहे हैं के लिए divजो फिर कई divs साथ तो बजाय नीडिंत है .//spanमें By.xpath("//div[.//span[text()='Close']]")हम उपयोग कर सकते हैं *//span, यह देखते हुए काल के सबसे माता पिता div तत्व के लिए दिखेगा। अब यह इस तरह दिखाई देगाdriver.findElement(By.xpath("//div[*//span[text()='Close']]"));
जय प्रकाश

14

संभावित XPath कुल्हाड़ियों पर एक नज़र डालें , आप शायद देख रहे हैं parent। इस बात पर निर्भर करता है कि आप पहला तत्व कैसे पा रहे हैं, आप उसके लिए सिर्फ xpath समायोजित कर सकते हैं।

वैकल्पिक रूप से आप डबल-डॉट सिंटैक्स की कोशिश कर सकते हैं , ..जो वर्तमान नोड के माता-पिता का चयन करता है।


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साथ दूसरे का चयन नहीं करेगा DontSelect

चाल यह है कि आप पहले माता-पिता के लिए नेविगेट करके एक तत्व के लिए खोज क्षेत्रों को कम कर सकते हैं और फिर उस तत्व के लिए उस मूल के वंशज की खोज कर सकते हैं जिसकी आपको आवश्यकता है। अन्य सिंटेक्स जैसे following-sibling::h2कुछ मामलों में भी इस्तेमाल किया जा सकता है। इसका मतलब सिबलिंग निम्नलिखित तत्व है h2। यह उसी स्तर पर तत्वों के लिए काम करेगा, जिसमें समान अभिभावक हों।


0

आप xpath में / माता-पिता :: नोड () का उपयोग करके ऐसा कर सकते हैं । सीधे शब्दों में / माता-पिता :: नोड () बाल तत्वों xpath करने के लिए।

उदाहरण के लिए: चाइल्ड एलिमेंट का xpath चाइल्ड एलिमेंटएक्सपैथ है

तब इसके तत्काल पूर्वज का xpath चाइल्डएमेंटएक्सपैथ / माता-पिता :: नोड () होगा

इसके अगले पूर्वज का Xpath चाइल्डहैल्मेंटएक्सपैथ / माता-पिता :: नोड () / माता-पिता :: नोड () होगा

और इसी तरह..

इसके अलावा, आप किसी तत्व के पूर्वज का उपयोग करके नेविगेट कर सकते हैं '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']/..));

इसे लागू करने के कुछ अन्य तरीके हैं, लेकिन इसने मेरे लिए ठीक काम किया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.