Выполнение JavaScript с помощью Selenium WebDriver в C#
Как это достигается? здесь Он говорит, что версия java:
WebDriver driver; // Assigned elsewhere
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("return document.title");
но я не могу найти код C# для этого.
6 ответов:
имена объектов, методов и свойств в привязках языка .NET не совсем соответствуют тем, которые находятся в привязках Java. Один из принципов проекта заключается в том, что каждая языковая привязка должна "чувствовать себя естественно" для тех, кто комфортно кодирует на этом языке. В C# код, который вы хотите для выполнения JavaScript, выглядит следующим образом
IWebDriver driver; // assume assigned elsewhere IJavaScriptExecutor js = (IJavaScriptExecutor)driver; string title = (string)js.ExecuteScript("return document.title");
обратите внимание, что полную документацию по API WebDriver для .NET можно найти по адресу этой ссылке.
Я предпочитаю использовать метод расширения для получения объекта scripts:
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");
пакет nuget
Selenium.Support
уже содержит метод расширения, чтобы помочь с этим. После того, как он включен, один лайнер для выполнения скриптаDriver.ExecuteJavaScript("console.clear()");
или
string result = Driver.ExecuteJavaScript<string>("console.clear()");
вы также можете сделать:
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); }