【问题标题】:XPath is broken when changes are made进行更改时 XPath 损坏
【发布时间】:2013-08-23 02:53:12
【问题描述】:

这是当前情况:特定位置有多个文件和文件夹。 将鼠标悬停在文件或文件夹上后,会出现一个图标,然后您可以单击该图标,然后会出现一个菜单。从该菜单中,用户可以选择任何操作(重命名、移动等)。问题在于,每当在该位置创建/添加新文件/文件夹时,FirePath 提供的 XPath 就会损坏。

这是在 XPath 被破坏之前可以正常工作的初始代码行:

webDriver.findElement(By.xpath("//*[@id='main_files_view']/ol/li[6]/ul/li[4]")).click(); 

每当在该位置添加新项目时,值为“6”的索引可以更改为“7”(文件的新位置),生成的 XPath 现在略有不同:

webDriver.findElement(By.xpath("//*[@id='main_files_view']/ol/li[7]/ul/li[4]")).click();

如何更改 XPath 并使其健壮,以便无论添加/删除多少项目,XPath 都不会中断?

下面是与 FirePath 提供的 XPath 相关的 HTML 部分。 提供 XPath 时,最后一个类也会突出显示。

 <li class="storage_item document file_object even ui-draggable" data-thumb-translation="Translated" data-possible-actions="Rename Delete Share Move View" data-file-size="0 bytes" data-item-type="file" data-display-name="solids_A" data-name="solids_A.raas" data-id="bd48453c752043d98afb237b86ee88a3">
    <a class="file_name" href="#/Item/Details?id=bd48453c752043d98afb237b86ee88a3&itemtype=File&tab=Default">
    <img class="file_list_icon" width="16" height="16" src="https://api-staging.autodesk.com/content/gateway/2013.1.307595.626/z/Content/images/fileIcons/small/raas.png"/>
    <div class="name_container">
    <ul class="tools">
        <li class="preview_trigger"/>
        <li class="comment_balloon none has_tooltip" data-tooltip-contents="#comment_balloon_tooltip" data-comments="0">
        <li class="categorize action has_tooltip" data-tooltip="Categories"/>
        <li class="document_tools has_tooltip" data-tooltip="Actions"/>
    </ul>
</li>

我在 Eclipse IDE 上使用 Selenium 2.0。

【问题讨论】:

  • 您能发布更多的 HTML 吗?每个项目的“数据名称”属性是否唯一?
  • @JacekM:是的,每个项目的 data-name 属性都是唯一的。

标签: xpath selenium webdriver selenium-webdriver automated-tests


【解决方案1】:

如果data-name 是唯一的,那么您有

//*[@id='main_files_view']/ol/li[@data-name='solids_A.raas']/ul/li[contains(@class, 'document_tools')]

在这种情况下,Css Selector 甚至比 XPath 更好:

#main_files_view li[data-name='solids_A.raas'] .document_tools

【讨论】:

    【解决方案2】:

    试试这个:

    By.XPath("//*[@id='main_files_view']/ol/li/ul/li[4]")
    

    您不必在 xpath 中定义每个索引,并且通常如果它只是一个更改的索引,则删除该索引将起作用。

    【讨论】:

      【解决方案3】:

      一般来说,您应该在测试中避免使用 xpath。 Css 选择器更快(尤其是在 IE 中)并且更具可读性。如果 data-name 是唯一的,那么这应该可以工作:

      webDriver.findElement(By.cssSelector("#main_files_view li[data-name='solids_A.raas'] li.document_tools"));
      

      如果您真的需要 xpath,user1177636 提供的 xpath 也可以完成这项工作。

      【讨论】:

        猜你喜欢
        • 2014-03-29
        • 1970-01-01
        • 1970-01-01
        • 2012-03-07
        • 2018-12-27
        • 1970-01-01
        • 1970-01-01
        • 2019-10-30
        • 1970-01-01
        相关资源
        最近更新 更多