2011-06-03 96 views

回答

170

.NET語言綁定中的對象,方法和屬性名稱並不完全對應於Java綁定中的對象,方法和屬性名稱。該項目的原則之一是每種語言的綁定應該對那些舒適的語言編碼「感到自然」。在C#中,你會想要執行JavaScript代碼如下

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

注意,webdriver的API用於.NET的完整的文檔可以在this link找到。

+5

注意在Java中***秒*** CRIPT單詞的大小寫。這讓我失望了。 – WheretheresaWill 2015-11-12 06:45:22

+1

吉姆的回答就像你可以得到的權威一樣。查看提交歷史記錄,以及每個Selenium .NET文件:-) – 2016-05-18 13:24:54

+0

請告訴我如何單擊C#中的按鈕?像'arguments [0] .click();'這樣的答案不適合我?當我執行我的代碼時,我沒有任何異常,但它不會單擊按鈕。 – 2016-06-23 04:42:19

41

我更喜歡使用的擴展方法來獲取腳本對象:

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

用作這樣的:

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

很乾淨。我喜歡這個! – 2015-11-11 22:06:55

+1

同意,超級清潔 – 2016-05-20 16:59:37

11

如何@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和布爾呢? – rahoolm 2015-03-27 09:34:44

6

你也可以這樣做:

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

好主意。對於讀這個的人來說,你的javascript代碼應該返回一個DOM元素。 – joelsand 2013-04-12 20:50:47

+0

我甚至沒有考慮過這種可能。這是巨大的,因爲我現在可以創建一個使用JavaScript返回nextSibling的方法。 – jibbs 2017-01-18 18:25:37

0
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); 

    } 
4

的NuGet包Selenium.Support已經包含了一個擴展方法,以幫助這一點。一旦它被包括在內,一個班輪執行器腳本

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

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

這是一個不錯的現代化解決方案。 擴展方法增加了驗證,即驅動程序實現'IJavaScriptExecutor'並在返回類型爲空時提供更好的異常消息,當它不應該或不能轉換爲所需的返回類型時。 – 2017-10-20 15:41:21

相關問題