2011-06-03 259 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

相关问题