【问题标题】:How to access HTML table using selenium C#如何使用 selenium C# 访问 HTML 表
【发布时间】:2019-01-26 08:36:57
【问题描述】:

我正在尝试使用 selenium c# web 驱动程序访问 html。

我的部分html如下(Full html is here)。

<table scope="band" type="tabular" cellpadding="2" border="0" bgcolor="#555555" id="bandstyle-Ver2" cellspacing="1">
<tbody>
  <tr bandheader="true" type="table-header" height="22px">
     <td label-type="text" height="1%" width="2%" class="textbrownNew">No</td>
     <td label-type="text" height="1%" width="3%" class="textbrownNew">Inst Catg</td>
     <td label-type="text" height="1%" width="5%" class="textbrownNew">Inst - Branch</td>
     <td label-type="text" height="1%" width="3%" class="textbrownNew">CF Type</td>
     <td label-type="text" height="1%" width="3%" class="textbrownNew">CF Stat</td>
     <td label-type="text" height="1%" width="3%" class="textbrownNew">Own - Shp</td>
     <td label-type="text" height="1%" width="3%" class="textbrownNew">Crcy</td>
     <td label-type="text" height="1%" width="7.5%" class="textbrownNew">Amount Granted / Limit</td>
     <td label-type="text" height="1%" width="7.5%" class="textbrownNew">Current Balance</td>
     <td label-type="text" height="1%" width="7.5%" class="textbrownNew">Arrears Amount</td>
     <td label-type="text" height="1%" width="7.5%" class="textbrownNew">Installment Amount</td>
     <td label-type="text" height="1%" width="7.5%" class="textbrownNew">Amount Written Off</td>
     <td label-type="text" height="1%" width="6%" class="textbrownNew">Reported Date</td>
     <td label-type="text" height="1%" width="6%" class="textbrownNew">First Disburse Date</td>
     <td label-type="text" height="1%" width="6%" class="textbrownNew">Latest Payment Date</td>
     <td label-type="text" height="1%" width="6%" class="textbrownNew">Restruct Date</td>
     <td label-type="text" height="1%" width="6%" class="textbrownNew"> End  Date </td>
     <td label-type="text" height="1%" width="3%" class="textbrownNew">Repay Type</td>
     <td label-type="text" height="1%" width="4%" class="textbrownNew">Purp.</td>
     <td label-type="text" height="1%" width="4%" class="textbrownNew">Coverage</td>
  </tr>
  <tr height="22px">
     <td height="1%" width="2%" class="text2New" bgcolor="#FFFFFF">1</td>
     <td height="1%" width="3%" class="text2New" bgcolor="#FFFFFF">CBC</td>
     <td height="1%" width="5%" class="text2New" bgcolor="#FFFFFF">OWN-072</td>
     <td height="1%" width="3%" class="text2New" bgcolor="#FFFFFF">LOAN</td>
     <td height="1%" width="3%" class="text2New" bgcolor="#FFFFFF">ACTV</td>
     <td height="1%" width="3%" class="text2New" bgcolor="#FFFFFF">OWN</td>
     <td height="1%" width="3%" class="text2New" bgcolor="#FFFFFF">LKR</td>
     <td height="1%" width="7.5%" align="right" class="text2New" bgcolor="#FFFFFF">4,000,000</td>
     <td height="1%" width="7.5%" align="right" class="text2New" bgcolor="#FFFFFF">3,731,292</td>
     <td height="1%" width="7.5%" align="right" class="text2New" bgcolor="#FFFFFF">0</td>
     <td height="1%" width="7.5%" align="right" class="text2New" bgcolor="#FFFFFF">94,290</td>
     <td height="1%" width="7.5%" align="right" class="text2New" bgcolor="#FFFFFF"><img src="./CRIB Report Number _ W-0043111705_2018_files/spacer.gif"></td>
     <td height="1%" width="6%" class="text2New" bgcolor="#FFFFFF">30-Jun-2018</td>
     <td height="1%" width="6%" class="text2New" bgcolor="#FFFFFF">14-Feb-2018</td>
     <td height="1%" width="6%" class="text2New" bgcolor="#FFFFFF"><img src="./CRIB Report Number _ W-0043111705_2018_files/spacer.gif"></td>
     <td height="1%" width="6%" class="text2New" bgcolor="#FFFFFF"><img src="./CRIB Report Number _ W-0043111705_2018_files/spacer.gif"></td>
     <td height="1%" width="6%" class="text2New" bgcolor="#FFFFFF"><img src="./CRIB Report Number _ W-0043111705_2018_files/spacer.gif"></td>
     <td height="1%" width="3%" class="text2New" bgcolor="#FFFFFF">MNLY</td>
     <td height="1%" width="4%" class="text2New" bgcolor="#FFFFFF">01:001</td>
     <td height="1%" width="4%" class="text2New" bgcolor="#FFFFFF">FS &amp; OG</td>
  </tr>
  <tr height="22px">
     <td height="1%" width="2%" class="text2New" bgcolor="#FFFFFF">2</td>
     <td height="1%" width="3%" class="text2New" bgcolor="#FFFFFF">CBC</td>
     <td height="1%" width="5%" class="text2New" bgcolor="#FFFFFF"><img src="./CRIB Report Number _ W-0043111705_2018_files/spacer.gif"></td>
     <td height="1%" width="3%" class="text2New" bgcolor="#FFFFFF">CRCD</td>
     <td height="1%" width="3%" class="text2New" bgcolor="#FFFFFF">ACTV</td>
     <td height="1%" width="3%" class="text2New" bgcolor="#FFFFFF">OWN</td>
     <td height="1%" width="3%" class="text2New" bgcolor="#FFFFFF">LKR</td>
     <td height="1%" width="7.5%" align="right" class="text2New" bgcolor="#FFFFFF">800,000</td>
     <td height="1%" width="7.5%" align="right" class="text2New" bgcolor="#FFFFFF">0</td>
     <td height="1%" width="7.5%" align="right" class="text2New" bgcolor="#FFFFFF">0</td>
     <td height="1%" width="7.5%" align="right" class="text2New" bgcolor="#FFFFFF"><img src="./CRIB Report Number _ W-0043111705_2018_files/spacer.gif"></td>
     <td height="1%" width="7.5%" align="right" class="text2New" bgcolor="#FFFFFF"><img src="./CRIB Report Number _ W-0043111705_2018_files/spacer.gif"></td>
     <td height="1%" width="6%" class="text2New" bgcolor="#FFFFFF">31-Jul-2018</td>
     <td height="1%" width="6%" class="text2New" bgcolor="#FFFFFF">25-Apr-2018</td>
     <td height="1%" width="6%" class="text2New" bgcolor="#FFFFFF"><img src="./CRIB Report Number _ W-0043111705_2018_files/spacer.gif"></td>
     <td height="1%" width="6%" class="text2New" bgcolor="#FFFFFF"><img src="./CRIB Report Number _ W-0043111705_2018_files/spacer.gif"></td>
     <td height="1%" width="6%" class="text2New" bgcolor="#FFFFFF"><img src="./CRIB Report Number _ W-0043111705_2018_files/spacer.gif"></td>
     <td height="1%" width="3%" class="text2New" bgcolor="#FFFFFF">DMND</td>
     <td height="1%" width="4%" class="text2New" bgcolor="#FFFFFF">03:001</td>
     <td height="1%" width="4%" class="text2New" bgcolor="#FFFFFF">US &amp; NG</td>
  </tr>
</tbody>
</table>

在我的 html 中有多个内表。 full html code 为了访问这个 html 文件,我使用了以下 Selenium 代码。

var table = driver.FindElement(By.Id("reportcontainerstyle-Ver2"));
var rows = table.FindElements(By.TagName("tr"));

//To get days arrears details
var mainTable = driver.FindElement(By.Name("ConsumerCreditDetails_Version3"));
var subTables = mainTable.FindElements(By.Id("bandstyle-Ver2"));

for (int i = 0; i < rows.Count; i++)
{
    if (i != 0)//Skip header
    {
        var row = rows[i];
        var rowTds = row.FindElements(By.TagName("td"));

        if ((rowTds[3].Text.Trim().Equals("LOAN") || rowTds[3].Text.Trim().Equals("LEAS") || rowTds[3].Text.Trim().Equals("CRCD") || rowTds[3].Text.Trim().Equals("OVDR")) && rowTds[4].Text.Trim().Equals("ACTV") && rowTds[5].Text.Trim().Equals("OWN"))
        //if(true)
        {

        }

    }
} 

在 HTML 文件中,有 id = bandstyle-Ver2 的表我需要访问第二个表的数据。为了实现我在上面使用的硒代码。但是当我像那个代码一样访问表时。发生此错误。

索引超出范围。必须是非负数且小于 集合。参数名称:索引

谁能告诉我如何访问这些数据。

更新:根据@sers 的回答,我使用了以下代码:

    var rows = driver.FindElements(By.XPath("//table[.//td[normalize-space(.)='Credit Facility (CF) Details']][1]/following-sibling::table[1]//tr[not(@type='table-header')]"));

    foreach (IWebElement row in rows)
    {
        var cfType = row.FindElement(By.XPath("td[4]")).Text.Trim();
        var cfStat = row.FindElement(By.XPath("td[5]")).Text.Trim();

        if ((cfType.Equals("LOAN") || cfType.Equals("LEAS") || cfType.Equals("CRCD") || cfType.Equals("OVDR")) && cfStat.Equals("ACTV") && cfStat.Equals("OWN"))
        {

        }
    }

那我也有问题。我需要访问这些表。这就是HTML part 在这个表中我需要得到每个表的最大数量,如果这个数字> 90 有逻辑。为了实现这一点,我使用了以下代码。

for (int i = 0; i < rows.Count; i++)
{
    if (i != 0)//Skip header
    {
        var row = rows[i];
        var rowTds = row.FindElements(By.TagName("td"));

        if ((rowTds[3].Text.Trim().Equals("LOAN") || rowTds[3].Text.Trim().Equals("LEAS") || rowTds[3].Text.Trim().Equals("CRCD") || rowTds[3].Text.Trim().Equals("OVDR")) && rowTds[4].Text.Trim().Equals("ACTV") && rowTds[5].Text.Trim().Equals("OWN"))
        {
            for (int subTab = 0; subTab < subTables.Count; subTab++)
            {
                if (subTab > 1)
                {
                    var colsDaysArrers = subTables[subTab].FindElements(By.TagName("td"));
                    if (colsDaysArrers.Count > 0)
                    {
                        if (colsDaysArrers[0].Text.Equals(crib.NO.ToString()))
                        {
                            for (int j = 1; j <= colsDaysArrers.Count - 1; j++)
                            {

                                var text = colsDaysArrers[j].Text;
                                if (!(text.Equals("--") || text.Equals("OK") || text.Equals("")))
                                {
                                    var val = double.Parse(text);
                                    if (val > 90)
                                    {
                                        crib.FACILITYARREARSSTATUS = "Irrigular";
                                        break;
                                    }
                                    else
                                    {
                                        crib.FACILITYARREARSSTATUS = "Regular";
                                    }

                                }
                            }

                            break;

                        }
                    }
                }
            }

        }

    }
}

请告诉我这段代码可以这样做吗?或有任何其他方式来做到这一点?

【问题讨论】:

    标签: c# selenium html-table selenium-chromedriver indexoutofrangeexception


    【解决方案1】:

    第一个“信用额度 (CF) 详细信息”表:

    driver.FindElement(By.Xpath("//table[.//td[normalize-space(.)='Credit Facility (CF) Details']][1]/following-sibling::table[1]"));
    

    第二个“信用额度 (CF) 详细信息”表:

    driver.FindElement(By.Xpath("//table[.//td[normalize-space(.)='Credit Facility (CF) Details']][2]/following-sibling::table[1]"));
    

    “已结算信贷融资明细(最近5年)”表:

    driver.FindElement(By.Xpath("//td[normalize-space(.)='Details of Settled Credit Facilities (Last 5 Years)' and @class='tblHeader']/ancestor::table[1]"));
    

    “潜在和流动负债汇总(不包括和解)”表:

    driver.FindElement(By.Xpath("//td[normalize-space(.)='Summary of Potential and Current Liabilities (Excluding Settlements)' and @class='tblHeader']/ancestor::table[2]//table[2]"));
    

    获取除第一个“Credit Facility (CF) Details”表的表头以外的所有行:

    var rows = driver.FindElements(By.Xpath("//table[.//td[normalize-space(.)='Credit Facility (CF) Details']][1]/following-sibling::table[1]//tr[not(@type='table-header')]"));
    
    foreach (IWebElement row in rows)
    {
        var cfType = row.FindElement(By.Xpath(".//td[4]")).Text.Trim();
        var cfStat = row.FindElement(By.Xpath(".//td[5]")).Text.Trim();
    
        if ((cfType.Equals("LOAN") || cfType.Equals("LEAS") || cfType.Equals("CRCD") || cfType.Equals("OVDR")) && cfStat.Equals("ACTV") && cfStat.Equals("OWN"))
        {
            foreach (IWebElement colsDaysArrers in driver.FindElements(By.Xpath("//tr[./td[@class='textbrownNew' and @counter='true']]/td[not(@counter='true')]")))
            {
                var text = colsDaysArrers.Text;
                if (!(text.Equals("--") || text.Equals("OK") || text.Equals("")))
                {
                    if (double.Parse(text) > 90)
                    {
                        crib.FACILITYARREARSSTATUS = "Irrigular";
                        break;
                    }
                    else
                    {
                        crib.FACILITYARREARSSTATUS = "Regular";
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 我应该在哪里应用这个
    • 请检查我的完整 html 文件。希望对你有所帮助,对我有所帮助
    • 我正在使用 C# 先生,我使用 IWebElement 而不是 WebElement 你能告诉我 i 是什么吗?并且没有get 方法。
    • 我犯了几个错误,现在检查一下
    • 非常感谢您的帮助先生,请检查我更新的问题。我用上面的代码来改变你的答案。正如我在更新的问题部分中提到的那样,我还需要从下一张表中获得最大的否决。先生这样好吗?或者请给我一个答案
    【解决方案2】:

    你可以使用下面的 Xpath - (//*[@id='bandstyle-Ver2'])[2]//tr

    这里的数字 2 是表号,你可以有 1 ,3,4 取决于你的要求。

    (//*[@id='bandstyle-Ver2'])[2]//tr[1]/td[1]

    xpath 上方将为您提供第二个表的第一行的 td。

    现在您可以编写一个逻辑来使其具有通用性。

    如果您需要更多解释,请发表评论

    【讨论】:

    • 如果您可以检查我的完整 HTML,请给我一个完整的答案先生,因为我真的很喜欢这个:(
    猜你喜欢
    • 2020-01-12
    • 2020-09-06
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多