【问题标题】:How to Handle Dynamically Changing ID in Selenum如何在 Selenium 中处理动态更改的 ID
【发布时间】:2014-03-17 20:45:15
【问题描述】:

我有一个下拉菜单,点击后会更改其 ID

这是点击之前的 HTML 代码(此代码在页面中显示为灰色 {hidden})。

 <a class="headet_fonts" href="http://192.168.1.6/eprint_prod_3.8/ProductCatalogue/PriceCatalogue.aspx" onmouseout="javascript:displaynone('#FFFFFF');" onmouseover="javascript:onhovermenu('ProductCatalogue/PriceCatalogue.aspx','Products','Products',tabcolor,headerforecolor)">
  <b>
    <span id="**ctl00_header1_upperRepeater_ctl10_ModuleName**" class="headet_fonts header_colorbalck" style="color:black;">
      Products
    </span>
    <input id="ctl00_header1_upperRepeater_ctl10_hdn_Forecolor" type="hidden" value="#FFFFFF" name="ctl00$header1$upperRepeater$ctl10$hdn_Forecolor">
  </b>
</a>

点击后的HTML代码(此代码未隐藏):

<a class="headet_fonts" href="http://192.168.1.6/eprint_prod_3.8/ProductCatalogue/PriceCatalogue.aspx" onmouseout="javascript:displaynone('#FFFFFF');" onmouseover="javascript:onhovermenu('ProductCatalogue/PriceCatalogue.aspx','Products','navbar',tabcolor,'#FFFFFF')">
  <b>
    <span id="ctl00_header1_upperRepeater_ctl10_ActiveModuleName" class="ActiveModulenavigatorpanel" style="color:#FFFFFF;">
      Products
    </span>
  </b>
</a>

在 Selenium 代码中我使用了 xpath:

//div[@id='Products']/a/b/span

找到它,但它显示NoSuchElementException。我不能使用 ID,因为它正在改变

【问题讨论】:

  • @Santosh:请确保在发布之前正确格式化问题发布内容。

标签: java html selenium xpath selenium-webdriver


【解决方案1】:

只需使用不同的 xpath,您不仅限于显示的那个。

可以使用xpath的contains()函数,例如:

//span[contains(@id, 'ctl00_header1_upperRepeater_ctl10')]

或者尝试通过a标签选择span

//a[@class=='headset_fonts']//span
//a[contains(@href, 'ProductCatalogue/PriceCatalogue.aspx')]//span

要开发这些 xpath,请使用能立即显示结果的工具(例如 Firefox 的 XPath Checker 插件)。这样你应该很快就能找到一个可以工作的 xpath。

【讨论】:

  • 运行 selenium 脚本 org.openqa.selenium.NoSuchElementException 时出现此错误:无法找到元素:{"method":"id","selector":"//a[contains( @href, 'ProductCatalogue/PriceCatalogue.aspx')]//span"} 命令持续时间或超时:1.06 秒
  • 正如我所说,不要在 selenium 上开发 xpath。首先使用 XPather、Xpath Checker 或任何您喜欢的工具获取一个有效的 xpath,然后将其插入到您的代码中。
【解决方案2】:

从 html 中我们可以得出结论,锚标记将在 onmouseover 事件中可见。所以你只需要使用Actionmovetoelement()方法将鼠标悬停在标题上。然后使用findElement()

xpath = //div[@id='Products']//span[contains(.,'Products')]

因为它在一个锚标签中,你也可以使用linkText

driver.findElement(By.linkText("Products")).click();

一个更简单的方法是使用JavascripExecuter,使用它你不必悬停使元素可见,因为这也适用于隐藏元素,虽然我不推荐这个(原因 - 用户不会单击隐藏的元素)。以下脚本仅供您了解:

((JavascriptExecutor)driver).executeScript("$('div#Products span').click();");

【讨论】:

    【解决方案3】:

    我只是提供这个作为替代方案:使用 CSS not xpath。 CSS 更干净、更简单、更快。

    span[id^='ctl00_header1_upperRepeater']
    

    我不能容忍其他答案。 Xpath 对于这种口径的东西来说是复杂且不必要的。

    【讨论】:

      猜你喜欢
      • 2014-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-20
      • 2010-09-19
      • 1970-01-01
      • 2018-06-29
      • 2021-10-08
      相关资源
      最近更新 更多