Selenium获得动态ID XPath

elu*_*lur 4 selenium xpath dynamic 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>
Run Code Online (Sandbox Code Playgroud)

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

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

但是这个结果只带来1而不是两个.

当我尝试:

Console.WriteLine(selenium.GetText("//div[@id='eventContent'][1]"));
Run Code Online (Sandbox Code Playgroud)

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

Console.WriteLine(selenium.GetText("//div[@id='eventContent'][1]/div"));
Run Code Online (Sandbox Code Playgroud)

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

在此先感谢elur

Aak*_*shM 6

decimal count = selenium.GetXpathCount("//div[@id='eventContent']");
Run Code Online (Sandbox Code Playgroud)

这将返回的数量div有一个s ideventContent-只有一个div这样的,这就是为什么你得到的1计数(计数变量通常是int做得相当不是decimalS,顺便说一句).

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

int count = selenium.GetXpathCount("//div[@id='eventContent']/div");
Run Code Online (Sandbox Code Playgroud)

这将计数的数div 孩子divideventContent.这应该根据需要返回2.

至于你的GetText例子,我认为GetText只会返回xpath参数选择的第一个节点的文本.所以

selenium.GetText("//div[@id='eventContent'][1]")
Run Code Online (Sandbox Code Playgroud)

你得到父母 的整个文本div,它自然包含所有的孩子div,但是

selenium.GetText("//div[@id='eventContent'][1]/div")
Run Code Online (Sandbox Code Playgroud)

你只得到第一个孩子的文字div.我相信div,这个xpath选择所有的子节点,但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
}
Run Code Online (Sandbox Code Playgroud)

一个for都是必须的循环和手动的XPath处理(而不是整洁foreach),我相信硒没有采取一个XPath和返回元素集合的方式.