C#

2011-06-03 5 views
84

'de Selenium WebDriver'i kullanarak JavaScript'i çalıştırın Bu nasıl başarılır?C#

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

Ama bunu yapmak C# kodu bulamıyor: Here o java versiyonu diyor.

cevap

170

.NET dili bağlamalarındaki nesne, yöntem ve özellik adları, Java bağları içindekilerle tam olarak uyuşmuyor. Projenin ilkelerinden biri, her dil bağlantısının bu dilde rahatça kodlanmaya "doğal hissetmesi" gerektiğidir. .NET için WebDriver API tam dokümantasyon this link bulunabilir olduğunu

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

Not şöyle C#, sen JavaScript yürütülür için istediğimiz koddur.

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

bu şekilde kullanılır:

+5

NOT yürütücüsü için. Bu beni yakaladı. – WheretheresaWill

+1

Jim'in cevabı alabileceğiniz kadar yetkilidir. İşlem tarihçesine göz atın, her Selenium .NET dosyasında :-) –

+0

Lütfen C# 'daki bir düğmeyi tıklatır mısınız? Argümanlar [0] .click(); gibi cevaplar benim için çalışmıyor mu? Kodumu çalıştırdığımda bir istisna yapıyorum, ancak düğmeyi tıklamıyor. –

41

Ben komut nesne almak için bir uzantısı yöntemi kullanmayı tercih

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

Çok temiz. Bunu severim! –

+1

üzerinde anlaşılan, süper temiz –

11

Nasıl @Morten Christiansen'in güzel uzatma yöntemi fikrinin biraz basitleştirilmiş sürümü hakkında:

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

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

ya da belki jenerik versiyon

:

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 kullanılabilir mi? – rahoolm

6

Ayrıca yapabilirdi:

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

Güzel fikir. Bunu okuyan diğer kullanıcılar için javascript kodunuz bir DOM öğesi döndürmelidir. – joelsand

+0

Bunu olabildiğince düşünmedim bile. Bu şimdi nextSibling dönmek için javascript kullanarak bir yöntem oluşturabilir gibi büyük. – jibbs

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

    } 
4

Nuget paketi Selenium.Support zaten bu konuda yardımcı olacak bir uzantısı yöntem içerir. o eklendikten sonra, bir liner Java *** cript *** S kelimesinde harf komut

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

veya

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

Bu güzel ve modern bir çözümdür. Uzantı yöntemi, sürücünün "IJavaScriptExecutor" uygulamasını uyguladığı ve dönüş türünün istenen dönüş türüne dönüştürülmemesi veya dönüştürülememesi durumunda geri dönüş türünün boş olması durumunda daha iyi bir istisna mesajı verdiğinin onaylanmasını ekler. –