使用 C # 中的 Selenium WebDriver 执行 JavaScript

这是如何实现的? 给你表示 Java 版本是:

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

但我找不到这样做的 C # 代码。

196205 次浏览

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

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

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

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

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

用作:

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

稍微简化一下@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");

你也可以这样做:

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


}

Nuget 包 Selenium.Support已经包含了一个扩展方法来帮助解决这个问题。一旦它被包含,执行器脚本的一行

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

或者

  string result = Driver.ExecuteJavaScript<string>("console.clear()");
public static class Webdriver
{
public static void ExecuteJavaScript(this IWebDriver driver, string scripts)
{
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
js.ExecuteScript(scripts);
}


public static T ExecuteJavaScript<T>(this IWebDriver driver, string scripts)
{
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
return (T)js.ExecuteScript(scripts);
}
}

在你的代码中,你可以这样做:

IWebDriver driver = new WhateverDriver();
string test = driver.ExecuteJavaScript<string>(" return 'hello World'; ");
int test = driver.ExecuteJavaScript<int>(" return 3; ");

最短的密码

ChromeDriver drv = new ChromeDriver();


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


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




请使用下面添加的扩展方法来执行 javascript 并在 Selenium 中截屏。支援(。硒 C # 的 dll)

Https://www.nuget.org/packages/selenium

IWebDriver driver = new ChromeDriver();
driver.Manage().Window.Maximize();
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(20);
driver.Url = "https://phptravels.net/";


driver.ExecuteJavaScript("document.querySelector('#checkin').value='07-12-2022'");


driver.ExecuteJavaScript("document.querySelector('#checkout').value='17-12-2022'");


IWebElement ele1 = driver.FindElement(By.Id("checkin"));
driver.ExecuteJavaScript("arguments[0].value='07-12-2022'",ele1);


string output=driver.ExecuteJavaScript<string>("return
document.querySelector('#checkin').value");
Console.WriteLine(output);


Screenshot sc= driver.TakeScreenshot();
sc.SaveAsFile("C:\\error.png");