在C#中使用Selenium WebDriver执行JavaScript


103

如何实现的?在这里,它说的Java版本是:

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

但是我找不到C#代码来做到这一点。

Answers:


216

.NET语言绑定中的对象,方法和属性名称与Java绑定中的对象,方法和属性名称不完全对应。该项目的原则之一是,每种语言绑定都应该使那些习惯于该语言的人“感到自然”。在C#中,您想要执行JavaScript的代码如下

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

请注意,可以在此链接中找到WebDriver API .NET的完整文档。


10
注意单词Java S cript中的大写字母。这让我失望了。
WheretheresaWill 2015年

1
吉姆的答案是尽可能地权威。查阅每个Selenium .NET文件上的提交历史记录:-)
Ross Patterson

您能否告诉我如何单击C#中的按钮?像是arguments[0].click();对我不起作用的答案?当我执行代码时,我也不例外,但是它没有单击按钮。
阿尔梅特

我觉得不得不转换驱动程序很尴尬。为什么ExecuteJavascript不只是一种方法driver呢?
Kolob Canyon

这是不是每个驱动程序实现都支持执行任意JavaScript的时候的剩余时间。与Java绑定一样,.NET绑定使用基于角色的接口来对可能由一个驱动程序而非全部驱动程序支持的功能进行建模。在Support组件(WebDriver.Support.dll,可通过Selenium.Support包中的NuGet提供)中,有一个扩展方法可以为您处理转换,并使其看起来像驱动程序具有ExecuteJavaScript方法。
JimEvans

51

我更喜欢使用扩展方法来获取脚本对象:

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

用作:

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

硒应默认具有此功能
Kolob Canyon

13

@Morten Christiansen的不错的扩展方法思想的稍微简化的版本如何:

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和bool吗?
rahoolm

12

nuget包Selenium.Support已经包含扩展方法来帮助解决此问题。一旦包含,执行程序脚本的一个衬里

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

要么

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

这是一个不错的现代解决方案。扩展方法增加了驱动程序实现的验证,IJavaScriptExecutor并且如果返回类型为null,则不应将其强制转换为所需的返回类型,如果该返回类型为null,则会提供更好的异常消息。
Jeffrey LeCours

什么是Driver?VS无法识别
anatol

您安装了nuget吗?
harishr

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
好主意。对于其他人来说,您的JavaScript代码应返回DOM元素。
joelsand

我什至不认为这是可能的。这非常重要,因为我现在可以使用javascript创建一个方法来返回nextSibling。
jibbs

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.