Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dynamic Selenium获取动态ID XPath_Dynamic_Xpath_Selenium_Count - Fatal编程技术网

Dynamic Selenium获取动态ID XPath

Dynamic Selenium获取动态ID XPath,dynamic,xpath,selenium,count,Dynamic,Xpath,Selenium,Count,我对Selenium是新来的,而且我的英语不是最好的 我正在将selenium与.NET一起使用 我有一个类似这样的HTML页面,但事件的数量不同: <div id="eventContent" style="text-align: center;"> <div class="event" id="event-8971062"> <ul> <li ...></li>

我对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>
但对于这个例子,结果只有1个,而不是2个

当我尝试时:

Console.WriteLine(selenium.GetText("//div[@id='eventContent'][1]"));
它打印所有div,但当我打印时:

Console.WriteLine(selenium.GetText("//div[@id='eventContent'][1]/div"));
它只打印第一个div,我不明白为什么。 有人能这么好,给我解释一下这里发生了什么,我错在哪里

提前谢谢 艾露尔

这将返回id为
eventContent
div
s的计数-只有一个
div
像这样,这就是为什么计数为1(顺便说一句,计数变量通常是
int
s,而不是
decimal
s)

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

int count = selenium.GetXpathCount("//div[@id='eventContent']/div");
这将统计
div的
div
子级的数量,其
id
eventContent
。根据需要,这应该返回2

至于您的
GetText
示例,我认为
GetText
将只返回xpath参数选择的第一个节点的文本。所以

selenium.GetText("//div[@id='eventContent'][1]")
您将获得父级
div
的整个文本,该文本自然包含所有子级
div
s,但带有

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

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

    // Processing of eventText
}

for(int i=1;i尝试此操作,但返回0。我使用while表达式解决了此问题,其中我使用isElementPresent进行检查,如下所示:

int a = 1;
while (selenium.IsElementPresent("//div[@id='eventContent'][1]/div[" + a + "]"))
{
    // check data here
    a++;
}
看起来很有效。非常感谢你的帮助,
向elur致意

我总是忘记xpath索引是基于1而不是基于0的。编辑了我的示例,该示例现在应该与您的
while
循环相同。
for(int i = 1; i <= count; ++i)
{
    string childXpath = "//div[@id='eventContent']/div[" + i + "]";
    string eventText = selenium.GetText(childXpath);

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