在 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中window.navigator.webdriver的值