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.