Выполните JavaScript с помощью Selenium WebDriver в C # - PullRequest
96 голосов
/ 03 июня 2011

Как это достигается? Здесь здесь написано, что версия java:

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

Но я не могу найти код C # для этого.

Ответы [ 7 ]

202 голосов
/ 09 июня 2011

Имена объектов, методов и свойств в привязках языка .NET не совсем совпадают с именами в привязках Java.Один из принципов проекта заключается в том, что каждая языковая привязка должна «чувствовать себя естественно» для тех, кто комфортно кодирует на этом языке.В C # код, который вам нужен для выполнения JavaScript, выглядит следующим образом:

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

Обратите внимание, что полную документацию по API WebDriver для .NET можно найти по адресу по этой ссылке .

50 голосов
/ 26 августа 2011

Я предпочитаю использовать метод расширения для получения объекта сценариев:

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

Используется так:

driver.Scripts().ExecuteScript("some script");
12 голосов
/ 15 июня 2012

Как насчет слегка упрощенной версии идеи метода расширения @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");
10 голосов
/ 14 апреля 2017

пакет nuget Selenium.Support уже содержит метод расширения, чтобы помочь с этим.Как только он включен, один вкладыш для выполнения сценария

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

или

  string result = Driver.ExecuteJavaScript<string>("console.clear()");
7 голосов
/ 04 июля 2012

Вы также можете сделать:

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);
}
1 голос
/ 14 февраля 2017
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 голосов
/ 05 февраля 2019
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; ");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...