【问题标题】:Watir-Webdriver - how to differentiate the buttons if there are more than one with same propertiesWatir-Webdriver - 如果有多个具有相同属性的按钮,如何区分按钮
【发布时间】:2015-09-01 00:33:30
【问题描述】:

这个查询基于我之前的问题Watir-Webdriver - Unable to locate a button with id, name, text, value,我得到了一些关于如何通过元素获取字段的详细信息。但是现在在我的一个屏幕中,我有两个具有相同类和 div 的按钮。所以我不能拿我需要的那个。我需要获得具有“检查和储蓄”产品的按钮。有人可以帮助如何获得准确的按钮点击吗?我的 Web 应用程序是在 AnjularJS 上开发的。

这是标识按钮的页面中 HTML 的完整 div 部分。

<div class="jl-layout">
    <div class="jl-layout-50-50">
        <!-- ngRepeat: entry in ctrl.vm.productSuites.entries -->
        <div style="" ng-repeat="entry in ctrl.vm.productSuites.entries" class="item product-container centered ng-scope">
            <h3 class="ng-binding">Checking and Savings</h3>
            <button type="button" tabindex="0" ng-click="ctrl.submitProductSelection(entry)" class="extra-button-padding secondary jl-button">
                <ng-transclude>
                    <span class="ng-scope">Select</span>
                </ng-transclude>
            </button>
            <div tabindex="0" role="button" ng-click="ctrl.submitProductSelection(entry)" class="mobile-click"/>
        </div>
        <!-- end ngRepeat: entry in ctrl.vm.productSuites.entries -->
        <div style="" ng-repeat="entry in ctrl.vm.productSuites.entries" class="item product-container centered ng-scope">
            <h3 class="ng-binding">Savings</h3>
            <button type="button" tabindex="0" ng-click="ctrl.submitProductSelection(entry)" class="extra-button-padding secondary jl-button">
                <ng-transclude>
                    <span class="ng-scope">Select</span>
                </ng-transclude>
            </button>
            <div tabindex="0" role="button" ng-click="ctrl.submitProductSelection(entry)" class="mobile-click"/>
        </div>
        <!-- end ngRepeat: entry in ctrl.vm.productSuites.entries -->
    </div>
</div>

【问题讨论】:

    标签: ruby watir-webdriver


    【解决方案1】:

    当您要与之交互的元素上没有独特的属性时,您将不得不查看它周围的元素。在这种情况下,区分按钮的是 h3 元素文本。

    解决方案 - 从唯一元素导航 DOM

    从概念上讲,最简单的解决方案是:

    1. 获取相关的 h3 元素。
    2. 导航到父 div 元素,它也是按钮的父元素。
    3. 获取该父 div 中的按钮元素。

    这将使用:

    product = 'Checking and Savings'
    browser.h3(text: product).parent.button.click
    

    解决方案 - 遍历相关元素组

    另一种方法是遍历代表项目的每个 div。对于每个 div(项目),您将检查它是否是正确的产品,然后单击按钮。

    这将是:

    browser.divs(class: 'item').find { |div| div.h3(text: product).exists? }.button.click
    

    请注意,给定您特定的 HTML sn-p,这将始终返回第一个按钮。 &lt;div tabindex="0" role="button" ng-click="ctrl.submitProductSelection(entry)" class="mobile-click"/&gt; 缺少结束 div 标记使得所有内容都出现在同一个项目 div 中。

    解决方案 - 使用 XPath

    这与第一个解决方案的方法相同。但是,它是使用单个 XPath 定位器完成的。好处是由于更少的方法调用,它更快。但是,它可能更难阅读。

    browser.button(xpath: "//h3[text()='#{product}']/../button").click
    

    【讨论】:

    • 感谢您为我提供解决方案。如果元素不是唯一的,我了解如何处理元素的逻辑。我喜欢使用 xpath 生成的第三个解决方案,因为它将是唯一代表的。但正如我所说,我是网络原子化的新手,所以请你帮助我或任何我可以学习如何为 HTML 元素生成 xpath 的地方。我只是通过复制并粘贴我的代码来尝试使用您的第三个解决方案,但它会引发错误。
    • 我尝试使用 firefox 插件中的 firebug。但它仍然给我这样的“/html/body/div[1]/div/div/div/div[2]/div[1]/div/div[1]/button”,这与你所拥有的不同给定的。所以请帮助我。
    • 你得到的错误是什么?当我尝试它时,它对我来说效果很好。请注意,您必须定义 product 变量。
    • 元素没有单一的 XPath,这就是为什么您在 Firebug 中看到的东西有所不同的原因。但是,您必须小心为您自动生成 XPath 的工具。虽然它们当时是正确的,但它们过度指定了路径,这使它们变得脆弱(即对页面的任何更改都可能破坏 XPath)。
    • 是的..现在我得到了正确的导航。我不知道之前发生的事情。现在单击相应的按钮并移至下一页。非常感谢您的时间。有一件事请帮助我学习或找到我将来如何为 html 生成 xpath。因为你已经给了这个 xpath 行 "b.button(xpath: "//h3[text()='Checking and Savings']/../button").click" 我使用了它。但我不确定这个“/../button”部分到底是什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    • 2021-03-02
    • 2020-01-30
    • 2012-06-09
    • 2019-09-28
    相关资源
    最近更新 更多