合并两个列表与一些条件

时间:2016-07-29 19:12:07

标签: c# selenium foreach

我从表中获取数据但值显示不易操作。

我的HTML结构如:

<table>
  <tbody>
    <tr>
       <td>
          <span>1</span>
          <span>0</span>
          <br>
          <span>
            <span>Good Luck</span>
            <img src="/App_Themes/Resources/img/icon_tick.gif" width="3" height="7">
          </span>
       </td>
    </tr>

    <tr>
      <td>
        <b>Nowaday<br></b>
        <p>hook<br>zp</p>
      </td>
    </tr>
  </tbody>
</table>

但是当我试图获取数据时会像:

10Good LuckNowadayhookzp

我正在使用此代码:

ReadOnlyCollection<IWebElement> lstTable = browser.FindElements(By.XPath("table/tbody/tr"));
foreach (IWebElement val in lstTable)
{
     ReadOnlyCollection<IWebElement> lstTDElement = val.FindElements(By.XPath("td"));
     ReadOnlyCollection<IWebElement> lstSpecialEle = 
                          val.FindElements(By.XPath("//td/span | //td/b | //td/p"));
}

它会创建很多行(在<tr>标签中找到大约6000个),我不知道如何安排正确的列。

因为每列,数据可以为null或在此具有多个值。

目前,我lstTDElement包含两列(实际上:10列)。

lstSpecialEle包含所有必要的数据。 我只过滤了[//td/span | //td/b | //td/p]

如何将lstSpecialElelstTDElement集成到权限列中。使用foreach条件?

编辑:

典型的,我将从lstTDElement收到:10Good LuckNowadayhookzp

lstSpecialEle将创建包含我需要的所有值的多行。

问题是:我不知道如何将lstSpecialEle中的所有行排列到表格中。

我的桌子有两个<tr>标签;这意味着它有两列。如何将lstSpecialEle中的所有值组织到此列中。

应该是这样的:

     Num                       Time
1 0 Good Luck             Nowaday hookzp

如上所述,数据是动态的,首先<tr>或第二个<tr>不能包含<span>标记,或者没有标记<b>等等(它只是没有出现,没有添加新的<tag>

1 个答案:

答案 0 :(得分:1)

实际上,您在xpath中使用//找到元素,这将在整个页面中搜索元素,而您只需在特定的行元素中搜索,因此您应该尝试使用.//在你的xpath中,它将仅搜索元素特定的元素上下文。所以我认为你应该尝试如下,这将只给你想要的元素列表,而不是如下所示的大量元素列表:

ReadOnlyCollection<IWebElement> lstTable = browser.FindElements(By.XPath("//table/tbody/tr"));
foreach (IWebElement val in lstTable)
{
  ReadOnlyCollection<IWebElement> lstSpecialEle = val.FindElements(By.XPath(".//td/span | .//td/b | .//td/p"));
}

Edited1 :如果获得带有空文本组合的元素列表,则可以使用null条件对其进行过滤,并获取包含以下精确文本的子列表: -

var FinalList = lstSpecialEle.Where(x=>x.Text != null).ToList();

Edited2 : - 如果要将所有列文本列表合并到单个字符串列表中,请尝试如下: -

List<string> FinalList = new List <string>();
foreach (IWebElement val in lstTable)
{
    ReadOnlyCollection<IWebElement> lstSpecialEle = val.FindElements(By.XPath(".//td/span | .//td/b | .//td/p"));

    var AllTextList = lstSpecialEle.Where(x=>x.Text != null).ToList().Select(El => El.Text).ToList();

     string AllText = String.Join(" ", AllTextList);

     FinalList.Add(AllText);       
}
Console.WriteLine(FinalList);

现在FinalList将包含按行分隔的所有值。

希望它有帮助...:)