ดำเนินการ JavaScript โดยใช้ Selenium WebDriver ใน C #


103

วิธีนี้ประสบความสำเร็จ? ที่นี่บอกว่าเวอร์ชัน java คือ:

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

แต่ฉันหารหัส C # ไม่เจอ

คำตอบ:


216

ชื่ออ็อบเจ็กต์เมธอดและคุณสมบัติในการโยงภาษา. NET ไม่ตรงกับชื่อในการโยง Java ทุกประการ หลักการอย่างหนึ่งของโครงการนี้คือการผูกภาษาแต่ละภาษาควร "ให้ความรู้สึกเป็นธรรมชาติ" กับการเขียนโค้ดที่สะดวกสบายในภาษานั้น ๆ ใน C # รหัสที่คุณต้องการสำหรับเรียกใช้งาน JavaScript มีดังนี้

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

โปรดทราบว่าเอกสารทั้งหมดของ WebDriver API สำหรับ. NET สามารถพบได้ที่ลิงค์นี้


10
หมายเหตุการใช้อักษรตัวพิมพ์ใหญ่ในคำ Java S cript สิ่งนี้ทำให้ฉันหลุดออกไป
Wheretheresa จะ

1
คำตอบของจิมนั้นเชื่อถือได้มากที่สุดเท่าที่จะทำได้ ตรวจสอบประวัติการกระทำในไฟล์ Selenium .NET ทุกไฟล์ :-)
Ross Patterson

คุณช่วยบอกวิธีคลิกปุ่มใน C # ได้ไหม คำตอบเช่นarguments[0].click();ไม่ได้ผลสำหรับฉัน? ฉันไม่มีข้อยกเว้นเมื่อฉันรันโค้ดของฉัน แต่มันไม่คลิกปุ่ม
Almett

ฉันรู้สึกอึดอัดที่ต้องแคสต์ไดรเวอร์ ทำไมExecuteJavascriptไม่เป็นเพียงวิธีการในdriver?
Kolob Canyon

นั่นเป็นสิ่งที่เหลืออยู่จากช่วงเวลาที่การใช้งานไดรเวอร์ทุกตัวไม่รองรับการใช้งาน JavaScript การเชื่อมโยง. NET เช่นเดียวกับ Java ใช้อินเทอร์เฟซตามบทบาทเพื่อจำลองฟังก์ชันการทำงานที่อาจได้รับการสนับสนุนโดยไดรเวอร์เดียว แต่ไม่ใช่ทั้งหมด ในชุดประกอบการสนับสนุน ( 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

12

แพ็คเกจนักเก็ตSelenium.Supportมีวิธีการขยายเพื่อช่วยในเรื่องนี้อยู่แล้ว เมื่อรวมแล้วซับหนึ่งบรรทัดสำหรับผู้บริหารสคริปต์

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

หรือ

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

นี่เป็นทางออกที่ดีและทันสมัย วิธีการขยายจะเพิ่มการตรวจสอบความถูกต้องที่โปรแกรมควบคุมดำเนินการIJavaScriptExecutorและให้ข้อความแสดงข้อยกเว้นที่ดีขึ้นหากประเภทการส่งคืนเป็นค่าว่างเมื่อไม่ควรเป็นหรือไม่สามารถส่งไปยังประเภทการส่งคืนที่ต้องการได้
Jeffrey LeCours

คือDriverอะไร? VS จำไม่ได้
anatol

คุณติดตั้ง nuget หรือยัง?
harishr

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
ความคิดดี. สำหรับผู้อื่นที่อ่านสิ่งนี้โค้ดจาวาสคริปต์ของคุณควรส่งคืนองค์ประกอบ DOM
joelsand

ฉันไม่ได้คิดว่านี่เป็นไปได้ มันใหญ่มากเพราะตอนนี้ฉันสามารถสร้าง method โดยใช้ javascript เพื่อกลับ 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);
    }
}

ในโค้ดของคุณคุณสามารถทำได้

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.