【问题标题】:How to select a element if value/title contains a text如果值/标题包含文本,如何选择元素
【发布时间】:2020-08-02 15:07:28
【问题描述】:

我一直试图找出如果一个值包含“6 个月”,我如何获取该元素。这是几个例子,我们可以看到所有这些值都有 6 个月这个词,这当然是不同的场景,所以我不想点击所有这些,但我给出了我需要点击的不同银行类型的例子

<input type="button" aria-label="AMEX 6 months Extended Payment Plan" title="AMEX 6 months Extended Payment Plan" value="AMEX 6 months Extended Payment Plan" class="pm-button pp-content-btn pm-button-half">

<input type="button" aria-label="DBS IPP 6 months 0%" title="DBS IPP 6 months 0%" value="DBS IPP 6 months 0%" class="pm-button pp-content-btn pm-button-half">

<input type="button" aria-label="UOBSG IPP 6 months 0%" title="UOBSG IPP 6 months 0%" value="UOBSG IPP 6 months 0%" class="pm-button pp-content-btn pm-button-half">

我想知道如果值/标题中包含“6 个月”这个词,是否可以点击一个元素?

编辑:使用量角器进行测试

【问题讨论】:

  • 使用带有子字符串匹配选择器的属性查询选择器,例如document.querySelectorAll('[title*="6 months"]')
  • @Teemu 我认为我的问题是我不能在量角器中使用 querySelectorAll :(
  • 也许这给出了一个想法,但我不确定:stackoverflow.com/questions/38108686/…
  • @tenkmilan 我相信如果我们知道我们想要获得什么确切的标题,那就更多了

标签: javascript selenium protractor


【解决方案1】:

您可以使用带有 contains 函数的 xpaths 来实现这一点,如下所示:

element(by.xpath('//input[contains(@title,"6 months")]');

contains function 对于定位在属性或节点本身中包含特定文本的元素非常有用。

【讨论】:

  • 哦,这个有效!太棒了,没想到我可以这么简单!
【解决方案2】:

这正是 by.cssContainingText 所做的(部分文本匹配器与 css 结合使用)

let elem = element(by.cssContainingText('[style]', '6 months'));

修订

一种做你需要的方法,但效率很低......你可以对 elementArrayFinder 多次使用.filter,直到你将结果缩小到你需要的元素

但我会通过 2 个参数查找您需要的元素

let $elem = (bank, range) => element(by.xpath(`//input[contains(.,"${bank}") and contains(.,"${range}")]`));

根据需要更正 xpath。但本质上,它会寻找一个input 元素,该元素与第一个参数和第二个参数部分匹配任何内容(属性、文本等)

【讨论】:

    【解决方案3】:

    由于您不能使用 querySelectorAll,您可能会发现此功能很有帮助:

    如果您不依赖元素名称:

    FindByAttributeValue("Attribute-Name", "Attribute-Value");
    

    或者如果你这样做:

    FindByAttributeValue("Attribute-Name", "Attribute-Value", "div");
    

    以及完整的功能实现:

    function FindByAttributeValue(attribute, value, element_type){
        element_type = element_type || "*";
        var All = document.getElementsByTagName(element_type);
        for (var i = 0; i < All.length; i++){
            if (All[i].getAttribute(attribute) == value){
                return All[i];
            }
        }
    }
    

    完整答案来自HERE

    【讨论】:

    • 但是如果我理解正确的话,属性需要完全匹配才有效,在这种情况下不是吗?
    猜你喜欢
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 2020-05-27
    相关资源
    最近更新 更多