C #에서 Selenium WebDriver를 사용하여 JavaScript 실행


답변:


216

.NET 언어 바인딩의 개체, 메서드 및 속성 이름은 Java 바인딩의 이름과 정확히 일치하지 않습니다. 프로젝트의 원칙 중 하나는 각 언어 바인딩이 해당 언어로 편안한 코딩을 할 때 "자연 스러워야"한다는 것입니다. C #에서 JavaScript를 실행하기 위해 원하는 코드는 다음과 같습니다.

IWebDriver driver; // assume assigned elsewhere
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
string title = (string)js.ExecuteScript("return document.title");

.NET 용 WebDriver API의 전체 문서는 이 링크 에서 찾을 수 있습니다 .


10
Java S cript 라는 단어의 대소 문자에 유의하십시오 . 이것은 나를 잡았다.
— WheretheresaWill

1
Jim의 대답은 당신이 얻을 수있는 한 권위있는 것입니다. 모든 Selenium .NET 파일에 대한 커밋 내역을 확인하십시오. :-)
— Ross Patterson

C #에서 버튼을 클릭하는 방법을 알려주세요. 같은 대답 arguments[0].click();이 저에게 효과가 없습니까? 코드를 실행할 때 예외는 없지만 버튼을 클릭하지 않습니다.
— Almett 2016-06-23

드라이버를 캐스팅해야하는 게 어색하다. 에 ExecuteJavascript대한 방법 이 아닌 이유는 무엇 driver입니까?
— Kolob Canyon

이는 모든 드라이버 구현이 임의의 JavaScript 실행을 지원하지 않았던 때로부터 남은 것입니다. Java와 같은 .NET 바인딩은 역할 기반 인터페이스를 사용하여 하나의 드라이버에서 지원할 수있는 기능을 모델링합니다. Support 어셈블리 ( WebDriver.Support.dll, Selenium.Support패키지의 NuGet을 통해 사용 가능 )에는 캐스팅을 처리하고 드라이버에 ExecuteJavaScript메서드 가있는 것처럼 보이게하는 확장 메서드가 있습니다.
— JimEvans

51

확장 메서드를 사용하여 스크립트 개체를 얻는 것을 선호합니다.

public static IJavaScriptExecutor Scripts(this IWebDriver driver)
{
    return (IJavaScriptExecutor)driver;
}

다음과 같이 사용됩니다.

driver.Scripts().ExecuteScript("some script");

Selenium은 기본적으로 이것을 가지고 있어야합니다
— Kolob Canyon 19

13

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

1
WebElement와 bool을 얻는데도 사용할 수 있습니까?
— rahoolm

12

nuget 패키지 Selenium.Support에는 이미이를 지원하는 확장 메서드가 포함되어 있습니다. 포함되면 실행자 스크립트에 하나의 라이너

  Driver.ExecuteJavaScript("console.clear()");

또는

  string result = Driver.ExecuteJavaScript<string>("console.clear()");

이것은 멋지고 현대적인 솔루션입니다. 확장 메서드는 드라이버가 구현하는 유효성 검사를 추가 IJavaScriptExecutor하고 반환 유형이 원하는 반환 유형으로 캐스트되어서는 안되거나 캐스트 될 수없는 경우 null 인 경우 더 나은 예외 메시지를 제공합니다.
— Jeffrey LeCours

무엇 Driver입니까? VS는 인식 할 수 없습니다
— 아나 톨

너겟을 설치 했습니까 ??
— harishr

8

다음을 수행 할 수도 있습니다.

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
좋은 생각. 이것을 읽는 다른 사람들을 위해 자바 스크립트 코드는 DOM 요소를 반환해야합니다.
— joelsand 2013

나는 이것을 가능한 한 생각조차하지 않았다. 이제 javascript를 사용하여 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);
    }
}

코드에서 다음을 수행 할 수 있습니다.

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

0

가장 짧은 코드

ChromeDriver drv = new ChromeDriver();

drv.Navigate().GoToUrl("/programming/6229769/execute-javascript-using-selenium-webdriver-in-c-sharp");

drv.ExecuteScript("return alert(document.title);");


당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.