【问题标题】:How to get all rows and columns in Selenium?如何获取 Selenium 中的所有行和列?
【发布时间】:2018-11-29 23:41:35
【问题描述】:

我有一张这样的桌子:

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>

【问题讨论】:

  • 向我们展示表格的实际标记会更有用。
  • @JeffMercado 我更新了我的问题。

标签: c# selenium


【解决方案1】:

仅查看 TD,您并没有利用 HTML 中的所有信息。每个 TD 都有一个类,它告诉您每个 TD 中包含哪些信息,例如&lt;td class="name"&gt; 包含名称。使用它来分离不同的数据位。

我会做这样的事情。我添加了 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 = "";
    }
}

【讨论】:

  • 对不起,@jeffC。我更新了我的问题。 不包含任何类。 的孩子正在上课。您的代码就在:By scoretextLocator = By.ClassName("td/div.score_text");?
  • 好的。我更新了我的答案以匹配问题的更新。你试过这个吗?它对你有用吗?
  • 我根据您的回答尝试了其他方法,这解决了我的问题。谢谢,@jeffC
【解决方案2】:

为什么不这样:

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
}

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我不知道行有空值。你知道处理我的输出吗?输出仅获取行中的所有文本。如何在行中向此值添加标题列?
    • 您可以知道行是否有空值...您可能没有使用该信息,并且可能需要重写您的输出编写器以利用该信息。如果您想对此提供反馈,则必须在问题中添加更多代码。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签