在 C# 中使用 Selenium WebDriver 执行 JavaScript

Posted

技术标签:

【中文标题】在 C# 中使用 Selenium WebDriver 执行 JavaScript【英文标题】:Execute JavaScript using Selenium WebDriver in C# 【发布时间】:2011-09-07 22:57:10 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

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

请注意,用于 .NET 的 WebDriver API 的完整文档可以在 this link 找到。

【讨论】:

请注意单词 JavaScript 中的大写。这让我大吃一惊。 Jim 的回答几乎是权威的。查看每个 Selenium .NET 文件的提交历史:-) 您能告诉我如何在 C# 中单击按钮吗?像arguments[0].click(); 这样的答案对我不起作用?我执行代码时也不例外,但它没有单击按钮。 我觉得我不得不强制转换驱动程序很尴尬。为什么ExecuteJavascript 不只是driver 上的一个方法? 这是在不是每个驱动程序实现都支持执行任意 JavaScript 的时候遗留下来的。 .NET 绑定,与 Java 绑定一样,使用基于角色的接口来建模可能由一个驱动程序支持的功能,但不是全部。在 Support 程序集中(WebDriver.Support.dll,可通过 NuGet 在 Selenium.Support 包中获得),有一个扩展方法可以为您处理转换并使其看起来像驱动程序具有 ExecuteJavaScript 方法。【参考方案2】:

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

public static IJavaScriptExecutor Scripts(this IWebDriver driver)

    return (IJavaScriptExecutor)driver;

这样使用:

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

【讨论】:

Selenium 默认应该有这个【参考方案3】:

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

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

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

【讨论】:

这是一个不错的现代解决方案。扩展方法添加了驱动程序实现IJavaScriptExecutor 的验证,并在返回类型为 null 时给出更好的异常消息,而它不应该或不能转换为所需的返回类型。 Driver 是什么? VS 无法识别【参考方案4】:

@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 吗?【参考方案5】:

你也可以这样做:

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 元素。 我什至不认为这是可能的。这是巨大的,因为我现在可以使用 javascript 创建一个方法来返回 nextSibling。【参考方案6】:
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);

    

【讨论】:

【参考方案7】:
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; ");

【讨论】:

【参考方案8】:

最短的代码

ChromeDriver drv = new ChromeDriver();

drv.Navigate().GoToUrl("https://***.com/questions/6229769/execute-javascript-using-selenium-webdriver-in-c-sharp");

drv.ExecuteScript("return alert(document.title);");


【讨论】:

以上是关于在 C# 中使用 Selenium WebDriver 执行 JavaScript的主要内容,如果未能解决你的问题,请参考以下文章

一行js代码识别Selenium+Webdriver及其应对方案

Selenium WebDriver的使用

Selenium使用Chrome模拟手机浏览器方法解析

一日一技:如何正确移除Selenium中window.navigator.webdriver的值

Python - Selenium - 如何使用浏览器快捷方式

Python+selenium自动化测试之浏览器基础操作