วิธีนี้ประสบความสำเร็จ? ที่นี่บอกว่าเวอร์ชัน java คือ:
WebDriver driver; // Assigned elsewhere
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("return document.title");
แต่ฉันหารหัส C # ไม่เจอ
วิธีนี้ประสบความสำเร็จ? ที่นี่บอกว่าเวอร์ชัน java คือ:
WebDriver driver; // Assigned elsewhere
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("return document.title");
แต่ฉันหารหัส C # ไม่เจอ
คำตอบ:
ชื่ออ็อบเจ็กต์เมธอดและคุณสมบัติในการโยงภาษา. NET ไม่ตรงกับชื่อในการโยง Java ทุกประการ หลักการอย่างหนึ่งของโครงการนี้คือการผูกภาษาแต่ละภาษาควร "ให้ความรู้สึกเป็นธรรมชาติ" กับการเขียนโค้ดที่สะดวกสบายในภาษานั้น ๆ ใน C # รหัสที่คุณต้องการสำหรับเรียกใช้งาน JavaScript มีดังนี้
IWebDriver driver; // assume assigned elsewhere
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
string title = (string)js.ExecuteScript("return document.title");
โปรดทราบว่าเอกสารทั้งหมดของ WebDriver API สำหรับ. NET สามารถพบได้ที่ลิงค์นี้
arguments[0].click();
ไม่ได้ผลสำหรับฉัน? ฉันไม่มีข้อยกเว้นเมื่อฉันรันโค้ดของฉัน แต่มันไม่คลิกปุ่ม
ExecuteJavascript
ไม่เป็นเพียงวิธีการในdriver
?
WebDriver.Support.dll
พร้อมใช้งานผ่าน NuGet ในSelenium.Support
แพ็คเกจ) มีวิธีการขยายที่จัดการการหล่อให้คุณและทำให้ดูเหมือนว่าไดรเวอร์มีExecuteJavaScript
วิธีการ
ฉันชอบใช้วิธีการขยายเพื่อรับวัตถุสคริปต์:
public static IJavaScriptExecutor Scripts(this IWebDriver driver)
{
return (IJavaScriptExecutor)driver;
}
ใช้เป็นสิ่งนี้:
driver.Scripts().ExecuteScript("some script");
วิธีการเกี่ยวกับแนวคิดวิธีการขยายที่ดีของ @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");
แพ็คเกจนักเก็ตSelenium.Support
มีวิธีการขยายเพื่อช่วยในเรื่องนี้อยู่แล้ว เมื่อรวมแล้วซับหนึ่งบรรทัดสำหรับผู้บริหารสคริปต์
Driver.ExecuteJavaScript("console.clear()");
หรือ
string result = Driver.ExecuteJavaScript<string>("console.clear()");
IJavaScriptExecutor
และให้ข้อความแสดงข้อยกเว้นที่ดีขึ้นหากประเภทการส่งคืนเป็นค่าว่างเมื่อไม่ควรเป็นหรือไม่สามารถส่งไปยังประเภทการส่งคืนที่ต้องการได้
Driver
อะไร? VS จำไม่ได้
คุณยังสามารถทำได้:
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);
}
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);
}
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; ");
รหัสที่สั้นที่สุด
ChromeDriver drv = new ChromeDriver();
drv.Navigate().GoToUrl("/programming/6229769/execute-javascript-using-selenium-webdriver-in-c-sharp");
drv.ExecuteScript("return alert(document.title);");