सी # में सेलेनियम वेबड्राइवर का उपयोग कर जावास्क्रिप्ट निष्पादित करें


103

यह कैसे प्राप्त किया जाता है? यहाँ यह जावा संस्करण है:

WebDriver driver; // Assigned elsewhere
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("return document.title");

लेकिन मुझे ऐसा करने के लिए C # कोड नहीं मिल रहा है।

जवाबों:


216

.NET लैंग्वेज बाइंडिंग में ऑब्जेक्ट, मेथड, और प्रॉपर्टी के नाम जावा बाइंडिंग के अनुरूप नहीं हैं। परियोजना के सिद्धांतों में से एक यह है कि प्रत्येक भाषा बाध्यकारी को उस भाषा में सहज कोडिंग के लिए "प्राकृतिक महसूस करना" चाहिए। C # में, जावास्क्रिप्ट को निष्पादित करने के लिए आपको जो कोड चाहिए वह इस प्रकार है

IWebDriver driver; // assume assigned elsewhere
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
string title = (string)js.ExecuteScript("return document.title");

ध्यान दें कि .NET के लिए WebDriver API का पूरा प्रलेखन इस लिंक पर पाया जा सकता है ।


10
जावा एस क्रिप्ट शब्द में पूंजीकरण पर ध्यान दें । इसने मुझे बाहर कर दिया।
WheretheresaWill

1
जिम का उत्तर उतना ही आधिकारिक है जितना आप प्राप्त कर सकते हैं। प्रत्येक सेलेनियम .NET फाइल :-),
रॉस पैटरसन

क्या आप मुझे बता सकते हैं कि C # में बटन कैसे क्लिक करें? जैसे जवाब arguments[0].click();मेरे लिए काम नहीं कर रहा है? मेरे कोड को निष्पादित करने पर मेरे पास कोई अपवाद नहीं है, लेकिन यह बटन पर क्लिक नहीं करता है।
एम्मेट

मुझे यह अजीब लगता है कि मुझे ड्राइवर को कास्ट करना है। ExecuteJavascriptसिर्फ एक विधि पर क्यों नहीं है driver?
कोलोब कैन्यन

यह एक ऐसे समय से शेष है जब हर ड्राइवर कार्यान्वयन ने मनमाने ढंग से जावास्क्रिप्ट को निष्पादित करने का समर्थन नहीं किया। .NET बाइंडिंग, जावा की तरह मॉडल कार्यक्षमता के लिए भूमिका-आधारित इंटरफेस का उपयोग करती है जो एक ड्राइवर द्वारा समर्थित हो सकती है, लेकिन सभी नहीं। समर्थन असेंबली में ( WebDriver.Support.dll, Selenium.Supportपैकेज में नुगेट के माध्यम से उपलब्ध ), एक विस्तार विधि है जो आपके लिए कास्टिंग को संभालती है और यह बनाती है जैसे ड्राइवर के पास एक ExecuteJavaScriptविधि है।
जिमेवन्स

51

मैं स्क्रिप्ट ऑब्जेक्ट प्राप्त करने के लिए एक एक्सटेंशन विधि का उपयोग करना पसंद करता हूं:

public static IJavaScriptExecutor Scripts(this IWebDriver driver)
{
    return (IJavaScriptExecutor)driver;
}

इस रूप में इस्तेमाल किया:

driver.Scripts().ExecuteScript("some script");

सेलेनियम में डिफ़ॉल्ट रूप से यह होना चाहिए
कोलोब कैन्यन

13

कैसे के बारे में थोड़ा सरल संस्करण @Morten ईसाई का अच्छा विस्तार विधि विचार:

public static object Execute(this IWebDriver driver, string script)
{
    return ((IJavaScriptExecutor)driver).ExecuteScript(script);
}

// usage
var title = (string)driver.Execute("return document.title");

या शायद सामान्य संस्करण:

public static T Execute<T>(this IWebDriver driver, string script)
{
    return (T)((IJavaScriptExecutor)driver).ExecuteScript(script);
}

// usage
var title = driver.Execute<string>("return document.title");

1
क्या इसका उपयोग WebElement और बूल प्राप्त करने के लिए किया जा सकता है?
रहूलम

12

nuget पैकेज में Selenium.Supportपहले से ही इसकी सहायता के लिए एक विस्तार विधि है। एक बार इसे शामिल करने के बाद, स्क्रिप्ट को निष्पादित करने के लिए एक लाइनर

  Driver.ExecuteJavaScript("console.clear()");

या

  string result = Driver.ExecuteJavaScript<string>("console.clear()");

यह एक अच्छा, आधुनिक समाधान है। एक्सटेंशन विधि सत्यापन को जोड़ती है कि ड्राइवर लागू करता है IJavaScriptExecutorऔर बेहतर अपवाद संदेश देता है यदि वापसी प्रकार अशक्त है जब यह वांछित रिटर्न प्रकार के लिए नहीं होना चाहिए या नहीं डाला जा सकता है।
जेफरी लेकोर्स

क्या है Driver? VS यह नहीं पहचान सकता कि
anatol

क्या आपने नगेट लगाया है ??
हरिश

8

आप भी कर सकते हैं:

public static IWebElement FindElementByJs(this IWebDriver driver, string jsCommand)
{
    return (IWebElement)((IJavaScriptExecutor)driver).ExecuteScript(jsCommand);
}

public static IWebElement FindElementByJsWithWait(this IWebDriver driver, string jsCommand, int timeoutInSeconds)
{
    if (timeoutInSeconds > 0)
    {
        var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds));
        wait.Until(d => d.FindElementByJs(jsCommand));
    }
    return driver.FindElementByJs(jsCommand);
}

public static IWebElement FindElementByJsWithWait(this IWebDriver driver, string jsCommand)
{
    return FindElementByJsWithWait(driver, jsCommand, s_PageWaitSeconds);
}

2
अछा सुझाव। इसे पढ़ने वाले अन्य लोगों के लिए, आपके जावास्क्रिप्ट कोड को एक DOM तत्व वापस करना चाहिए।
जॉलेसैंड

मैंने भी इस पर विचार नहीं किया। यह बहुत बड़ा है क्योंकि अब मैं अगली स्क्रिप्ट को वापस करने के लिए जावास्क्रिप्ट का उपयोग करके एक विधि बना सकता हूं।
जिबस

1
public void javascriptclick(String element)
    { 
        WebElement webElement=driver.findElement(By.xpath(element));
        JavascriptExecutor js = (JavascriptExecutor) driver;

        js.executeScript("arguments[0].click();",webElement);   
        System.out.println("javascriptclick"+" "+ element);

    }

0
public static class Webdriver
{        
    public static void ExecuteJavaScript(string scripts)
    {
        IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
        js.ExecuteScript(scripts);
    }

    public static T ExecuteJavaScript<T>(string scripts)
    {
        IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
        return (T)js.ExecuteScript(scripts);
    }
}

अपने कोड में फिर आप कर सकते हैं

string test = Webdriver.ExecuteJavaScript<string>(" return 'hello World'; ");
int test = Webdriver.ExecuteJavaScript<int>(" return 3; ");

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