Виконати 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.