2011-06-03 49 views

Respuesta

170

El objeto, el método y los nombres de 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 te gustaría para la ejecución de 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 del API WebDriver para .NET se puede encontrar en this link.

+5

observe la mayúscula en la palabra de Java *** S *** cripta. Esto me sorprendió. – WheretheresaWill

+1

La respuesta de Jim es tan autoritativa como puedas. Mira el historial de commit en, bueno, cada archivo .NET de Selenium :-) –

+0

¿Podrías decirme cómo presionar un botón en C#? Las respuestas como 'argumentos [0] .click();' no funcionan para mí? No tengo excepciones cuando ejecuto mi código, pero no hace clic en el botón. –

41

Yo prefiero usar un método de extensión para obtener las secuencias de comandos objeto:

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

Utilizado como esto:

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

Muy limpio. ¡Me gusta esto! –

+1

aceptado, super clean –

11

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

¿Se puede utilizar esto para obtener WebElement y bool también? – rahoolm

6

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

Buena idea. Para otros que lean esto, su código javascript debería devolver un elemento DOM. – joelsand

+0

Ni siquiera lo consideré posible. Esto es enorme ya que ahora puedo crear un método usando javascript para devolver nextSibling. – jibbs

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

    } 
4

el paquete Nuget Selenium.Support ya contiene un método de extensión para ayudar con esto. Una vez que se incluye, un trazador de líneas de guión exécuter

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

o

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

Esta es una solución agradable y moderna. El método de extensión agrega la validación de que el controlador implementa 'IJavaScriptExecutor' y da un mejor mensaje de excepción si el tipo de devolución es nulo cuando no debe ser o no puede convertirse al tipo de devolución deseado. –

Cuestiones relacionadas