Selenium获得动态ID XPath

时间:2010-11-15 10:41:11

标签: dynamic xpath selenium count

我是Selenium的新人,新来的,我的英语不是最好的。

我正在使用selenium和.NET ...

我有一个像这样的HTML页面,但事件的数量是不同的:

<div id="eventContent" style="text-align: center;">
       <div class="event" id="event-8971062">
            <ul>
                <li ...></li>
                <li ...></li>
                <li ...></li>
            </ul>
       </div>                    
       <div class="event odd" id="event-9224880">
            <ul>
                <li ...></li>
                <li ...></li>
                <li ...></li>
            </ul>
        </div>          
</div>

我需要检查不同div中的所有数据,但计数是动态的,而(事件)id也是动态的。我试图找出div的计数,但这不起作用。为此,我试试这个:

DefaultSelenium selenium = new DefaultSelenium(...);
decimal count = selenium.GetXpathCount("//div[@id='eventContent']");

但是这个例子只有1个而不是两个。

当我尝试:

Console.WriteLine(selenium.GetText("//div[@id='eventContent'][1]"));

它会打印所有div,但是当我这样做时:

Console.WriteLine(selenium.GetText("//div[@id='eventContent'][1]/div"));

它只打印第一个div,我不明白为什么。 有人可以这么善良,并告诉我这里发生什么,我错了吗?

提前致谢 elur

2 个答案:

答案 0 :(得分:6)

decimal count = selenium.GetXpathCount("//div[@id='eventContent']");

这将返回div id eventContent的{​​{1}}的数量 - 这样只有一个div,这就是为什么你会得到1(计数变量通常是int而不是decimal s,顺便提一下。

如果您想要包含 div的计数,请使用

int count = selenium.GetXpathCount("//div[@id='eventContent']/div");

这将计算div div id的{​​{1}} 孩子的数量。这应该根据需要返回2.

至于您的eventContent示例,我认为GetText只会返回xpath参数选择的 first 节点的文本。所以用

GetText

您可以获得 selenium.GetText("//div[@id='eventContent'][1]") 的完整文本,该文本自然包含所有子div,但

div

您只能获得第一个selenium.GetText("//div[@id='eventContent'][1]/div") 的文字。我相信,此xpath选择所有子div,但div仅对单个元素进行操作。如果您想依次检查每个孩子GetText的文字,您需要首先获得孩子div的计数,然后使用div循环来获取每个孩子for转:

for(int i = 1; i <= count; ++i)
{
    string childXpath = "//div[@id='eventContent']/div[" + i + "]";
    string eventText = selenium.GetText(childXpath);

    // Processing of eventText
}

这里需要for循环和手动xpath处理(而不是neater foreach),因为我相信Selenium没有办法获取xpath并返回元素集合。

答案 1 :(得分:0)

尝试了这个但是返回0.我用一个while表达式解决了这个问题,我用isElementPresent检查了这个:

int a = 1;
while (selenium.IsElementPresent("//div[@id='eventContent'][1]/div[" + a + "]"))
{
    // check data here
    a++;
}

似乎是这样的。非常感谢你的帮助, 最好的问候elur