web-dev-qa-db-ja.com

C#でSelenium WebDriverを使用してJavaScriptを実行する

これはどのように達成されますか? ここ Javaバージョンは次のとおりです:

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

しかし、これを行うためのC#コードが見つかりません。

96
JontyMC

.NET言語バインディングのオブジェクト、メソッド、およびプロパティ名は、Javaバインディングのオブジェクト名、メソッド名、およびプロパティ名と正確に対応していません。プロジェクトの原則の1つは、各言語バインディングがその言語での快適なコーディングに「自然に感じる」ことです。 C#では、JavaScriptの実行に必要なコードは次のとおりです。

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

.NET用のWebDriver APIの完全なドキュメントは、 このリンク にあります。

203
JimEvans

スクリプトオブジェクトを取得するには、拡張メソッドを使用することを好みます。

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

これとして使用:

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

@Morten ChristiansenのNice拡張メソッドのアイデアを少し簡略化したバージョンはどうですか:

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

nugetパッケージSelenium.Supportには、これを支援する拡張メソッドが既に含まれています。含まれたら、実行者スクリプトへの1つのライナー

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

または

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

次のこともできます。

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

    }
1
akhilesh gulati
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
Mo D Genesis