【问题标题】:Need xpath to locate 2 buttons with almost same properties for using in Selenium automation script需要 xpath 来定位 2 个具有几乎相同属性的按钮,以便在 Selenium 自动化脚本中使用
【发布时间】:2017-08-08 22:14:21
【问题描述】:

这两个按钮的 ID 几乎相似(ID 上的数字可能会更改,因此不可靠) 两者都有相同的课程 他们都居住在同一个父母下 除了跨度没有什么不同

我试图在 Using Selenium 上定位和构建事件的应用程序的所有 UI 元素都类似于下面的部分......

谁能建议我如何使用 xpath 找到这些按钮?

<div id="button-1749" class="x-btn x-box-item x-toolbar-item x-btn-default-toolbar-  small x-noicon x-btn-noicon x-btn-default-toolbar-small-noicon x-item-disabled x-disabled x-btn-disabled x-btn-default-toolbar-small-disabled" style="margin: 0pt; left: 1563px; top: 0px;">
<em id="button-1749-btnWrap" class="">
<button id="button-1749-btnEl" class="x-btn-center" autocomplete="off" role="button"    hidefocus="true" type="button" aria-disabled="true" disabled="">
<span id="button-1749-btnInnerEl" class="x-btn-inner" style="">Delete Selected</span>
<span id="button-1749-btnIconEl" class="x-btn-icon x-hide-display">&nbsp;</span>
</button>
</em>
</div>
<div id="button-1750" class="x-btn x-box-item x-toolbar-item x-btn-default-toolbar-small x-noicon x-btn-noicon x-btn-default-toolbar-small-noicon" style="margin: 0pt; left: 1654px; top: 0px;">
<em id="button-1750-btnWrap" class="">
<button id="button-1750-btnEl" class="x-btn-center" autocomplete="off" role="button"    tabindex="1" hidefocus="true" type="button">
<span id="button-1750-btnInnerEl" class="x-btn-inner" style="">New Title</span>
<span id="button-1750-btnIconEl" class="x-btn-icon x-hide-display">&nbsp;</span>
</button>
</em>
</div>

【问题讨论】:

  • 我找到了我需要的 xpath.. 它的.. //button[contains(@class, "x-btn-center")]/span[./text()='New Title '] 但现在我又被困住了。我有三个嵌套在 3 个不同的 div 下。现在我需要弄清楚如何获取特定 div(具有唯一 ID)的后代

标签: button xpath selenium selenium-webdriver


【解决方案1】:

如果要查找特定div下的元素,可以使用descendent轴。

例子:

//div[@id='your div']/descendant::button[contains(@class, 'x-btn-center')]/span[text()='Delete Selected']"      

这将为您提供 id 为“您的 div”的 div 中的 Deleted Selected 按钮。

【讨论】:

    【解决方案2】:

    您还可以使用 GetElements(与 GetElement 相对),这将返回与您的搜索条件匹配的元素列表。然后,如果按钮出现在页面上的顺序永远不会改变,您可以使用此列表通过关联的索引每次访问您想要的按钮。

    例如。

    ReadOnlyCollection<IWebElement> buttons = driver.FindElements(By.XPath("YOUR XPATH HERE"));
    //If it's the 3rd button that matches your criteria
    buttons[2].Click(); //or whatever you want with this button :)
    

    【讨论】:

    • 我更喜欢使用 Descendants,但你的想法也不错。感谢您的回复。
    【解决方案3】:

    我认为这应该适用于您的情况:

    locator = driver.find_element_by_xpath("//div/em/button/span[contains(text(),'Delete Selected')]")
    

    你可以在另一个元素的情况下做类似的事情。

    【讨论】:

    • 谢谢!我在评论我的第一篇文章时发现了 xpath 部分 (//button[contains(@class, "x-btn-center")]/span[./text()='New Title'])。我遇到的问题是 DOM 中有 3 个这样的按钮,我需要 Justin Ko 上面给出的后代输入
    【解决方案4】:

    尽管根据您的问题,xpath 是一个理想的定位器,但 xpath 和 css 选择器之间存在速度差异,这是一个示例:http://saucelabs.com/blog/index.php/2011/05/why-css-locators-are-the-way-to-go-vs-xpath/。要通过 css 选择器定位这些元素,请使用以下 python 示例

    els = driver.find_elements_by_css_selector("button[id^=button]
    for eachel in els:
       eachel.click()
    

    【讨论】:

    • 我已经在使用 XPath 和 CSS 之间进行了比较,并决定使用 XPATH,因为它更稳定且不太可能改变(至少在我试图自动化的应用程序中)。我希望测试比更快更可靠。感谢您提供有用的链接和回复。
    • 对我来说,我的定位器方法更可靠,因为按钮的 id 可能总是 button[num],xpath 很脆弱,就像你在链中添加另一个元素一样,它也会中断
    【解决方案5】:

    如果两个元素的 xpath 相同,则必须创建自己的 xpath

    driver.findElement(By.xpath("//span[contains(text),'New Title')]")).click;
    

    【讨论】:

      猜你喜欢
      • 2021-01-16
      • 2015-02-25
      • 2021-10-05
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      • 2022-12-14
      • 2021-01-16
      • 1970-01-01
      相关资源
      最近更新 更多