【问题标题】:How can you click on an element by multiple text matches?如何通过多个文本匹配单击一个元素?
【发布时间】:2020-12-01 23:56:33
【问题描述】:

我有一些有不同领域的卡片。文本看起来像这样。

梗犬

2 岁

雷克斯的名字

位置科罗拉多

我需要通过多个文本匹配一张卡片。所以element(by.cssContainingText('#age', 'Age 2')) 不是很有帮助,因为我还需要 '#location' 来匹配 'Colorado'。

我尝试的是链接element.all(by.cssContainingText('#card','Age')).element.all(by.cssContainingText('#location', 'Colorado')),但它似乎不起作用而且非常混乱。 最终目标是点击匹配的第一张卡片。

我还尝试创建一个与文本匹配的函数。但是,如果第一次点击后有多个匹配项,它也会尝试点击下一个匹配项,我会收到一个过时的元素错误。

public clickDogCardByAgeAndLocation(age: string, location: string) {
      common.waitForElement($('dog-card'));
      $$('dog-card').each(element => {
        element.getText().then(text => {
          if (text.includes(age) && text.includes(location)) {
            console.log('CARD SUCCESS');
            element.click();
          }
        });
      });
  }

我相信有一种更优雅的方法可以做到这一点。 谢谢!

【问题讨论】:

    标签: selenium protractor


    【解决方案1】:

    如果您的所有文本都在一个元素上,您可以使用 xpath 查找多个条件,如下所示:

    //p[contains(text(),'I am')][contains(text(),'more elegant')][contains(text(),'do this')]
    

    例如,与您的最后一行匹配:

    如果您的文本跨越多个子元素,您可以通过像这样包装该标识符来选择父卡:

    //div[p[contains(text(),'I am')][contains(text(),'more elegant')][contains(text(),'do this')]]
    

    这就是 div 包含的 p 包含那些文本条件。

    还有一些 xpath 修饰符可以更容易地阅读这样的和和或:

    //p[contains(text(),'I am') and contains(text(),'more elegant')]
    

    您可以在此页面上尝试所有这些 :-)

    如果您有更复杂的对象,请分享您的 html,我可以提供更定制的帮助。

    【讨论】:

    • 谢谢,这个解决方案看起来好多了。我也在考虑正则表达式,所以我可以做类似element(by.cssContainingText('#parent-card', /regex matching age AND location/)) 的事情。如果没有其他方法,我只会使用 xpath。
    • 正则表达式的 Intsead,如果您仍然需要它 - 您可以使用 attribute* 进行 css 和子字符串匹配 - 例如,将其放入 devtools(在此页面上)a[name*='b-t'][name*='top'] - 此页面有元素<a name="tab-top"> 并将其与部分匹配(尽管如此,部分重叠)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 2016-09-08
    • 1970-01-01
    • 2018-12-14
    • 2016-08-22
    相关资源
    最近更新 更多