javascriptexecutor executescript javascript c# selenium-webdriver webdriver

executescript - Ejecute JavaScript usando Selenium WebDriver en C#



selenium-webdriver (6)

¿Qué tal una versión ligeramente simplificada de la buena 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");

¿Cómo se logra esto? Here dice que la versión de Java es:

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

Pero no puedo encontrar el código C # para hacer esto.


Los nombres de objeto, método y propiedad en los enlaces de lenguaje .NET no se corresponden exactamente con los de los enlaces de Java. Uno de los principios del proyecto es que cada enlace de idioma debe "sentirse natural" a la codificación cómoda en ese idioma. En C #, el código que desearía 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 .


Prefiero usar un método de extensión para obtener el objeto de scripts:

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

Usado como esto:

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


También podrías 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); }


el paquete nuget Selenium.Support ya contiene un método de extensión para ayudar con esto. Una vez que está incluido, un trazador de líneas para ejecutar script

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

o

string result = Driver.ExecuteJavaScript<string>("console.clear()");


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