【问题标题】:How to identify an element whose id is dynamically changing and has no other attributes in selenium?如何识别 id 动态变化且在 selenium 中没有其他属性的元素?
【发布时间】:2018-10-08 15:51:51
【问题描述】:

我有一个剑道下拉列表的 html 正文,它只有一个属性,即动态变化的 id,我如何在每次页面刷新时准确识别这个对象。 对于其他下拉菜单,类和选项卡索引等其他属性已经在同一页面上多次出现相同的值-

<span role="listbox" unselectable="on" class="k-dropdown-wrap k-state-default" id="dde13a91-2bf3-4e41-af72-bee1b881a8d9" dir="ltr" readonly="false" tabindex="0" aria-disabled="false" aria-readonly="false" aria-haspopup="true" aria-expanded="false" aria-owns="48f666d8-4c3c-43a8-a4dc-8e7a9961a0ef" aria-activedescendant="ca3c4431-3ebf-46c0-9510-a64a32eae108-C.US.0000110896">
            <span unselectable="on" class="k-input">
               <!---->
               <!---->2018 ALBERTSONS / Beverage Mixes
           </span>
           <span unselectable="on" class="k-select">
               <span class="k-i-arrow-s k-icon"></span>
           </span>
           <!---->
        </span>

【问题讨论】:

  • 您可以使用 List 使用 XPath 将所有元素存储到列表中
  • @chinmayraskar 您使用的是哪种Selenium 语言绑定艺术Java / Python / C# / NodeJS ?
  • 如果您可以用英语解释您将如何查看 HTML 页面并确定要检索的元素,那么我们可以帮助您将英语描述翻译成 XPath。如果您不能告诉我们您使用什么标准来识别正确的元素,那么我们将无法帮助您。

标签: selenium selenium-webdriver xpath css-selectors webdriverwait


【解决方案1】:

如果下拉列表中有一个始终存在的值,您可以尝试通过文本或其他方式找到该值,然后获取父级: XPath: Get parent node from child node

其他方法是通过结构的 xpath 获取它,例如:div[3]/.../span 等。这不好,因为每次更改都可能使您的测试失败,但是如果您没有其他选择,那么您可能想试试这个。

【讨论】:

  • 感谢您的解决方案,但下拉列表中的值是隐藏的,只有当用户在运行时选择特定值时才可见。因此,不可能从子节点或任何相关引用跟踪它。
【解决方案2】:

要单击具有唯一属性文本为 2018 ALBERTSONS / Beverage Mixes 的元素,您需要诱导 WebDriverWait 以使 元素可单击 em>,您可以使用以下解决方案:

  • (Java)xpath:

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//span[@class='k-dropdown-wrap k-state-default' and @role='listbox']//span[@class='k-input']"))).click();
    

【讨论】:

  • 试过了,但元素没有被点击。
  • 元素 ... 在点 (45, 92) 处不可点击。其他元素会收到点击:
    ...
【解决方案3】:

我找到了一种解决方法来定位元素:

首先使用下面的文本获取下拉列表中 span 标签的 xpath: //文本()[包含(.,'2018')] 因为'2018'很常见,与相邻文本无关

然后向上移动到下拉列表的父标签以找到可以在单击时折叠的下拉框: //text()[contains(.,'2018')]/parent::/parent::

然后只需单击所在的元素。 driver.findElement(By.xpath("//text()[contains(.,'2018 ')]/parent::/parent::")).click();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 2016-06-19
    • 2022-01-26
    • 2023-03-20
    • 2020-09-14
    相关资源
    最近更新 更多