C # 'da Selenium WebDriver kullanarak JavaScript'i çalıştırın


103

Bu nasıl başarılır? Burada java sürümünün şöyle olduğunu söylüyor:

WebDriver driver; // Assigned elsewhere
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("return document.title");

Ancak bunu yapmak için C # kodunu bulamıyorum.

Yanıtlar:


217

.NET dil bağlamalarındaki nesne, yöntem ve özellik adları, Java bağlamalarındakilere tam olarak karşılık gelmez. Projenin ilkelerinden biri, her dil bağlantısının o dilde rahat kodlama yapanlar için "doğal" hissetmesi gerektiğidir. C # 'da JavaScript'i çalıştırmak için isteyeceğiniz kod aşağıdaki gibidir

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

NET için WebDriver API'nin eksiksiz belgelerinin bu bağlantıda bulunabileceğini unutmayın .


10
Java S cript kelimesindeki büyük harf kullanımına dikkat edin . Bu beni yakaladı.
Wheretheresa12

1
Jim'in cevabı, alabileceğiniz kadar yetkili. Her Selenium .NET dosyasındaki işleme geçmişine göz atın :-)
Ross Patterson

C # 'da bir düğmeyi nasıl tıklayacağımı söyler misiniz? Gibi cevaplar arguments[0].click();benim için çalışmıyor mu? Kodumu çalıştırdığımda bir istisnam yok, ancak düğmeyi tıklamıyor.
Almett

Sürücüyü seçmem gerektiğini garip buluyorum. Neden ExecuteJavascriptsadece bir yöntem değil driver?
Kolob Canyon

Bu, her sürücü uygulamasının rasgele JavaScript çalıştırmayı desteklemediği bir zamandan kalma. Java gibi. Destek derlemesinde ( pakette WebDriver.Support.dllNuGet aracılığıyla kullanılabilir Selenium.Support), sizin için yayınlamayı işleyen ve sürücünün bir ExecuteJavaScriptyöntemi varmış gibi görünmesini sağlayan bir uzantı yöntemi vardır .
JimEvans

51

Scripts nesnesini almak için bir uzantı yöntemi kullanmayı tercih ediyorum:

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

Bu şekilde kullanıldı:

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

Selenium varsayılan olarak buna sahip olmalıdır
Kolob Canyon

13

@Morten Christiansen'in güzel uzatma yöntemi fikrinin biraz basitleştirilmiş bir versiyonuna ne dersiniz:

public static object Execute(this IWebDriver driver, string script)
{
    return ((IJavaScriptExecutor)driver).ExecuteScript(script);
}

// usage
var title = (string)driver.Execute("return document.title");

veya belki genel sürüm:

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
Bu, WebElement ve bool'u almak için de kullanılabilir mi?
rahoolm

12

nuget paketi Selenium.Supportzaten buna yardımcı olacak bir uzantı yöntemi içeriyor. Dahil edildikten sonra, komut dosyasını yürütmek için bir satır

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

veya

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

Bu güzel, modern bir çözüm. Uzantı yöntemi, sürücünün uyguladığı doğrulamayı ekler IJavaScriptExecutorve dönüş türü, istenen dönüş türüne dönüştürülmemesi veya dönüştürülememesi gerektiğinde boş ise daha iyi bir istisna mesajı verir.
Jeffrey LeCours

nedir Driver? VS bunu tanıyamıyor
anatol

Nuget'i kurdun mu?
harishr

8

Şunları da yapabilirsiniz:

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
İyi fikir. Bunu okuyan diğerleri için, javascript kodunuz bir DOM öğesi döndürmelidir.
joelsand

Bunu mümkün olarak düşünmedim bile. NextSibling'i döndürmek için artık javascript kullanarak bir yöntem oluşturabildiğim için bu çok büyük.
2017

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

Kodunuzda daha sonra yapabilirsiniz

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

0

En kısa kod

ChromeDriver drv = new ChromeDriver();

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

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.