如何通过多个文本匹配单击一个元素?

问题描述

我有一些具有不同字段的卡片。文字看起来像这样。

年龄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();
          }
        });
      });
  }

我敢肯定有一种更优雅的方法可以做到这一点。 谢谢!

解决方法

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

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

例如,它与您的最后一行匹配: xpath for multiples

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

//div[p[contains(text(),'do this')]]

这是div,其中包含p,其中包含这些文本条件。

还有xpath修饰符,可以更容易地阅读诸如and和or:

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

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

如果您有一个更复杂的对象,请共享您的html,我可以为您提供更多定制服务。