【问题标题】:Execute JavaScript using Selenium WebDriver in C#在 C# 中使用 Selenium WebDriver 执行 JavaScript
【发布时间】:2016-01-17 14:09:08
【问题描述】:

这是如何实现的? Here它说java版本是:

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

但我找不到执行此操作的 C# 代码。

【问题讨论】:

    标签: javascript c# selenium selenium-webdriver webdriver


    【解决方案1】:

    最短的代码

    ChromeDriver drv = new ChromeDriver();
    
    drv.Navigate().GoToUrl("https://stackoverflow.com/questions/6229769/execute-javascript-using-selenium-webdriver-in-c-sharp");
    
    drv.ExecuteScript("return alert(document.title);");
    
    
    

    【讨论】:

      【解决方案2】:
      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; ");
      

      【讨论】:

        【解决方案3】:

        nuget 包Selenium.Support 已经包含一个扩展方法来帮助解决这个问题。包含后,执行器脚本的一个衬垫

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

        或

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

        【讨论】:

        • 这是一个不错的现代解决方案。扩展方法添加了对驱动程序实现IJavaScriptExecutor 的验证,并在返回类型不应该或不能转换为所需的返回类型时提供更好的异常消息。
        • Driver 是什么? VS 无法识别
        【解决方案4】:
        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);
        
            }
        

        【讨论】:

          【解决方案5】:

          .NET 语言绑定中的对象、方法和属性名称与 Java 绑定中的名称不完全对应。该项目的一项原则是,每种语言绑定对于那些使用该语言进行舒适编码的人来说应该“感觉自然”。在 C# 中,执行 JavaScript 所需的代码如下

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

          请注意,用于 .NET 的 WebDriver API 的完整文档可在 this link 找到。

          【讨论】:

          • 请注意单词 JavaScript 中的大写。这让我大吃一惊。
          • Jim 的回答几乎是权威的。查看每个 Selenium .NET 文件的提交历史:-)
          • 您能告诉我如何在 C# 中单击按钮吗?像arguments[0].click(); 这样的答案对我不起作用?我执行代码时也不例外,但它没有点击按钮。
          • 我觉得我不得不强制转换驱动程序很尴尬。为什么ExecuteJavascript 不只是driver 上的一个方法?
          • 这是在不是每个驱动程序实现都支持执行任意 JavaScript 的时候遗留下来的。 .NET 绑定,就像 Java 绑定一样,使用基于角色的接口来建模可能由一个驱动程序支持的功能,但不是全部。在 Support 程序集中(WebDriver.Support.dll,可通过 NuGet 在 Selenium.Support 包中获得),有一个扩展方法可以为您处理转换并使其看起来像驱动程序具有 ExecuteJavaScript 方法。
          【解决方案6】:

          我更喜欢使用扩展方法来获取脚本对象:

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

          这样使用:

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

          【讨论】:

          • Selenium 默认应该有这个
          【解决方案7】:

          你也可以这样做:

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

          【讨论】:

          • 好主意。对于阅读本文的其他人,您的 javascript 代码应该返回一个 DOM 元素。
          • 我什至不认为这是可能的。这是巨大的,因为我现在可以使用 javascript 创建一个方法来返回 nextSibling。
          【解决方案8】:

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

          【讨论】:

          • 这个也可以用来获取WebElement和bool吗?
          猜你喜欢
          • 2016-12-04
          • 2015-09-04
          • 2019-06-14
          • 2013-10-06
          • 2019-07-25
          • 2016-06-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多