Jak to się osiąga? Tutaj jest napisane, że wersja java to:
WebDriver driver; // Assigned elsewhere
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("return document.title");
Ale nie mogę znaleźć kodu C #, aby to zrobić.
Odpowiedzi:
Nazwy obiektów, metod i właściwości w powiązaniach języka .NET nie odpowiadają dokładnie tym w powiązaniach Java. Jedną z zasad projektu jest to, że każde powiązanie języka powinno być „naturalne” dla tych, którzy potrafią programować w tym języku. W języku C # kod, który chcesz wykonać do wykonywania JavaScript, jest następujący
IWebDriver driver; // assume assigned elsewhere
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
string title = (string)js.ExecuteScript("return document.title");
Należy zwrócić uwagę, że pełną dokumentację interfejsu API WebDriver dla platformy .NET można znaleźć pod tym łączem .
arguments[0].click();
nie działają dla mnie? Nie mam wyjątku, kiedy wykonuję kod, ale nie klikam przycisku.
ExecuteJavascript
nie jest to tylko metoda driver
?
WebDriver.Support.dll
dostępnym za pośrednictwem Selenium.Support
pakietu NuGet w pakiecie) istnieje metoda rozszerzenia, która obsługuje rzutowanie i sprawia, że wygląda na to, że sterownik ma ExecuteJavaScript
metodę.
Wolę użyć metody rozszerzenia, aby uzyskać obiekt skryptów:
public static IJavaScriptExecutor Scripts(this IWebDriver driver)
{
return (IJavaScriptExecutor)driver;
}
Używany w ten sposób:
driver.Scripts().ExecuteScript("some script");
Co powiesz na nieco uproszczoną wersję pomysłu na ładną metodę rozszerzenia @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");
a może wersja ogólna:
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");
pakiet NuGet Selenium.Support
zawiera już metodę rozszerzenia, która pomaga w tym. Po dołączeniu jedna linijka do skryptu wykonawczego
Driver.ExecuteJavaScript("console.clear()");
lub
string result = Driver.ExecuteJavaScript<string>("console.clear()");
IJavaScriptExecutor
i zapewnia lepszy komunikat o wyjątku, jeśli typ zwracany jest null, gdy nie powinien lub nie może być rzutowany na żądany typ zwracany.
Driver
? VS nie może tego rozpoznać
Możesz też:
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);
}
}
W swoim kodzie możesz to zrobić
string test = Webdriver.ExecuteJavaScript<string>(" return 'hello World'; ");
int test = Webdriver.ExecuteJavaScript<int>(" return 3; ");
Najkrótszy kod
ChromeDriver drv = new ChromeDriver();
drv.Navigate().GoToUrl("/programming/6229769/execute-javascript-using-selenium-webdriver-in-c-sharp");
drv.ExecuteScript("return alert(document.title);");