Виконати JavaScript за допомогою Selenium WebDriver в C #


103

Як це досягається? Тут написано, що версія java:

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

Але я не можу знайти код C # для цього.

Відповіді:


216

Назви об'єктів, методів та властивостей у прив'язках до мови .NET точно не відповідають тим, що у прив'язках Java. Один із принципів проекту полягає в тому, що кожен мовний прив'язок повинен "відчувати себе природним" для тих, що зручно кодують цією мовою. У C # код, який ви хочете виконати для JavaScript, є наступним

IWebDriver driver; // assume assigned elsewhere
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
string title = (string)js.ExecuteScript("return document.title");

Зауважте, що повну документацію API WebDriver для .NET можна знайти за цим посиланням .


10
Зверніть увагу на написання великої літери у криптованому слові Java S. Це мене вигнало.
WheretheresaЗаповниться

1
Відповідь Джима настільки ж авторитетна, наскільки ви можете отримати. Ознайомтеся з історією фіксацій на, будь-якому, файлі Selenium .NET :-)
Росс Паттерсон

Скажіть, будь ласка, як натиснути кнопку в C #? Відповіді на кшталт arguments[0].click();не працює для мене? Я не виняток, коли виконую свій код, але він не натискає кнопку.
Алметт

Я вважаю незручним, що мені доводиться кидати водія. Чому це ExecuteJavascriptне просто метод на driver?
Калонь Колоб

Це решта часу, коли не кожна реалізація драйверів підтримувала виконання довільного JavaScript. Прив'язки .NET, як і Java, використовують рольові інтерфейси для моделювання функціональності, який може підтримувати один драйвер, але не всі. У зборі підтримки ( WebDriver.Support.dllдоступний через NuGet в Selenium.Supportкомплекті) є метод розширення, який обробляє кастинг для вас і робить його схожим на те, що у драйвера є ExecuteJavaScriptметод.
JimEvans

51

Я вважаю за краще використовувати метод розширення для отримання об'єкта скриптів:

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

Використовується так:

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

Селен повинен мати це за замовчуванням
Колоб Каньйон

13

Як щодо трохи спрощеної версії приємної ідеї методу розширення @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");

або, можливо, загальна версія:

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
Чи можна це використовувати і для отримання WebElement та bool?
rahoolm

12

пакунок nuget Selenium.Supportвже містить метод розширення, щоб допомогти у цьому. Після його включення один вкладиш для сценарію виконавця

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

або

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

Це приємне, сучасне рішення. Метод розширення додає перевірку, яку реалізує драйвер, IJavaScriptExecutorі дає краще повідомлення про виключення, якщо тип повернення є нульовим, коли він не повинен бути або не може бути переданий до потрібного типу повернення.
Джеффрі Лекур

що таке Driver? VS не може цього визнати
анатоль,

Ви встановили нукет ??
harishr

8

Ви також можете зробити:

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
Хороша ідея. Для інших, хто читає це, ваш код JavaScript повинен повертати елемент DOM.
joelsand

Я навіть не вважав це можливим. Це величезна кількість, оскільки я зараз можу створити метод за допомогою javascript для повернення nextSibling.
джебс

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

    }

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

У цьому коді ви можете це зробити

string test = Webdriver.ExecuteJavaScript<string>(" return 'hello World'; ");
int test = Webdriver.ExecuteJavaScript<int>(" return 3; ");

0

Найкоротший код

ChromeDriver drv = new ChromeDriver();

drv.Navigate().GoToUrl("/programming/6229769/execute-javascript-using-selenium-webdriver-in-c-sharp");

drv.ExecuteScript("return alert(document.title);");

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.