为Selenium中没有ID或名称的元素编写XPath

时间:2009-03-26 23:35:10

标签: xpath selenium

我正在尝试自动化代码测试......好吧,编写时没有考虑测试(许多元素上没有ID,以及许多具有相同类名的元素)。我将不胜感激任何帮助(问题在代码下面):

<div id="author-taxonomies" class="menu-opened menu-hover-opened-inactive" onmouseover="styleMenuElement(this)" onmouseout="styleMenuElement(this)" onclick="toggleSFGroup(this)">Author</div>
<div id="author-taxonomies-div" class="opened">
    <div id="top-level-menu" class="opened">
        <div id="top-level-menu-item-1" class="as-master">
            <div class="filter-label"> Name</div>
        </div>
        <div id="top-level-menu-item-1" class="as-slave"
            style="top: 525px; left: 34px; z-index: 100; display: none;"> </div>
        <div id="top-level-menu-item-2" class="as-master">
            <div class="filter-label">Title</div>
        </div>
        <div id="top-level-menu-item-2" class="as-slave">
            <div id="top-level-menu-item-2" class="as-slave-title as-slave-title-subgroup"
                >Title</div>
            <div id="top-level-menu-item-2" class="as-slave-body"> </div>
            <div class="as-slave-buffer"> </div>
        </div>
        <div id="top-level-menu-item-3" class="as-master">
            <div class="filter-label">Location</div>
        </div>
        <div id="top-level-menu-item-3" class="as-slave"> </div>
    </div>
</div>

问题是:如何使用xPath表达式引用此菜单的特定标签和属性?例如,如果我想:

  1. 验证“位置”标签是否存在
  2. 检查目前看不到“as-slave”类的“标题”

5 个答案:

答案 0 :(得分:4)

它类似于:

  1. // DIV [@ ID = “顶级菜单项目-3”] /格[@类= “过滤器标签”]
  2. // div [@ id =“top-level-menu1”] ---并检查代码显示:无...假设它是你正在使用的selenium rc
  3. 更新:还要确保安装以下firefox插件,在网站https://addons.mozilla.org/en-US/firefox/addon/1095上尝试不同的xpath表达式时非常有用

答案 1 :(得分:3)

作为旁注:尽可能避免在Selenium中使用xpath定位器。如果你有一个很长的xpath表达式,那么与使用其唯一ID识别元素相比,Selenium找到元素的速度可能会慢20倍。当然,有时候除了使用xpath之外别无选择。但是,当你使用它时,将'//'表达式保持在最小 - 这是一个真正的性能杀手。

答案 2 :(得分:2)

如果您刚开始使用Selenium,请下载适用于Firefox的selenium add-on。当您单击DOM元素时,Selenium会显示访问它的xpath。

答案 3 :(得分:2)

我目前正在开发一个开源库,用于通过流畅的.Net API生成xpath表达式。我们的想法是能够生成基于xpath的selenium定位器而无需知道xpath。

以下是一个如何在您的案例中使用库的示例:

XPathFinder.Find.Tag(“div”)。With.Attribute(“id”,“top-level-menu-item-3”)。And.Child(“div”)。With.Attribute(“class” “,”filter-label“)。ToXPathExpression();

这将产生以下xpath: “// DIV [@ ID = '顶级菜单项目-3'] /格[@类= '过滤器标签']”

检查出来 http://code.google.com/p/xpathitup/

答案 4 :(得分:0)

您可以使用可以安装在firebug上的firepath(两个firefox插件)。当你得到一个xpath时,不要忘记在使用之前附加//。在代码或selenium IDE中。你没有附加它,这就是为什么它无法使用。 xpath绝对和相对有两种类型。如果你使用绝对值,它将处理动态id。但如果你使用亲戚,它会在每次运行时中断。