121 votes

Exécuter JavaScript à l'aide de Selenium WebDriver en C#

Comment y parvenir ? Ici il est dit que la version de java est :

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

Mais je ne trouve pas le code C# pour faire cela.

246voto

JimEvans Points 9709

Les noms d'objets, de méthodes et de propriétés 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 langage doit être "naturelle" pour ceux qui sont à l'aise pour coder dans ce langage. 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 à l'adresse suivante ce lien .

13 votes

Notez les majuscules dans le mot Java S cript. Cela m'a surpris.

3 votes

La réponse de Jim est à peu près aussi autorisée qu'on puisse l'être. Consultez l'historique des livraisons de chaque fichier Selenium .NET :-)

0 votes

Pourriez-vous me dire comment cliquer sur un bouton en C# ? Réponses comme arguments[0].click(); ne fonctionne pas pour moi ? Je n'ai pas d'exception lorsque j'exécute mon code, mais il ne clique pas le bouton.

56voto

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

1 votes

Selenium devrait avoir ceci par défaut

24voto

harishr Points 13482

Le paquet nuget Selenium.Support contient déjà une méthode d'extension pour y remédier. Une fois qu'elle est incluse, une doublure à l'exécuteur script

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

o

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

0 votes

C'est une solution agréable et moderne. La méthode d'extension ajoute la validation que le pilote implémente IJavaScriptExecutor et donne un meilleur message d'exception si le type de retour est nul alors qu'il ne devrait pas l'être ou ne peut pas être converti en le type de retour souhaité.

0 votes

Qu'est-ce que le Driver ? VS ne peut pas reconnaître que

14voto

agentnega Points 1195

Que diriez-vous d'une version légèrement simplifiée de l'idée de la 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");

1 votes

Peut-on l'utiliser pour obtenir WebElement et bool également ?

8voto

perryzheng Points 54

Vous pouvez aussi le 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);
}

2 votes

Bonne idée. Pour les autres qui lisent ceci, votre code javascript devrait retourner un élément DOM.

0 votes

Je n'avais même pas envisagé cette possibilité. C'est énorme car je peux maintenant créer une méthode en utilisant javascript pour renvoyer nextSibling.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X