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


103

これはどのように達成されますか?ここでは、Javaのバージョンは次のようになっています。

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

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

回答:


216

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

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

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


10
大文字のJava S criptに注意してください。これは私を見つけました。
WheretheresaWill

1
ジムの答えは、あなたが得ることができるのと同じくらい権威があります。、上だけでなく、すべてのセレン.NETファイル:-)歴史をコミットチェックアウト
ロス・パターソン

C#でボタンをクリックする方法を教えてください。のような答えarguments[0].click();は私のために働いていませんか?コードを実行しても例外はありませんが、ボタンはクリックされません。
Almett 2016年

ドライバーをキャストしなければならないのは不便です。なぜExecuteJavascript単なるメソッドではないのdriverですか?
Kolobキャニオン

これは、すべてのドライバ実装が任意のJavaScriptの実行をサポートしているわけではない時代の残り物です。.NETバインディングは、Javaバインディングと同様に、役割ベースのインターフェースを使用して、すべてではなく1つのドライバーでサポートされる機能をモデル化します。サポートアセンブリ(パッケージWebDriver.Support.dll内のNuGetを介して利用可能Selenium.Support)には、キャストを処理し、ドライバーにExecuteJavaScriptメソッドがあるように見える拡張メソッドがあります。
JimEvans

51

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

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

これとして使用:

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

セレンにはデフォルトでこれが必要です
Kolob Canyon

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 2015年

12

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

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

または

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

これは、優れた最新のソリューションです。拡張メソッドは、ドライバーが実装する検証を追加しIJavaScriptExecutor、戻り値の型がnullである場合に、それを目的の戻り値の型にキャストできない、またはキャストできない場合に、より適切な例外メッセージを提供します。
Jeffrey LeCours 2017年

なにDriver?VSはそれを認識できません
アナトール2018

nugetをインストールしましたか?
harishr 2018

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 2013

私もこれを可能な限り考えていませんでした。JavaScriptを使用してnextSiblingを返すメソッドを作成できるようになったため、これは非常に大きなものです。
ジブス2017年

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.