Réponses:
Les noms d'objet, de méthode et de propriété dans les liaisons de langage .NET ne correspondent pas exactement à ceux des liaisons Java. L'un des principes du projet est que chaque liaison de langue doit «se sentir naturelle» pour ceux qui sont à l'aise avec le codage 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 se trouve sur ce lien .
arguments[0].click();
ne marche pas pour moi? Je n'ai aucune exception lorsque j'exécute mon code, mais il ne clique pas sur le bouton.
ExecuteJavascript
pas juste une méthode sur le driver
?
WebDriver.Support.dll
, disponible via NuGet dans le Selenium.Support
package), il existe une méthode d'extension qui gère le cast pour vous et donne l'impression que le pilote a une ExecuteJavaScript
méthode.
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 la belle idée de méthode d'extension 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 paquet nuget Selenium.Support
contient déjà une méthode d'extension pour vous aider. Une fois qu'il est inclus, une doublure pour exécuter le script
Driver.ExecuteJavaScript("console.clear()");
ou
string result = Driver.ExecuteJavaScript<string>("console.clear()");
IJavaScriptExecutor
et donne un meilleur message d'exception si le type de retour est nul alors qu'il ne devrait pas ou ne peut pas être converti en type de retour souhaité.
Driver
? VS ne peut pas reconnaître cela
Vous pouvez également 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 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);
}
}
Dans votre code, vous pouvez alors faire
string test = Webdriver.ExecuteJavaScript<string>(" return 'hello World'; ");
int test = Webdriver.ExecuteJavaScript<int>(" return 3; ");
Le code le plus court
ChromeDriver drv = new ChromeDriver();
drv.Navigate().GoToUrl("/programming/6229769/execute-javascript-using-selenium-webdriver-in-c-sharp");
drv.ExecuteScript("return alert(document.title);");