2016-06-20 4 views
1

私はこのようなテーブルを持っている:Seleniumのすべての行と列を取得するには?

Name  Places   Sex   Score 
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- 
Ken   null   Male   9.5 
Smith  London   Male   7.5 
Joe   null   null   8.0 

私はセレンを使用してWebでテーブルのすべての値を取得したいです。

上記の表の列と行を使用して値を取得し、表にデータを表示する方法はありますか?

List<IWebElement> result = new List<IWebElement>(); 
IList<IWebElement> tableRows = browser.FindElements(By.XPath("id('column2')/tbody/tr")); 

foreach (IWebElement rows in tableRows) 
{ 
    try 
    { 
     if (rows.FindElements(By.XPath("td")).Count == 10) 
      result.Add(rows); 
    } 
} 

をそして、私はこれだけのようにすべての行のテキストを取得:

私のコードは、これを行うには、あなたが見ることができるように、私は唯一の行のみを取得し

Ken  Male  9.5 
Smith London Male  7.5 
Joe  8.0 

。そして、私は対応する値の列を知ることができません。

Name Places Sex Score

Joe 8.0はと一致しません。

私のテーブルのHTMLマークアップ:

<div class="tabbox_F" id="oTableContainer_L"> 
    <table id="column2"> 
     <thead> 
     <tr class="tabthdwn"> 
      <th>Name</th> 
      <th>Places</th> 
      <th>Sex</th> 
      <th>Score</th>\ 
     </tr> 
     </thead> 
     <tbody> 
     <tr class="table Alpha"> 
      <td> 
       <div class="name"><span>Ken</span></div> 
       <div class= "category"><span>Student</span></div> 
      </td> 
      <td><div class="address"></div></td> 
      <td><div class="sex"><h5>Male</h5></div></td> 
      <td> 
       <div class="score_math"><b>9.5</b></div> 
       <div class="score_bio"><b>7.5</b></div>ư 
      </td> 
     </tr> 
     <tr class="table Alpha"> 
      <td> 
       <div class="name"><span>Joe</span></div> 
       <div class= "category"><span>Teacher</span></div> 
      </td> 
      <td><div class="address"></div></td> 
      <td><div class="sex"></div></td> 
      <td> 
       <div class="score_math"><b>8.0</b></div> 
       <div class="score_bio"><b>5.5</b></div>ư 
      </td> 
     </tr> 
     </tbody> 
    </table> 
</div> 
+1

テーブルの実際のマークアップを表示すると便利です。 –

+0

@JeffMercado私の質問が更新されました。 – vanloc

答えて

1

TDだけを見ると、HTMLにあるすべての情報を利用できません。各TDには、どのビットの情報が各TDに含まれているかを示すクラスがあります。 <td class="name">には名前が含まれています。これを利用して、さまざまなデータを分離してください。

私はこのようなことをします。私は行のデータを一時的に格納するためにValuesクラスを追加しました。値をダンプするだけではなく、データを再利用する必要がない場合は、そのビットを削除することができます。

class Program 
{ 
    static void Main(string[] args) 
    { 
     IWebDriver browser = new FirefoxDriver(); 
     List<IWebElement> result = new List<IWebElement>(); 
     IList<IWebElement> tableRows = browser.FindElements(By.XPath("id('column2')/tbody/tr")); 
     By nameLocator = By.ClassName("td > div.name"); 
     By addressLocator = By.ClassName("td > div.address"); 
     By sexLocator = By.ClassName("td > div.sex"); 
     By scoretextLocator = By.ClassName("td > div.score_text"); 

     // String.Format Method https://msdn.microsoft.com/en-us/library/aa331875(v=vs.71).aspx 
     Console.WriteLine("{0,10}{1,10}{2,10}{3,10}", "Name", "Address", "Sex", "Score"); 
     foreach (IWebElement rows in tableRows) 
     { 
      Values values = new Values(); 
      values.name = rows.FindElement(nameLocator).Text.Trim(); 
      values.address = rows.FindElement(addressLocator).Text.Trim(); 
      values.sex = rows.FindElement(sexLocator).Text.Trim(); 
      values.scoretext = rows.FindElement(scoretextLocator).Text.Trim(); 

      Console.WriteLine("{0,10}{1,10}{2,10}{3,10}", values.name, values.address, values.sex, values.scoretext); 
     } 
    } 
} 

class Values 
{ 
    public string name; 
    public string address; 
    public string sex; 
    public string scoretext; 

    public Values() 
    { 
     this.name = ""; 
     this.address = ""; 
     this.sex = ""; 
     this.scoretext = ""; 
    } 
} 
+0

申し訳ありませんが、@ jeffC。私は私の質問を更新しました。​​にはクラスが含まれていません。クラスがある​​の子です。あなたのコードは以下の通りです: 'By scoretextLocator = By.ClassName(" td/div.score_text ");'? – vanloc

+0

OK。私は質問への更新に合わせて自分の答えを更新しました。これを試しましたか?それはあなたのために働いたのですか? – JeffC

+0

私はあなたの答えに他の方法ベースで試してみましたが、これは私の問題を解決します。ありがとう、@ jeffC – vanloc

0

私が唯一の問題は、あなたの行をプリントアウトしている方法だと思います。一部の列に値がないことに注意してください。あなたの出力でそれを処理していない場合は、上に示したようになります。デバッガを使用して行要素を見ると、各行にまだ4つのtd子があることがわかります。

+0

行にNULL値があることがわかりません。私の出力を知っていますか?出力はすべての行のテキストのみを取得します。ヘッダーを追加する方法は列のこの値に行ですか? – vanloc

+0

行にNULL値があるかどうかは知ることができます。その情報を使用していない可能性があり、その情報を利用するために出力ライターを書き直す必要があるかもしれません。あなたはそれについてのフィードバックをしたい場合は、そのコードの多くを質問に入れなければなりません。 – JeffC

関連する問題