Jalankan JavaScript menggunakan Selenium WebDriver di C #


103

Bagaimana ini tercapai? Di sini dikatakan versi java adalah:

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

Tetapi saya tidak dapat menemukan kode C # untuk melakukan ini.

Jawaban:


216

Nama objek, metode, dan properti di binding bahasa .NET tidak sama persis dengan yang ada di binding Java. Salah satu prinsip dari proyek ini adalah bahwa setiap pengikatan bahasa harus "terasa alami" bagi mereka yang nyaman membuat kode dalam bahasa tersebut. Di C #, kode yang Anda inginkan untuk menjalankan JavaScript adalah sebagai berikut

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

Perhatikan bahwa dokumentasi lengkap API WebDriver untuk .NET dapat ditemukan di tautan ini .


10
Perhatikan kapitalisasi pada kata Java S cript. Ini membuat saya keluar.
WheretheresaAkan

1
Jawaban Jim sama otoritatifnya dengan yang bisa Anda dapatkan. Lihat riwayat komit pada, nah, setiap file Selenium .NET :-)
Ross Patterson

Bisakah Anda memberi tahu saya cara mengklik tombol di C #? Jawaban seperti arguments[0].click();tidak berhasil untuk saya? Saya tidak memiliki pengecualian ketika saya menjalankan kode saya, tetapi tidak mengklik tombol.
Almett

Saya merasa canggung karena saya harus memilih pengemudi. Mengapa ExecuteJavascripttidak hanya metode di driver?
Kolob Canyon

Itu adalah sisa dari saat tidak semua implementasi driver mendukung eksekusi JavaScript yang sewenang-wenang. Binding .NET, seperti Java yang menggunakan antarmuka berbasis peran untuk memodelkan fungsionalitas yang mungkin didukung oleh satu driver, tetapi tidak semua. Dalam rakitan Dukungan ( WebDriver.Support.dll, tersedia melalui NuGet dalam Selenium.Supportpaket), ada metode ekstensi yang menangani casting untuk Anda dan membuatnya tampak seperti pengemudi memiliki ExecuteJavaScriptmetode.
JimEvans

51

Saya lebih suka menggunakan metode ekstensi untuk mendapatkan objek skrip:

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

Digunakan sebagai ini:

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

Selenium harus memiliki ini secara default
Kolob Canyon

13

Bagaimana dengan versi sederhana dari ide metode ekstensi @Morten Christiansen yang bagus:

public static object Execute(this IWebDriver driver, string script)
{
    return ((IJavaScriptExecutor)driver).ExecuteScript(script);
}

// usage
var title = (string)driver.Execute("return document.title");

atau mungkin versi generik:

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
Bisakah ini digunakan untuk mendapatkan WebElement dan bool juga?
rahoolm

12

paket nuget Selenium.Supportsudah berisi metode ekstensi untuk membantu hal ini. Setelah itu disertakan, satu liner untuk menjalankan skrip

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

atau

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

Ini adalah solusi modern yang bagus. Metode ekstensi menambahkan validasi yang diimplementasikan oleh driver IJavaScriptExecutordan memberikan pesan pengecualian yang lebih baik jika jenis kembalian adalah null ketika seharusnya tidak atau tidak dapat ditransmisikan ke jenis kembalian yang diinginkan.
Jeffrey LeCours

apa Driver? VS tidak bisa mengenali itu
anatol

Sudahkah anda memasang nuget ??
harishr

8

Anda juga bisa melakukan:

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
Ide bagus. Untuk orang lain yang membaca ini, kode javascript Anda harus mengembalikan elemen DOM.
joelsand

Saya bahkan tidak menganggap ini mungkin. Ini sangat besar karena saya sekarang dapat membuat metode menggunakan javascript untuk mengembalikan nextSibling.
jibbs

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

Dalam kode Anda, Anda kemudian dapat melakukannya

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

0

Kode terpendek

ChromeDriver drv = new ChromeDriver();

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

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.