如何获取Selenium中的所有行和列?

时间:2016-06-20 16:11:07

标签: c# selenium

我有一张这样的表:

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

我想使用Selenium在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

如您所见,我只获得了一行。我无法知道相应的值列。

Joe 8.0与以下内容不匹配:

Name Places Sex Score

我桌子的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>

3 个答案:

答案 0 :(得分: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 = "";
    }
}

答案 1 :(得分:0)

我认为唯一的问题是你如何打印出你的行。请注意,某些列没有值。如果您没有在输出中处理它,那么它将以您在上面显示的方式出现。如果您使用调试器并查看row元素,您可能会发现每行中仍有4个td子项。

答案 2 :(得分:0)

为什么不这样:

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

foreach (IWebElement rows in tableRows)
{
    IList<IWebElement> allColumns =row.FindElements(By.TagName("td"));
    //and how allColumns[0] +1 etc .... gives you each values, including nulls
}