问题:C# Selenium:从 html 表中读取行,直到找到最后一行,然后存储在数组中

软件测试 硒2 C#
2022-01-29 17:14:29

以下快照是我在使用 IE Developer 工具查看类和 Id 时看到的。它由一个表格组成,表格内部有链接。我需要读取所有链接名称,并将链接名称存储在字符串数组中。

https://stackoverflow.com/questions/6510758/c-selenium-read-rows-from-html-table-until-the-last-row-is-found-and-store-in

当我使用 Firebug 获取每个链接的 Xpath 时,我得到:

/html/body/table/tbody/tr/td[2]/table/tbody/tr/td[2]/font/a

/html/body/table/tbody/tr/td[2]/table/tbody/tr/td[4]/font/a

/html/body/table/tbody/tr/td[2]/table/tbody/tr[3]/td[2]/font/a

/html/body/table/tbody/tr/td[2]/table/tbody/tr[3]/td[4]/font/a

/html/body/table/tbody/tr/td[2]/table/tbody/tr[5]/td[2]/font/a

/html/body/table/tbody/tr/td[2]/table/tbody/tr[5]/td[4]/font/a

我最初有以下方法,但 QuickWatch 将 arrTopics 显示为 null。它应该给我至少 10 个标签。arrTopics 的值应该类似于 {"Administration", "Banking", "Marketing", ...} 我认为这与我的 xpath (("//a[@class='wlcategoryLinkBold']/ @href")。

 public List<string> Search(ISelenium Sel)    
{        
    Sel.Click(//*[@id="Search_Tab_Search"]);       
    List<string> topics = new List<string>();        
    int se = (int) Sel.GetXpathCount("//a[@class='wlcategoryLinkBold']/@href");
    for (int i = 1; i <= se; i++)
        {
            if (Sel.IsElementPresent("//a[@class='wlcategoryLinkBold']/@href[" + i + "]"))
            {
                string value = Sel.GetSelectedLabel("//a[@class='wlcategoryLinkBold']/@href[" + i + "]");
                topics.Add(value);
            }
        }

        string[] arrTopics = topics.ToArray();
        return arrTopics;    
}

我该如何使用

/html/body/table/tbody/tr/td[2]/table/tbody/tr/td[2]/font/a

/html/body/table/tbody/tr/td[2]/table/tbody/tr/td[4]/font/a

/html/body/table/tbody/tr/td[2]/table/tbody/tr[3]/td[2]/font/a

/html/body/table/tbody/tr/td[2]/table/tbody/tr[3]/td[4]/font/a

/html/body/table/tbody/tr/td[2]/table/tbody/tr[5]/td[2]/font/a

/html/body/table/tbody/tr/td[2]/table/tbody/tr[5]/td[4]/font/a
.
.
.

而不是 Sel.GetXpath() 中的 ("//a[@class='wlcategoryLinkBold']/@href)?我看到我需要另一个循环来处理 tr[3]、tr[5]、时差 [2],时差 [4]。

2个回答

以下是一些潜在的问题:

  • //a[@class='wlcategoryLinkBold']/@href 是指向 href 的 Xpath,而不是指向“a”标签的 Xpath。此外, //a[@class='wlcategoryLinkBold']/@href[i] 是“a”标签的第 i 个 href 的 Xpath,这是没有意义的。我相信你想使用 (//a[@class='wlcategoryLinkBold'][@href])[i].
  • GetSelectedLabel 获取指定选择元素中选定选项的选项标签(可见文本)。您似乎想返回“a”标签的标签,因此您想使用 GetText。

请改用这个:

public List<string> Search(ISelenium Sel)    
{        
    Sel.Click(//*[@id="Search_Tab_Search"]);       
    List<string> topics = new List<string>();        
    int se = (int) Sel.GetXpathCount("//a[@class='wlcategoryLinkBold'][@href]");
    for (int i = 1; i <= se; i++)
        {
           string value = Sel.GetText("(//a[@class='wlcategoryLinkBold'][@href])[" + i + "]");
           topics.Add(value);
        }

    string[] arrTopics = topics.ToArray();
    return arrTopics;    
}

您似乎正在尝试根据字体标签上的属性选择 a 标签。相反,请尝试使用 xpath 选择器//a[@target='SearchFrame']来选择所有链接。您可以使用 Driver.SelectElements 将它们作为IEnumerable<IWebElement>. 抱歉,如果选择器不太正确,我正在手机上尝试此操作,因此无法查看您粘贴的 DOM。

如果您需要 href 本身,只需使用 lambda 表达式进行投影,例如:

query.Select(e => e.GetAttribute<string>("href"));

这将为您提供IEnumerable<string>包含单个 href 的内容。否则,如果您想要链接文本,只需选择

query.Select(e => e.Text);