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.

JontyMC
sumber

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 .

JimEvans
sumber
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");
Morten Christiansen
sumber
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");
agentnega
sumber
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()");
harishr
sumber
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);
}
perryzheng
sumber
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);

    }
akhilesh gulati
sumber
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; ");
Mo D Genesis
sumber
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);");

Ebubekir Bastama
sumber