Wykonaj JavaScript przy użyciu Selenium WebDriver w C #


103

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:


217

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 .


10
UWAGA na wielkie litery w słowie Java S cript. To mnie zaskoczyło.
Wheretheresa Will

1
Odpowiedź Jima jest tak autorytatywna, jak tylko możesz. Sprawdź historię zmian w każdym pliku Selenium .NET :-)
Ross Patterson

Czy mógłbyś mi powiedzieć, jak kliknąć przycisk w C #? Odpowiedzi typu arguments[0].click();nie działają dla mnie? Nie mam wyjątku, kiedy wykonuję kod, ale nie klikam przycisku.
Almett

Uważam za niezręczne, że muszę obsadzić kierowcę. Dlaczego ExecuteJavascriptnie jest to tylko metoda driver?
Kolob Canyon

To pozostałość z czasów, gdy nie każda implementacja sterownika obsługiwała wykonywanie dowolnego kodu JavaScript. Powiązania .NET, podobnie jak te w języku Java, wykorzystują interfejsy oparte na rolach do modelowania funkcji, które mogą być obsługiwane przez jeden sterownik, ale nie wszystkie. W zestawie pomocy technicznej ( WebDriver.Support.dlldostępnym za pośrednictwem Selenium.Supportpakietu NuGet w pakiecie) istnieje metoda rozszerzenia, która obsługuje rzutowanie i sprawia, że ​​wygląda na to, że sterownik ma ExecuteJavaScriptmetodę.
JimEvans

51

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");

Selen powinien mieć to domyślnie
Kolob Canyon

13

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");

1
Czy można tego użyć do pobrania WebElement i bool?
rahoolm

12

pakiet NuGet Selenium.Supportzawiera 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()");

To ładne, nowoczesne rozwiązanie. Metoda rozszerzająca dodaje walidację implementowaną przez sterownik IJavaScriptExecutori 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.
Jeffrey LeCours

co to jest Driver? VS nie może tego rozpoznać
anatol

Czy zainstalowałeś nuget?
harishr

8

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);
}

2
Dobry pomysł. Dla innych, którzy to czytają, Twój kod javascript powinien zwrócić element DOM.
joelsand

Nawet nie uważałem tego za możliwe. To jest ogromne, ponieważ mogę teraz utworzyć metodę przy użyciu javascript, aby zwrócić 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);
    }
}

W swoim kodzie możesz to zrobić

string test = Webdriver.ExecuteJavaScript<string>(" return 'hello World'; ");
int test = Webdriver.ExecuteJavaScript<int>(" return 3; ");

0

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);");

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.