HTML इनपुट का मान पुनः प्राप्त करने के लिए सेलेनियम वेब ड्राइवर का उपयोग करना


122

एक webapp के HTML में निम्न कोड होता है

<input type="text" name="prettyTime" id="prettyTime" class="ui-state-disabled prettyTime"  readonly="readonly">

पृष्ठ पर वास्तव में जो दिखाया गया है वह समय प्रदर्शित करने वाला एक स्ट्रिंग है।

सेलेनियम वेब ड्राइवर में, मेरे पास उपयोग WebElementकरने के लिए एक वस्तु है<input>

WebElement timeStamp = waitForElement(By.id("prettyTime"));

मैं WebElementदूसरे शब्दों में, पृष्ठ पर क्या छपा है, का मूल्य प्राप्त करना चाहता हूं । मैंने सभी WebElementप्राप्तकर्ताओं की कोशिश की और कुछ भी वास्तविक मूल्य को पुनर्प्राप्त नहीं कर रहा है जो उपयोगकर्ता देखता है। कोई मदद? धन्यवाद।

जवाबों:


212

प्रयत्न element.getAttribute("value")

textसंपत्ति एक तत्व के टैग के भीतर पाठ के लिए है। इनपुट तत्वों के लिए, प्रदर्शित पाठ को <input>टैग द्वारा लपेटा नहीं गया है , इसके बजाय यह valueविशेषता के अंदर है ।

नोट: मामला मायने रखता है। यदि आप "मान" निर्दिष्ट करते हैं, तो आपको 'शून्य' मान वापस मिलेगा। यह सी # के लिए कम से कम सच है।


12
getAttribute("value")है वास्तव में तुम ऐसा कैसे कर ?! इसका कोई मतलब नहीं है। valueकिसी inputतत्व की विशेषता और उसकी valueसंपत्ति के बीच एक बड़ा अंतर है। क्या सेलेनियम भयानक काम करता है jQuery और उन्हें भ्रमित करता है?
टीजे क्राउडर

यही मैंने अभी से टकराया है: एक textarea से एक मान प्राप्त करने की कोशिश कर रहा है, जो न तो "मूल्य" विशेषता है, और न ही एक टैग-पाठ (गतिशील रूप से "मान" विशेषता के रूप में सेट करें।
CF

2
खैर, यह पता चला है कि यदि विशेषता गायब है, तो वह संबंधित संपत्ति प्राप्त करने का प्रयास करेगा। तो आप एक textarea से "मूल्य" ले सकते हैं।
CF

जाहिरा तौर पर, यह एकमात्र तरीका है जिससे मैं एंगुलेट मटेरियल फॉर्म फील्ड्स को एक्सेस करने में कामयाब रहा
येनिफर

जावास्क्रिप्ट उपयोगकर्ताओं के लिए, awaitका उपयोग करते समय मत भूलना getAttribute
जेफरी मार्टिनेज

28

आप इस तरह कर सकते हैं:

webelement time=driver.findElement(By.id("input_name")).getAttribute("value");

यह आपको वेबपृष्ठ पर प्रदर्शित होने का समय देगा।


17

सेलेनियम 2 के साथ,

मैं आमतौर पर इसे इस तरह लिखता हूं:

WebElement element = driver.findElement(By.id("input_name"));
String elementval = element.getAttribute("value");

या

String elementval = driver.findElement(By.id("input_name")).getAttribute("value");


5

@Ragzzy के उत्तर के बाद मैं उपयोग करता हूं

 public static string Value(this IWebElement element, IJavaScriptExecutor javaScriptExecutor)
    {

        try
        {
            string value = javaScriptExecutor.ExecuteScript("return arguments[0].value", element) as string;
            return value;
        }
        catch (Exception)
        {
            return null;
        }
    }

यह काफी अच्छी तरह से काम करता है और DOM को बदलता नहीं है


5

जैसा कि पहले उल्लेख किया गया था, आप ऐसा कुछ कर सकते थे

public String getVal(WebElement webElement) {
    JavascriptExecutor e = (JavascriptExecutor) driver;
    return (String) e.executeScript(String.format("return $('#%s').val();", webElement.getAttribute("id")));
}

लेकिन जैसा कि आप देख सकते हैं, आपके तत्व में एक idविशेषता होनी चाहिए , और यह भी, आपके पृष्ठ पर jquery।


1

अगर इनपुट वैल्यू किसी स्क्रिप्ट से पॉप्युलर हो जाती है जिसमें कुछ लेटेंसी शामिल होती है (जैसे AJAX कॉल) तो आपको तब तक इंतजार करना होगा जब तक इनपुट पॉपुलेट न हो जाए। उदाहरण के लिए

var w = new WebDriverWait(WebBrowser, TimeSpan.FromSeconds(10));
            w.Until((d) => {
                // Wait until the input has a value...

                var elements = d.FindElements(By.Name(name));

                var ele = elements.SingleOrDefault();

                if (ele != null)
                {
                    // Found a single element

                    if (ele.GetAttribute("value") != "")
                    {
                        // We have a value now
                        return true;
                    }
                }

                return false;
                });

        var e = WebBrowser.Current.FindElement(By.Name(name));

        if (e.GetAttribute("value") != value)
        {
            Assert.Fail("Result contains a field named '{0}', but its value is '{1}', not '{2}' as expected", name, e.GetAttribute("value"), value);
        }

0

element.GetAttribute ( "मूल्य");

यदि आप html डोम में "मान" विशेषता नहीं देखते हैं, तो आपको GUI पर प्रदर्शित फ़ील्ड मान मिल जाएगा।


-1

यह एक तरह से हैकी है, लेकिन यह काम करता है।

मैं प्रयोग किया जाता JavascriptExecutorहै और एक जोड़ा divHTML के लिए, और में पाठ बदल divकरने के लिए $('#prettyTime').val()मैं तो सेलेनियम इस्तेमाल किया पुनः प्राप्त करने divऔर अपने मूल्य हड़पने। मूल्य की शुद्धता का परीक्षण करने के बाद, मैंने उस div को हटा दिया जो अभी बनाया गया था।


11
यह स्वीकृत उत्तर नहीं होना चाहिए। यहां तक ​​कि अगर JS का उपयोग कर रहे हैं, तो आप केवल निष्पादित कर सकते हैं और वापस लौट सकते हैं (बजाय DOM के साथ गड़बड़ करने के)।
मैट लुओंगो जूल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.