Antworten:
Die Objekt-, Methoden- und Eigenschaftsnamen in den .NET-Sprachbindungen entsprechen nicht genau denen in den Java-Bindungen. Eines der Prinzipien des Projekts ist, dass sich jede Sprachbindung für diejenigen, die sich in dieser Sprache wohlfühlen, "natürlich" anfühlt. In C # lautet der Code, den Sie zum Ausführen von JavaScript benötigen, wie folgt
IWebDriver driver; // assume assigned elsewhere
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
string title = (string)js.ExecuteScript("return document.title");
Beachten Sie, dass die vollständige Dokumentation der WebDriver-API für .NET unter diesem Link zu finden ist .
arguments[0].click();
funktioniert bei mir nicht? Ich habe keine Ausnahme, wenn ich meinen Code ausführe, aber er klickt nicht auf die Schaltfläche.
ExecuteJavascript
nicht nur eine Methode auf dem driver
?
WebDriver.Support.dll
verfügbar über NuGet im Selenium.Support
Paket) gibt es eine Erweiterungsmethode, die das Casting für Sie verwaltet und den Eindruck erweckt, dass der Treiber über eine ExecuteJavaScript
Methode verfügt.
Ich bevorzuge eine Erweiterungsmethode, um das Skriptobjekt abzurufen:
public static IJavaScriptExecutor Scripts(this IWebDriver driver)
{
return (IJavaScriptExecutor)driver;
}
Verwendet wie folgt:
driver.Scripts().ExecuteScript("some script");
Wie wäre es mit einer leicht vereinfachten Version von @Morten Christiansens netter Idee für eine Erweiterungsmethode:
public static object Execute(this IWebDriver driver, string script)
{
return ((IJavaScriptExecutor)driver).ExecuteScript(script);
}
// usage
var title = (string)driver.Execute("return document.title");
oder vielleicht die generische Version:
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");
Das Nuget-Paket Selenium.Support
enthält bereits eine Erweiterungsmethode, um dies zu unterstützen. Sobald es enthalten ist, ein Liner zum Executer-Skript
Driver.ExecuteJavaScript("console.clear()");
oder
string result = Driver.ExecuteJavaScript<string>("console.clear()");
IJavaScriptExecutor
und gibt eine bessere Ausnahmemeldung aus, wenn der Rückgabetyp null ist, wenn er nicht in den gewünschten Rückgabetyp umgewandelt werden soll oder kann.
Driver
? VS kann das nicht erkennen
Sie könnten auch tun:
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);
}
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);
}
}
In Ihrem Code können Sie dann tun
string test = Webdriver.ExecuteJavaScript<string>(" return 'hello World'; ");
int test = Webdriver.ExecuteJavaScript<int>(" return 3; ");
Der kürzeste Code
ChromeDriver drv = new ChromeDriver();
drv.Navigate().GoToUrl("/programming/6229769/execute-javascript-using-selenium-webdriver-in-c-sharp");
drv.ExecuteScript("return alert(document.title);");