我想阅读的元素的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
我正在测试的页面类似于以下内容:
我有以下测试方法:
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次)。
循环中没有打印文本文件中的所有四个链接有什么问题。提前谢谢!
答案 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中,[]
运算符的优先级(优先级)高于//
伪运算符。像往常一样,指定不同优先级的方法是使用括号。