Selenium:获取具有相同ID的所有文本

时间:2011-06-30 18:25:08

标签: c# xpath selenium

我想阅读的元素的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

所有元素的ID是

//font[@class='wlCategoryLinkBold']/a

我正在测试的页面类似于以下内容:

enter image description here

我有以下测试方法:

public void ListAllLinksInArray()
    {
        SelObj = new DefaultSelenium("localhost", 4444, "*iexplore", "http://localhost/crm.aspx");
        SelObj.Start();
        SelObj.Open("http://localhost/crm.aspx");            
        SelObj.SelectFrame("content");

        List<string> topics = new List<string>();

        int count = (int)SelObj.GetXpathCount("//font[@class='wlCategoryLinkBold']/a");


        for (int i = 1; i <= count; i++)
        {
            if (SelObj.IsElementPresent("//font[@class='wlCategoryLinkBold']/a"))
            {
                string value = SelObj.GetText("//font[@class='wlCategoryLinkBold']/a[" + i + "]");             topics.Add(value);
            }
        }

        string[] arrTopics = topics.ToArray();

        System.IO.File.WriteAllLines(@"C:\WriteLines.txt", arrTopics);

    }

以上代码仅在文本文件中写入会计(一次)。

如果我这样做:

string value = SelObj.GetText("//font[@class='wlCategoryLinkBold']/a");

我在文本文件中获得了Accounting(4次)。

循环中没有打印文本文件中的所有四个链接有什么问题。提前谢谢!

1 个答案:

答案 0 :(得分:3)

//someElement[$k]

其中$ k是一个正整数,不是你想的那样。

这意味着:

选择XML文档中名为someElement的所有元素,这些元素是其父级的$k个孩子。

但是,从您使用的XPath表达式中的所有a元素开始,所有这些元素似乎都是其父级的第一个也是唯一的子级。这意味着对于不同于1的所有i,XPath表达式不会选择任何内容。

这就是您只选择第一个a的原因。

<强>解决方案

而不是

"//font[@class='wlCategoryLinkBold']/a[" + i + "]"

使用

"(//font[@class='wlCategoryLinkBold']/a)[" + i + "]"

记住:在Xpath中,[]运算符的优先级(优先级)高于//伪运算符。像往常一样,指定不同优先级的方法是使用括号。