【问题标题】:C# Watin is returning TD with null dataC# Watin 正在返回带有空数据的 TD
【发布时间】:2012-03-08 03:44:22
【问题描述】:

我正在使用 Watin 从密码同步页面检索数据。我期望值被返回。如果值为 &nbsp(在 HTML 代码中),则可能为 null。

但我得到了一些更意想不到的东西

{string[4, 4]}
[0, 0] = null
[0, 1] = "MAINFRAME"
[0, 2] = "DOMAIN"
[0, 3] = "WebClient"
[1, 0] = null
[1, 1] = "INTERNALID"
[1, 2] = "FIRSTNAME.LASTNAME"
[1, 3] = "INTERNALID"
[2, 0] = null
[2, 1] = "Yes"
[2, 2] = "Yes"
[2, 3] = "Yes"
[3, 0] = null
[3, 1] = ""
[3, 2] = ""
[3, 3] = ""

HTML 代码如下所示

<TABLE WIDTH="100%" CELLSPACING=0 CELLPADDING=5 BORDER=0 class="TABLEBORDER">
<TR>

<TH class=HEADTEXT>
Target
</TH>
<TH class=HEADTEXT>
Trigger<br>enabled?
</TH>
<TH class=HEADTEXT>
Account
</TH>
<TH class=HEADTEXT>
Password<br>changed?

</TH>
<TH class=HEADTEXT>
Error message<br>(if any)
</TH>
<!-- S_STATUS_ROW -->

<TR>

<TD valign=top class=CELLTEXT>
MAINFRAME
</TD>
<TD valign=top class=CELLTEXT>
No
</TD>
<TD valign=top class=CELLTEXT>
INTERNALID
</TD>
<TD valign=top class=CELLTEXT>
Yes
</TD>
<TD valign=top class=CELLTEXT>
&nbsp;

</TD>
<!-- S_STATUS_ROW -->

<TR>

<TD valign=top class=CELLTEXT>
DOMAIN
</TD>
<TD valign=top class=CELLTEXT>
No
</TD>
<TD valign=top class=CELLTEXT>
FIRSTNAME.LASTNAME
</TD>
<TD valign=top class=CELLTEXT>
Yes
</TD>
<TD valign=top class=CELLTEXT>
&nbsp;

</TD>
<!-- S_STATUS_ROW -->

<TR>

<TD valign=top class=CELLTEXT>
WebClient
</TD>
<TD valign=top class=CELLTEXT>
No
</TD>
<TD valign=top class=CELLTEXT>
INTERNALID
</TD>
<TD valign=top class=CELLTEXT>
Yes
</TD>
<TD valign=top class=CELLTEXT>
&nbsp;

</TD>
<!-- S_STATUS_CONTENT_BOTTOM -->
</TABLE>

最后是有问题的 C# 代码。

        String path = "http://localhost/cgi.exe?ID=" + userName;
        Int32 startingRow = 1;

        using (var browser = new IE(path)) 
        {
            try
            {
                browser.Image(Find.ByAlt("Use a password")).Click();
                browser.TextField(Find.ByName("_MYPW")).TypeText(privateCurrentPassword);
                browser.Image(Find.ByAlt("Verify password")).Click();
                browser.Link(Find.ByTitle("Change passwords")).Click();
                browser.TextField(Find.ByName("_NEWP1")).TypeText(privateNewPassword);
                browser.TextField(Find.ByName("_NEWP2")).TypeText(privateNewPassword);
                browser.Image(Find.ByName("SUBMIT-CHANGE")).Click();
                Table table = browser.Table(Find.ByClass("TABLEBORDER"));
                Int32 numberOfColumn = table.TableRows[startingRow].TableCells.Count;
                Int32 currentRow = startingRow;
                td1stcolumn = new String[table.OwnTableRows.Count];
                td2ndcolumn = new String[table.OwnTableRows.Count];
                td3rdcolumn = new String[table.OwnTableRows.Count];
                td4thcolumn = new String[table.OwnTableRows.Count];

                for (int i = 1; i < table.OwnTableRows.Count; i++)
                {
                    td1stcolumn[i] = table.OwnTableRows[i].TableCells[0].Text.Trim();
                    td2ndcolumn[i] = table.OwnTableRows[i].TableCells[2].Text.Trim();
                    td3rdcolumn[i] = table.OwnTableRows[i].TableCells[3].Text.Trim();
                    td4thcolumn[i] = table.OwnTableRows[i].TableCells[4].Text.Trim();
                }
                String[,] arrayOfStrings = new String[4,td1stcolumn.Length];

                for(int j = 0; j < td1stcolumn.Length; j++)
                {
                    arrayOfStrings[0,j] = td1stcolumn[j];
                    arrayOfStrings[1,j] = td2ndcolumn[j];
                    arrayOfStrings[2,j] = td3rdcolumn[j];
                    arrayOfStrings[3,j] = td4thcolumn[j];
                }

                string resultDialogString = ResultDialog.ShowBox(arrayOfStrings, "Result Page", passwordTextBox.Text.ToString().Trim());
            }
            catch (ElementNotFoundException enfe)
            {
                String error = enfe.Message.ToString();
                browser.TextField(Find.ByName("_MYPW")).TypeText(privateCurrentPassword);
                browser.Image(Find.ByAlt("Verify password")).Click();
                browser.Link(Find.ByTitle("Change passwords")).Click();
                browser.TextField(Find.ByName("_NEWP1")).TypeText(privateNewPassword);
                browser.TextField(Find.ByName("_NEWP2")).TypeText(privateNewPassword);
                browser.Image(Find.ByName("SUBMIT-CHANGE")).Click();
                Table table = browser.Table(Find.ByClass("TABLEBORDER"));
                Int32 numberOfColumn = table.TableRows[startingRow].TableCells.Count;
                Int32 currentRow = startingRow;
                td1stcolumn = new String[table.OwnTableRows.Count];
                td2ndcolumn = new String[table.OwnTableRows.Count];
                td3rdcolumn = new String[table.OwnTableRows.Count];
                td4thcolumn = new String[table.OwnTableRows.Count];

                for (int i = 1; i < table.OwnTableRows.Count; i++)
                {
                    td1stcolumn[i] = table.OwnTableRows[i].TableCells[0].Text.Trim();
                    td2ndcolumn[i] = table.OwnTableRows[i].TableCells[2].Text.Trim();
                    td3rdcolumn[i] = table.OwnTableRows[i].TableCells[3].Text.Trim();
                    td4thcolumn[i] = table.OwnTableRows[i].TableCells[4].Text.Trim();
                }
                String[,] arrayOfStrings = new String[4, td1stcolumn.Length];

                for (int j = 0; j < td1stcolumn.Length; j++)
                {
                    arrayOfStrings[0, j] = td1stcolumn[j];
                    arrayOfStrings[1, j] = td2ndcolumn[j];
                    arrayOfStrings[2, j] = td3rdcolumn[j];
                    arrayOfStrings[3, j] = td4thcolumn[j];
                }
                string resultDialogString = ResultDialog.ShowBox(arrayOfStrings, "Result Page", passwordTextBox.Text.ToString().Trim());
            }
        }

【问题讨论】:

    标签: c# .net c#-4.0 html-parsing watin


    【解决方案1】:

    这里的问题是什么?你期望得到什么?你得到的一切都可以很简单地解释,我会尝试解决一些明确的问题。

    首先,你得到的空值是因为

    tdNstcolumn = new String[table.OwnTableRows.Count];
    

    和循环

    for (int i = 1; i < table.OwnTableRows.Count; i++)
    

    i = 1 开头,这意味着 tdNstcolumn 的第一个(索引 0)永远不会被填充,因此为 null(当复制到 arrayOfStrings 时,循环以 j = 0 开头)。

    你得到的“”(空字符串)值来自

    <TD valign=top class=CELLTEXT>
    &nbsp;
    
    </TD>
    

    nbsp,根据定义,它是一个不可破坏的空间 - 即“”,由您对 Trim() 的调用修剪 Trim 函数修剪的内容不仅仅是“”,它修剪每个被认为是空格的字符 -> 新行也是一个空格(参见:http://msdn.microsoft.com/en-us/library/t809ektx.aspx

    我希望一切都清楚

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-10
      • 2011-06-04
      • 2022-08-10
      • 1970-01-01
      • 2022-12-09
      • 1970-01-01
      相关资源
      最近更新 更多