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.