2012-01-17 19 views
1

以下は、WebDriverからのJavaScript呼び出しの値を調べるためのデバッグと例外のスローです。私の例外メッセージに文字列( "viewtable"のIDを持つテーブルのtrタグの数に基づいて)を印刷できるようにjQuery呼び出しをキャストするにはどうすればいいですか?私はこれがC#コードとはまったく関係ないと思います。私はドライバがjQueryの呼び出しを正しく実行できないだろうと確信していますが、正しい構文はわかりません。 NUnitのでスローSelenium 2.0 WebdriverのSystem.StringにキャストできませんNUnitテストケース

例外:

Selenium.ProductPricing.TheUntitledTest: 
System.InvalidCastException : Unable to cast object of type 'System.Int64' to type 'System.String'. 

環境:

  • クラスライブラリプロジェクトは、NUnitのDLLを参照するSelenium.sln/Selenium.csproj
  • プロジェクト&セレンのC#と呼ばれ​​ていますWebDriver dllファイルを含むクライアントドライバ
  • プロジェクトはNUnitの2.6

テストケースC#コードでProductPricing.cs

  • ランニングクラスライブラリDLLと呼ばれる1つのクラスクラスがあります。
    (を探し、以下の "BAD!")

    using NUnit.Framework; 
    using OpenQA.Selenium; 
    using OpenQA.Selenium.Support.UI; 
    using OpenQA.Selenium.Firefox; 
    using OpenQA.Selenium.IE; 
    using OpenQA.Selenium.Chrome; 
    using Selenium; 
    using System.Text; 
    using System; 
    
    namespace Selenium 
    { 
        [TestFixture] 
        public class ProductPricing 
        { 
         private IWebDriver driver; 
         private StringBuilder verificationErrors; 
         private string baseURL; 
    
         [SetUp] 
         public void Setup() 
         { 
          driver = new FirefoxDriver(); 
          baseURL = "http://buyemp.qa.xxx.com/"; 
    
          ISelenium selenium = new WebDriverBackedSelenium(driver, baseURL); 
          selenium.Start(); 
    
          verificationErrors = new StringBuilder(); 
         } 
    
         [TearDown] 
         public void TeardownTest() 
         { 
          try 
          { 
           driver.Quit(); 
          } 
          catch (Exception) 
          { 
           // Ignore errors if unable to close the browser 
          } 
          Assert.AreEqual("", verificationErrors.ToString()); 
         } 
    
         [Test] 
         public void TheUntitledTest() 
         { 
          //String var_skip_product = "false"; 
          String var_admin_user = "[email protected]"; 
          String var_admin_pass = "notsure"; 
          driver.Navigate().GoToUrl(baseURL + "/admin"); 
          driver.FindElement(By.Id("email")).Clear(); 
          driver.FindElement(By.Id("email")).SendKeys(var_admin_user); 
          driver.FindElement(By.Id("password")).Clear(); 
          driver.FindElement(By.Id("password")).SendKeys(var_admin_pass); 
          driver.FindElement(By.CssSelector("input[type=\"submit\"]")).Click();    
          driver.WaitForElement(By.LinkText("Products")); 
          driver.FindElement(By.LinkText("Products")).Click(); 
          String var_product_row = "24"; // force script to start on row 24/25 
    
          //// ERROR: Caught exception [unknown command [getTableTrCount]] 
          // Command: getTableTrCount | Target: viewtable | Value: var_table_row_count (user extensions don't work in WebDriver) 
          IJavaScriptExecutor js = driver as IJavaScriptExecutor; 
    
          // this one throws an exception with value 22 - GOOD! 
          //int x = Convert.ToInt32((string)js.ExecuteScript("return '22'")); 
    
          // this one throws an exception with the cast exception - BAD! 
          int x = Convert.ToInt32((string)js.ExecuteScript("return $('#viewtable tr').length")); 
    
          // explicitly throwing Selenium exception so we can debug this code in NUnit 
          throw new SeleniumException(x.ToString()); 
    
          // Command: storeText | Target: //a[@title='last page']/text() | Value: var_page_total_text 
          // Conversion: String var_page_total_text = driver.FindElement(By.XPath("//a[@title='last page']/text()")).Text; 
          String var_page_total_text = driver.FindElement(By.XPath("//a[@title='last page']")).Text; 
    
          //// ERROR: Caught exception [ERROR: Unsupported command [getEval]] 
          // Command: eval | Target: javascript{storedVars['var_page_total_text'].substring(1,storedVars['var_page_total_text'].length-1)} 
          //int var_page_total = Convert.ToInt32(var_page_total_text.Substring(1,var_page_total_text.Length-1));   
    
         }  
    
         private bool IsElementPresent(By by) 
         { 
          try 
          { 
           driver.FindElement(by); 
           return true; 
          } 
          catch (NoSuchElementException) 
          { 
           return false; 
          } 
         } 
        } 
    } 
    
  • +1

    発生している問題は、**すべて**あなたのC#コードと関係があります。インクルードは文字列に直接キャストできません。また、 'IJavaScriptExecutor.ExecuteScript()'は正しい型に変換された 'object'を返します。この場合、jQueryセレクタの '.length'プロパティはJavaScriptの数値型を返すので、C#言語バインディングは' ExecuteScript() '呼び出しからintを返します。 – JimEvans

    答えて

    2

    ちょうど私がExecuteScript$("query").length$("query").html()ためstringためint64を返していることを仮定してい例外から。二つ目が、動作するはずです最初の1程度

    long x = (long)js.ExecuteScript("return $('#viewtable tr').length"); 
    

    わからない:あなたは数を好む場合

    string x = js.ExecuteScript("return $('#viewtable tr').length").ToString(); 
    

    のか:

    だから、これをしようとする場合があります。

    +0

    これはまさに正しいです。文字列に直接数値をキャストすることはできません。 – JimEvans

    +0

    ありがとう! .ToString()と(string)のキャストとはどのように違うのですか? – MacGyver

    +0

    2番目のものがbtwで動作し、それが私が望むタイプなので、ループで使うことができます – MacGyver

    0

    これはバグだと思われます。それ以外の場合、セレナはセレクタの割り当てが気に入らないのです。アイデアがあれば教えてください。セレクタで追加されたtrに使用している構文が、このサイトのjQueryのバージョンでサポートされていない限り、

    以下のSelenium IDEユーザー拡張カスタムコマンドが正常に機能するため、そうではありません。

    function jQuery(selector) 
    { 
        return selenium.browserbot.getUserWindow().jQuery(selector); 
    } 
    
    Selenium.prototype.doGetTableTrCount = function(tableName, varStore) { 
    
        this.doStore(jQuery('#' + tableName + ' tr').length,varStore); 
    }; 
    

    これは動作します:

    IWebElement webElement = (RemoteWebElement)js.ExecuteScript("return $('#viewtable').get(0);"); 
    string jQuerySelector = "arguments[0]"; 
    string x = (string)js.ExecuteScript("return $(" + jQuerySelector + ").html()", webElement); 
    throw new SeleniumException(x); 
    

    これは動作します:

    string x = (string)js.ExecuteScript("return $('#viewtable').html()"); 
    throw new SeleniumException(x); 
    

    これは動作しません:

    IWebElement webElement = (RemoteWebElement)js.ExecuteScript("return $('#viewtable tr').get(0);"); 
    string jQuerySelector = "arguments[0]"; 
    string x = (string)js.ExecuteScript("return $(" + jQuerySelector + ").length", webElement); 
    throw new SeleniumException(x); 
    

    これは動作しません:

    string x = (string)js.ExecuteScript("return $('#viewtable tr').length"); 
    throw new SeleniumException(x); 
    
    関連する問題