【问题标题】:SELENIUM - How to count IWebElement in IList<IWebElement> and get the position in the listSELENIUM - 如何计算 IList<IWebElement> 中的 IWebElement 并获取列表中的位置
【发布时间】: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,以及单击的元素会发生什么?有可能被点击的元素在点击改变后变成了其他元素。
  • 查看我的更新:)
  • 很高兴您终于找到了解决方案

标签: c# selenium testing


【解决方案1】:

已找到解决方案:

我实际上可以使用上面的代码,但我需要检查 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;
        }

【讨论】:

    【解决方案2】:

    首先,如果您的元素xpath 类似于//tag[@att='val'],您可以通过(//tag[@att='val'])[n] 访问第n 个元素,其中n 是您的情况下从1 到5 的索引。
    关于验证元素是否被点击,我们需要查看网页。
    有时单击元素会导致该元素属性(通常是类名)发生一些变化,在其他情况下,其他一些元素会发生变化,但在许多其他情况下,单击元素不会发生任何变化。
    所以这个问题没有通用答案,我们必须查看您正在使用的特定页面。

    【讨论】:

    • 这不是我的意思 - 再次查看我的帖子 - 我用示例对其进行了编辑。非常感谢
    猜你喜欢
    • 1970-01-01
    • 2021-12-08
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    相关资源
    最近更新 更多