Câu trả lời:
Tên đối tượng, phương thức và thuộc tính trong liên kết ngôn ngữ .NET không hoàn toàn tương ứng với những tên trong liên kết Java. Một trong những nguyên tắc của dự án là mỗi ràng buộc ngôn ngữ phải "cảm thấy tự nhiên" với những người viết mã thoải mái bằng ngôn ngữ đó. Trong C #, mã bạn muốn thực thi JavaScript như sau
IWebDriver driver; // assume assigned elsewhere
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
string title = (string)js.ExecuteScript("return document.title");
Lưu ý rằng bạn có thể tìm thấy tài liệu đầy đủ về API WebDriver cho .NET tại liên kết này .
arguments[0].click();
không phù hợp với tôi? Tôi không có ngoại lệ khi tôi thực thi mã của mình, nhưng nó không nhấp vào nút.
ExecuteJavascript
không chỉ là một phương pháp trên driver
?
WebDriver.Support.dll
, có sẵn qua NuGet trong Selenium.Support
gói), có một phương thức mở rộng xử lý quá trình truyền cho bạn và làm cho nó trông giống như trình điều khiển có một ExecuteJavaScript
phương thức.
Tôi thích sử dụng một phương thức mở rộng để lấy đối tượng script:
public static IJavaScriptExecutor Scripts(this IWebDriver driver)
{
return (IJavaScriptExecutor)driver;
}
Được sử dụng như sau:
driver.Scripts().ExecuteScript("some script");
Còn về một phiên bản đơn giản hơn một chút của ý tưởng về phương pháp mở rộng hay ho của @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");
hoặc có thể là phiên bản chung:
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");
gói nuget Selenium.Support
đã chứa một phương thức mở rộng để trợ giúp việc này. Khi nó được bao gồm, một lớp lót cho tập lệnh thực thi
Driver.ExecuteJavaScript("console.clear()");
hoặc là
string result = Driver.ExecuteJavaScript<string>("console.clear()");
IJavaScriptExecutor
và đưa ra một thông báo ngoại lệ tốt hơn nếu kiểu trả về là null khi nó không nên hoặc không thể được chuyển thành kiểu trả về mong muốn.
Driver
? VS không thể nhận ra điều đó
Bạn cũng có thể làm:
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);
}
}
Trong mã của bạn, sau đó bạn có thể làm
string test = Webdriver.ExecuteJavaScript<string>(" return 'hello World'; ");
int test = Webdriver.ExecuteJavaScript<int>(" return 3; ");
Mã ngắn nhất
ChromeDriver drv = new ChromeDriver();
drv.Navigate().GoToUrl("/programming/6229769/execute-javascript-using-selenium-webdriver-in-c-sharp");
drv.ExecuteScript("return alert(document.title);");