Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.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
C# 硒-如何计算IList中的碘元素<;IWebElement>;并获得列表中的位置_C#_Selenium_Testing - Fatal编程技术网

C# 硒-如何计算IList中的碘元素<;IWebElement>;并获得列表中的位置

C# 硒-如何计算IList中的碘元素<;IWebElement>;并获得列表中的位置,c#,selenium,testing,C#,Selenium,Testing,我有一个问题,我不知道如何解决 我在页面上有5个完全相同的元素(相同的div、相同的类、没有id、相同的内部文本)。因此,我可以使用IWebElements构建xpath(Selenium返回给我的地方)IList。 我的目标是遍历这个列表,并“以某种方式”获得我单击的IWebElement 我知道,我可以使用xpath,比如://div[2]作为第二个元素,但问题是——我如何从列表中获取我点击到第二个WebElement的信息? 我能比较一下元素吗?(我尝试过比较GetHas()和比较webe

我有一个问题,我不知道如何解决

我在页面上有5个完全相同的元素(相同的div、相同的类、没有id、相同的内部文本)。因此,我可以使用IWebElements构建xpath(Selenium返回给我的地方)IList。 我的目标是遍历这个列表,并“以某种方式”获得我单击的IWebElement

我知道,我可以使用xpath,比如://div[2]作为第二个元素,但问题是——我如何从列表中获取我点击到第二个WebElement的信息? 我能比较一下元素吗?(我尝试过比较GetHas()和比较webelements,但两者都不起作用)

我想要这样的东西:

  • 用户单击该元素
  • 我的代码决定了它们中有很多
  • 我的代码获取用户单击列表中第n个元素的信息
  • 我的代码将生成xpath->//div[x],其中x是列表中元素的顺序
让我们看看真实的例子-我得到了以下HTML:

<div>
    <div class="admin-nestable-list__item__content page-admin__item__content js-admin-nestable-list-item-content" style="">
        <span>NEW PROPOSED PAGE (copy)</span>
    </div>
    <div class="admin-nestable-list__item__content page-admin__item__content js-admin-nestable-list-item-content" style="">
        <span>NEW PROPOSED PAGE (copy)</span>
    </div>
    <div class="admin-nestable-list__item__content page-admin__item__content js-admin-nestable-list-item-content" style="">
        <span>NEW PROPOSED PAGE (copy)</span>
    </div>
    <div class="admin-nestable-list__item__content page-admin__item__content js-admin-nestable-list-item-content" style="">
        <span>NEW PROPOSED PAGE (copy)</span>
    </div>
    <div class="admin-nestable-list__item__content page-admin__item__content js-admin-nestable-list-item-content" style="">
        <span>NEW PROPOSED PAGE (copy)</span>
    </div>
    <div class="admin-nestable-list__item__content page-admin__item__content js-admin-nestable-list-item-content" style="">
        <span>NEW PROPOSED PAGE (copy)</span>
    </div>
</div>

新建议页(副本)
新建议页(副本)
新建议页(副本)
新建议页(副本)
新建议页(副本)
新建议页(副本)
因此,如果用户单击第三个元素,我可以使用xpath://div/div[3]获取该元素,但我需要不同的方式:

我单击第3个元素并将该元素作为IWebElement对象获取-现在如果我想以编程方式生成xpath-我需要知道,我已经单击了第3个元素-因此我的想法是,我可以获取IWebElement列表:

private int GetTheOrderOfTheElement(string xpath, IWebElement objID)
        {
            IList<IWebElement> el = driver.FindElements(By.XPath(xpath));
            int c = 0;
            foreach(IWebElement e in el)
            {
                if (e == objID) return c;
                c++;
            }


            return -1;
        }
private int-gettheOrderOfeElement(字符串xpath,IWebElement-objID)
{
IList el=driver.FindElements(By.XPath(XPath));
int c=0;
foreach(el中的IWebElement e)
{
如果(e==objID)返回c;
C++;
}
返回-1;
}
问题是这不起作用

测试#1如@Prophet建议的: 我将其中一个输入放入scriptObject.CurrentObject进行测试,看它是否可以工作。在此之前,我已经对这个对象执行了trie.Click()操作,它成功了,所以selenium可以访问这个对象

不幸的是-然后我只是试图通过foreach//input找到这个元素/对象-但是没有找到这个对象

                    IList<IWebElement> elements = c.FindElements(By.XPath("//input"));
                    foreach (IWebElement e in elements)
                    {
                        if (e == scriptObject.CurrentObject)
                        {
                            string x = "OK";
                        }
                    }
IList elements=c.FindElements(By.XPath(“//input”);
foreach(元素中的IWebElement e)
{
if(e==scriptObject.CurrentObject)
{
字符串x=“确定”;
}
}
这是在我从点击页面中的一个输入接收到元素时执行的,然后我尝试再次找到它。。。并且找不到该元素


有什么建议吗?

首先,如果您的元素
xpath
类似于
//tag[@att='val']
,您可以通过
(//tag[@att='val'])[n]
访问第n个元素,其中
n
是您案例中从1到5的索引。
关于验证单击的元素,我们需要查看网页。
有时,单击元素会导致该元素属性(通常是类名)发生一些更改,而在其他情况下,某些其他元素会发生更改,但在许多其他情况下,单击元素不会更改任何内容。

因此,这个问题没有一般性的答案,我们必须查看您正在使用的特定页面。

已找到解决方案:

实际上,我可以使用上面的代码,但我需要检查HasCode,而不是对象本身:

private int GetTheOrderOfTheElement(string xpath, IWebElement objID)
        {
            IList<IWebElement> el = driver.FindElements(By.XPath(xpath));
            int c = 0;
            foreach (IWebElement e in el)
            {
                if (e.GetHashCode() == objID.GetHashCode()) return c;
                c++;
            }


            return -1;
        }
private int-gettheOrderOfeElement(字符串xpath,IWebElement-objID)
{
IList el=driver.FindElements(By.XPath(XPath));
int c=0;
foreach(el中的IWebElement e)
{
如果(e.GetHashCode()==objID.GetHashCode())返回c;
C++;
}
返回-1;
}

这并不是我的意思-请再次查看我的帖子-我用示例编辑了这篇文章。谢谢大家,关于编辑后的问题:这里到底是什么“不起作用”?它总是返回-1,因为在列表中找不到元素-但是列表包含5个相同的元素,比如objID,但是tbh-我不确定这是否起作用?如果我从页面上的javascript接收到objID,并将其转换为IWebElement(这很好),那么我希望当我遍历类似的IWebElement时会找到相同的元素。。。。但显然不是。。。。也许我错了……好吧,如果是这样的话,现在你问的完全是另一个问题。如果是这样的话,我现在首先要问:你能通过JS接收所有的5个WebElement吗?然后单击simply element.click()并迭代你的循环并检查它是否有效?在本例中,还要尝试验证未单击的元素是否都给出了
e==objID
,以及单击的元素会产生什么结果?单击更改后,单击的元素可能会变成其他元素。请参阅我的更新:)我很高兴您终于找到了解决方案