在C#中使用Selenium WebDriver执行JavaScript

Jon*_*yMC 96 javascript c# webdriver selenium-webdriver

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

WebDriver driver; // Assigned elsewhere
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("return document.title");
Run Code Online (Sandbox Code Playgroud)

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

Jim*_*ans 206

.NET语言绑定中的对象,方法和属性名称与Java绑定中的对象,方法和属性名称不完全对应.该项目的原则之一是每种语言绑定应该对那些语言中的舒适编码"感觉自然".在C#中,您要执行JavaScript的代码如下所示

IWebDriver driver; // assume assigned elsewhere
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
string title = (string)js.ExecuteScript("return document.title");
Run Code Online (Sandbox Code Playgroud)

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

  • 注意Java***S***这个词中的大写字母.这引起了我的注意. (8认同)
  • 吉姆的回答是您所能得到的最权威的答案。查看每个 Selenium .NET 文件的提交历史记录:-) (2认同)

Mor*_*sen 50

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

public static IJavaScriptExecutor Scripts(this IWebDriver driver)
{
    return (IJavaScriptExecutor)driver;
}
Run Code Online (Sandbox Code Playgroud)

用作:

driver.Scripts().ExecuteScript("some script");
Run Code Online (Sandbox Code Playgroud)


age*_*ega 12

如何略微简化版本的@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");
Run Code Online (Sandbox Code Playgroud)

或者通用版本:

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");
Run Code Online (Sandbox Code Playgroud)


har*_*shr 12

nuget包Selenium.Support已经包含一个扩展方法来帮助解决这个问题.一旦它被包含,一个衬垫到执行者脚本

  Driver.ExecuteJavaScript("console.clear()");
Run Code Online (Sandbox Code Playgroud)

要么

  string result = Driver.ExecuteJavaScript<string>("console.clear()");
Run Code Online (Sandbox Code Playgroud)


per*_*eng 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);
}
Run Code Online (Sandbox Code Playgroud)

  • 好主意.对于阅读此内容的其他人,您的javascript代码应返回DOM元素. (2认同)