在 C# 中使用 Selenium WebDriver 执行 JavaScript

IT技术 javascript c# selenium selenium-webdriver webdriver
2021-02-09 03:31:27

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

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

但是我找不到执行此操作的 C# 代码。

6个回答

.NET 语言绑定中的对象、方法和属性名称与 Java 绑定中的不完全对应。该项目的原则之一是,对于那些使用该语言进行编码的人来说,每种语言绑定都应该“感觉自然”。在 C# 中,执行 JavaScript 所需的代码如下

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

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

我觉得我必须投射驱动程序很尴尬。为什么ExecuteJavascript不只是一个方法就可以了driver
2021-03-16 03:31:27
这是从不是每个驱动程序实现都支持执行任意 JavaScript 的时代遗留下来的。.NET 绑定,就像 Java 绑定一样,使用基于角色的接口来建模可能由一个驱动程序支持的功能,但不是全部。在支持程序集(WebDriver.Support.dll,可通过Selenium.Support包中的NuGet 获得)中,有一个扩展方法可以为您处理转换并使驱动程序看起来像有一个ExecuteJavaScript方法。
2021-03-22 03:31:27
吉姆的回答是您所能得到的最权威的答案。查看每个 Selenium .NET 文件的提交历史记录:-)
2021-03-31 03:31:27
你能告诉我如何在 C# 中单击按钮吗?像这样的答案arguments[0].click();对我不起作用?我执行代码时也不例外,但它没有单击按钮。
2021-04-09 03:31:27
注意 Java S脚本中的大写。这让我措手不及。
2021-04-11 03:31:27

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

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

用作此:

driver.Scripts().ExecuteScript("some script");
Selenium 默认应该有这个
2021-03-21 03:31:27

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

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

或者

  string result = Driver.ExecuteJavaScript<string>("console.clear()");
是什么DriverVS无法识别
2021-03-19 03:31:27
这是一个不错的现代解决方案。扩展方法添加了驱动程序实现的验证,IJavaScriptExecutor并在返回类型为 null 而不应或无法转换为所需的返回类型时提供更好的异常消息。
2021-04-03 03:31:27

@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");
这也可以用于获取 WebElement 和 bool 吗?
2021-03-25 03:31:27

你也可以这样做:

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);
}
好主意。对于阅读本文的其他人,您的 javascript 代码应该返回一个 DOM 元素。
2021-03-12 03:31:27
我什至不认为这是可能的。这是巨大的,因为我现在可以使用 javascript 创建一个方法来返回 nextSibling。
2021-03-21 03:31:27