如何处理Selenium中动态更改的ID

时间:2014-03-17 04:40:13

标签: java html selenium xpath selenium-webdriver

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

enter image description here

以下是点击之前的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,因为它正在改变

3 个答案:

答案 0 :(得分:1)

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

您可以使用xpath&#39; contains()函数,例如:

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

或尝试通过span标记选择a

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

要开发这些xpath,请使用能够立即显示结果的内容(例如Firefox的XPath Checker插件)。这样你应该快速到达一个工作的xpath。

答案 1 :(得分:1)

从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();");

答案 2 :(得分:1)

我只提供此选项:使用 CSS 而不是 xpath。 CSS更干净,更简单,更快。

span[id^='ctl00_header1_upperRepeater']

我无法宽恕其他答案。 Xpath很复杂,对于这种能力来说是不必要的。