2017-05-24 12 views
1

私は私が私のニーズに適合したコードの次snippitを発見したの周りの多くの狩猟後、カラム11セレンC#のリンク発見

のデータで列1に配置されているテーブル内のリンクを見つけようとしています

 IWebElement table = driver.FindElement(By.XPath("//*[@id='NewBusinessDetailRecords']")); 
     IList <IWebElement> rows = table.FindElements(By.TagName("tr")); 

     foreach (IWebElement row in table) 
     { 
      rows = table.FindElements(By.TagName("tr")); 
      IList<IWebElement> cells = row.FindElements(By.TagName("td")); 
      if (cells[10].Text.Equals("103")) 
      { 
       cells[0].Click(); 
      } 
     } 

foreach文はエラー

foreach文は、型の変数を操作することができないと、テーブルを強調動作していないが「OpenQA.Selenium.IWebElement」OpenQA.Sele」理由nium.IWebElement GetEnumeratorメソッド 『

いくつかの記事は、私がIEnumerableを(また、いくつかのこれは自動でなければなりません示唆している)を使用する必要がありますが、私はこれを実装するために動作するように管理していない提案」のための公共の定義が含まれていません』私のコードに入れてください。

すべてのヘルプは大歓迎です

EDIT:1つのテーブルの行から

例HTML

<table id="NewBusinessDetailRecords" cellspacing="0" style="width:100%;" class="listviewgrid"> 
<thead> ... </thead>  
<tbody>   
<tr id="0" class="datagriddetail">  
<td style="text-align: center">    
<a href="" accesskey="1" style="cursor: pointer; cursor: hand;" onclick="CopyNewBusinessDetailRecord(0, 0, 1083406, 14436); return false;" title="Matched to Invoice with ID = 14436; Client with ID = 1083406"><img src="../../images/icons/invoice.png" border="0"></a>    </td>   
<td> Test1 Case1 </td>  
<td> Invoice </td>  
<td> GBP </td>  
<td style="text-align: right"> 600.00 </td>  
<td> 0% </td>  
<td style="text-align: right"> 600.00 </td>  
<td> </td>  
<td> Company Name </td>  
<td> UserName</td>  
<td> 103 </td>  
<td> </td>  
<td> </td>  
<td> </td>  
<td style="text-align: center">   </td>  
</tr>  <tr id="0" class="datagriddetail">  

答えて

0

<tr>をそれぞれ<table>に繰り返します。あなたはないtablerowsを反復処理する必要があります。rows = table.FindElements(By.TagName("tr"));

foreach (IWebElement row in rows) 

はまた、あなたがこの余分な行を削除する必要があります。 foreachループの "内側"に入ると、row変数には処理対象の<tr>IWebElementが含まれます。

  • 私は可能な場合はXPathを使用しないようになります。


    はあなたのサンプルのHTMLに基づいて、私はまた、いくつかの提案を持っています。あなたの場合、単純にIDで選択してください。

    IWebElement table = driver.FindElement(By.Id("NewBusinessDetailRecords")); 
    
  • インデックスを追加する前に検証を追加してください。cells。これにより、ArgumentOutOfRangeExceptionが防止されます。

    if (cells.Count > 10 && cells[10].Text.Equals("103")) 
    

全コード:私は、もしライン上ArgumentOurOfRangeExpectionを取得していますよう

IWebElement table = driver.FindElement(By.Id("NewBusinessDetailRecords")); 
IList<IWebElement> rows = table.FindElements(By.TagName("tr")); 

foreach (IWebElement row in rows) 
{ 
    IList<IWebElement> cells = row.FindElements(By.TagName("td")); 
    if (cells.Count > 10 && cells[10].Text.Equals("103")) 
    { 
     cells[0].Click(); 
    } 
} 
+0

これは完璧に動作します! – Smithy7876

1

だけ間違いIEnumerable種類

foreach (IWebElement row in table)

となり取り組んでいる foreachため、このエラーが発生しています tableがなので失敗します0であり、明らかに単一のオブジェクトである。私はのhtmlコードを持っていないので、

var row = driver.FindElement(By.CssSelector("table#NewBusinessDetailRecords tr#0")); 
var cells = row.FindElements(By.TagName("td")).ToList(); 
if (cells[10].Text.Equals("103")) 
{ 
    cells[10].Click(); 
} 

は、私は確かにあなたを伝えることはできません:あなたはこの(行0列10)のように、不要なforeachループを削除され、ここで必要なもの

driver.FindElement(By.LinkText("103")).Click(); 

それとも、あなたがリンクテキストの一部だけを指定する場合:

driver.FindElement(By.PartialLinkText("10")).Click(); 
あなたがクリックする必要がありますが、私はすべてのあなたのコードがこれに置き換えることができると思う要素
+0

このソリューションは、私のために働いていません。私はいくつかのサンプルHTMLを私の質問に追加します – Smithy7876

+0

私はhtmlでリンクコードを見つけることができませんでした。私はそれが103のように見えると思う。その場合、最後のコードスニペットが機能するはずです:driver.FindElement(By.LinkText( "103"))。();をクリックします。 –

+0

リンクは Smithy7876

関連する問題