【发布时间】:2021-07-23 14:13:51
【问题描述】:
我有一个问题,我不知道如何解决...
我在页面上有 5 个完全相同的元素(相同的 div、相同的类、没有 id、相同的内部文本)。所以我可以构建 xpath - Selenium 返回给我的地方 - 带有 IWebElements 的 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 个元素 - 所以我的想法是,我可以得到IWebElements 列表:
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;
}
问题是这不起作用
@Prophet 建议的测试#1: 我将其中一个输入放入 scriptObject.CurrentObject 进行测试,它是否可以工作。在此之前,我尝试对这个对象执行 .Click() 并且它起作用了 - 所以 selenium 可以访问对象。
不幸的是 - 然后我只是试图通过 foreach //input 找到这个元素/对象 - 但找不到对象......
IList<IWebElement> elements = c.FindElements(By.XPath("//input"));
foreach (IWebElement e in elements)
{
if (e == scriptObject.CurrentObject)
{
string x = "OK";
}
}
当我从点击页面中的一个输入接收到元素时执行此操作,然后我尝试再次找到它......但未找到该元素。
有什么建议吗?
【问题讨论】:
-
好的,关于已编辑的问题:这里究竟是什么“不起作用”?
-
它总是返回 -1,因为在列表中找不到该元素 - 但列表包含 5 个相同的元素,如 objID 但是tbh - 我不确定这是否应该工作?如果我收到 objID - 从页面上的 javascript 并将其转换为 IWebElement(这工作正常) - 所以我希望当我通过类似的 IWebElements 时会找到相同的元素......但显然不是....也许我错了...
-
好的,如果是这样,现在你问绝对其他问题。如果是这样,我现在首先要问:您能否通过您的 JS 接收所有 5 个 WebElement,然后通过简单的 element.click() 单击其中一些,然后使用您的循环进行迭代并检查它是否有效?在这种情况下,还可以尝试验证未单击的元素是否都给出了
e == objID,以及单击的元素会发生什么?有可能被点击的元素在点击改变后变成了其他元素。 -
查看我的更新:)
-
很高兴您终于找到了解决方案