Comment cela est-il réalisé? Ici il est indiqué que la version Java est:
WebDriver driver; // Assigned elsewhere
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("return document.title");
Mais je ne trouve pas le code C # pour le faire.
Les noms d'objet, de méthode et de propriété dans les liaisons du langage .NET ne correspondent pas exactement à ceux des liaisons Java. L'un des principes du projet est que chaque liaison de langue devrait "sembler naturelle" à ceux qui codent à l'aise dans cette langue. En C #, le code que vous souhaitez pour exécuter JavaScript est le suivant
IWebDriver driver; // assume assigned elsewhere
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
string title = (string)js.ExecuteScript("return document.title");
Notez que la documentation complète de l’API WebDriver pour .NET est disponible à l’adresse ce lien .
Je préfère utiliser une méthode d'extension pour obtenir l'objet scripts:
public static IJavaScriptExecutor Scripts(this IWebDriver driver)
{
return (IJavaScriptExecutor)driver;
}
Utilisé comme ceci:
driver.Scripts().ExecuteScript("some script");
Que diriez-vous d'une version légèrement simplifiée de l'idée de la méthode d'extension de Nice de @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");
ou peut-être la version générique:
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");
le package de nuget Selenium.Support
contient déjà une méthode d'extension pour vous aider. Une fois qu’il est inclus, un liner au script exécuteur
Driver.ExecuteJavaScript("console.clear()");
ou
string result = Driver.ExecuteJavaScript<string>("console.clear()");
Vous pouvez aussi faire:
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 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);
}
}
Dans votre code, vous pouvez alors faire
string test = Webdriver.ExecuteJavaScript<string>(" return 'hello World'; ");
int test = Webdriver.ExecuteJavaScript<int>(" return 3; ");
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);
}