【问题标题】:Writing XPath for elements which have no ID or Name in Selenium在 Selenium 中为没有 ID 或名称的元素编写 XPath
【发布时间】:2013-09-05 17:45:24
【问题描述】:

我正在尝试自动测试代码...好吧,编写时没有考虑测试(许多元素上没有 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”类的“Title”

【问题讨论】:

    标签: xpath selenium


    【解决方案1】:

    类似于:

    1. //div[@id="top-level-menu-item-3"]/div[@class="filter-label"]
    2. //div[@id="top-level-menu1"] --- 并检查显示代码:无 ...假设您使用的是 selenium rc

    更新:还请务必安装以下 firefox 插件,在站点上尝试不同的 xpath 表达式时非常有用https://addons.mozilla.org/en-US/firefox/addon/1095

    【讨论】:

    • 这是正确的,但根据我的经验,您需要更正 xpath 语法才能使其实际工作,xpath=//div[@id="top-level-menu-item-3"]/ div[@class="filter-label"]
    • @j pimmel thx,更新了它 - 这是正确的,因为 @ 用于属性:)
    【解决方案2】:

    附带说明:尽可能避免在 Selenium 中使用 xpath 定位器。如果您有一个较长的 xpath 表达式,与使用其唯一 ID 识别它相比,Selenium 查找元素的速度可能会慢 20 倍。当然,有时除了使用 xpath 之外别无他法。但是,当您使用它时,请尽量减少 '//' 表达式 - 这是真正的性能杀手。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 是的,确实如此,但看起来无法使用:/html/body/div/div[3]/div/table/tbody/tr/td/div[3]/div[2]/ div[16]/div/div
      【解决方案4】:

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

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

      XPathFinder.Find.Tag("div").With.Attribute("id", "top-level-menu-item-3").And.Child("div").With.Attribute("class ", "过滤标签").ToXPathExpression();

      这将产生以下 xpath: "//div[@id='top-level-menu-item-3']/div[@class='filter-label']"

      查看 http://code.google.com/p/xpathitup/

      【讨论】:

        【解决方案5】:

        您可以使用可以通过 firebug 安装的 firepath(都是 firefox 插件)。当你得到一个 xpath 时,不要忘记在使用它之前附加//。无论是在代码中还是在 selenium IDE 中。您没有附加它,这就是它无法使用的原因。 xpath 有绝对和相对两种类型。如果你使用 absolute 那么它会处理动态 id。但是如果你使用 relative 它会在每次运行时中断。

        【讨论】:

        • @Igor:selenium IDE 为您提供了 xpath:position 的选项。这会尽可能地破坏 xpath。这肯定会提高性能。它不易受到动态 ID 损坏的影响。
        猜你喜欢
        • 2021-04-24
        • 2021-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-03
        • 1970-01-01
        • 2021-04-28
        相关资源
        最近更新 更多