Respuestas:
Los nombres de objeto, método y propiedad en los enlaces del lenguaje .NET no se corresponden exactamente con los de los enlaces Java. Uno de los principios del proyecto es que cada enlace de idioma debe "sentirse natural" para quienes se sientan cómodos codificando en ese idioma. En C #, el código que desea para ejecutar JavaScript es el siguiente
IWebDriver driver; // assume assigned elsewhere
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
string title = (string)js.ExecuteScript("return document.title");
Tenga en cuenta que la documentación completa de la API de WebDriver para .NET se puede encontrar en este enlace .
arguments[0].click();
no me funciona? No tengo ninguna excepción cuando ejecuto mi código, pero no hace clic en el botón.
ExecuteJavascript
no es solo un método en el driver
?
WebDriver.Support.dll
disponible a través de NuGet en el Selenium.Support
paquete), hay un método de extensión que maneja la conversión por usted y hace que parezca que el controlador tiene un ExecuteJavaScript
método.
Prefiero usar un método de extensión para obtener el objeto scripts:
public static IJavaScriptExecutor Scripts(this IWebDriver driver)
{
return (IJavaScriptExecutor)driver;
}
Usado como este:
driver.Scripts().ExecuteScript("some script");
¿Qué tal una versión ligeramente simplificada de la bonita idea del método de extensión 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");
o tal vez la versión genérica:
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");
el paquete nuget Selenium.Support
ya contiene un método de extensión para ayudar con esto. Una vez que se incluye, una línea para ejecutar el script
Driver.ExecuteJavaScript("console.clear()");
o
string result = Driver.ExecuteJavaScript<string>("console.clear()");
IJavaScriptExecutor
y proporciona un mejor mensaje de excepción si el tipo de retorno es nulo cuando no debería ser o no se puede convertir al tipo de retorno deseado.
Driver
? VS no puede reconocer eso
También puedes hacer:
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);
}
}
En su código puede hacer
string test = Webdriver.ExecuteJavaScript<string>(" return 'hello World'; ");
int test = Webdriver.ExecuteJavaScript<int>(" return 3; ");
El código más corto
ChromeDriver drv = new ChromeDriver();
drv.Navigate().GoToUrl("/programming/6229769/execute-javascript-using-selenium-webdriver-in-c-sharp");
drv.ExecuteScript("return alert(document.title);");