【问题标题】:How to find element by innerHtml如何通过innerHtml查找元素
【发布时间】:2020-09-30 18:01:31
【问题描述】:

This question 与我的标题相似,但在我的情况下,我需要找到一个基于 innerHtml 的元素,而不是找到 <T> 类型的元素并查看它的 innerHtml。

在下面的元素中,唯一标识 div 的唯一方法是基于其 innerHtml。我无法添加 id,因为那太容易了。如何在debugElement.query 语句中找到 div?

html:

<div *ngIf="isOn">Hello</div>

测试:

  it('#clicked() should toggle #isOn', () => {
    const comp = component;
    comp.click();
    fixture.detectChanges();
    const div = fixture.debugElement.query(By.css('[innerHTML] === "Hello"')); // wrong 

    const div2 = fixture.debugElement.query(x => x.attributes['innerHtml'] === "Hello"); // also wrong

    const div3 = fixture.debugElement.query(x => x.attributes['text'] === "Hello"); // also wrong


    expect(div).toBeTruthy();
  });

【问题讨论】:

  • 看起来不需要是内部 HTML 而是文本内容...
  • By.css 是量角器,不是茉莉;除了css,还有a number of methods on By。您可能想调查这些。
  • 我正在使用 Angular 我相信它是一个定义为 Angular 平台浏览器一部分的类。我也无法通过文本属性找到 div。
  • 等等,你需要通过innerHtml定位元素还是找到你已经定位的元素的innerHtml
  • @SergeyPleshakov 我需要通过 innerHtml 定位一个元素

标签: angular jasmine


【解决方案1】:

两件事...

首先,这看起来像一个单元测试,所以它不应该与 Protractor 有任何关系。在 Protractor 和 Angular TestBed 之间查找 innerHTML 的方式完全不同。例如,在 Protractor 中,您可以选择使用 by.cssContainingText(selector, someText)。 Angular API 没有这些。您正在使用的By 是这个(不是量角器):https://angular.io/api/platform-browser/By

据我所知,不可能使用纯 css 以这种方式查找元素。您也许可以使用一些 jQuery 魔法来找到它,但这比您真正需要的要复杂得多。


其次,添加 id 属性并没有什么“太容易”的地方。这正是它应该做的。没有合乎逻辑的理由不这样做。如果这是某种测试或其他东西,而您真的无法添加它,那只是一个荒谬的问题。您可以尝试改用 xpath 选择器。我很确定有一种方法可以使用 xpath 通过一些部分文本来查找元素。我会让你弄清楚如何做到这一点。在任何情况下,都不能使用普通的 css 方法来完成。最好和最简单的解决方案如下所示:

<div *ngIf="isOn" id="someId">Hello</div>


it('#clicked() should toggle #isOn', () => {
  const comp = component;
  comp.click();
  fixture.detectChanges();
  const div = fixture.debugElement.query(By.css('#someId'));

  expect(div.innerHTML).toEqual('Hello');
});

【讨论】:

  • 首先,感谢您的回答。不幸的是,我对 ID 太容易的一点讽刺是基于我无法控制的情况。 “你不能这样做”是一个有效的答案,如果你想更新你的,我会接受。
  • 好吧,我很确定你可以使用 xpath 根据它是否包含一些文本来找到一个元素。如果这对您有用,那么您可能需要检查该方法。我认为您仍然可以完成与innerHTML 不同的相同任务。
  • 我的问题措辞可怕。对不起。我只是想要一种找到 div 的方法。如果我使用文本、值或任何其他我不关心的属性。
  • > 或 value 或任何其他我不关心的属性。这是 div 的一部分,如图所示。我无法修改 html。
【解决方案2】:

您可以使用 xpath 来实现您正在做的事情

文本完全匹配

//div[text()="Hello"]

部分文本匹配

//div[contains(text(),"Hello")]

还有这个。我不完全确定它匹配的是什么

//div[contains(.,"Hello")]

【讨论】:

  • 抱歉,我认为 debugElement 不支持此功能。
【解决方案3】:

你可以试试这样的:

const div = fixture.debugElement.query(By.css('div')).nativeElement;
expect(div.innerHTML).toContain('Hello');

【讨论】:

  • 谢谢,但是我的页面上有很多 div。我只想找到带有内部 htm = Hello 的那个。
  • 你可以给你的 div 一些唯一的 id 并通过这种方式得到它。 const div = fixture.debugElement.query(By.css('#id')).nativeElement;
猜你喜欢
  • 2014-06-05
  • 2014-02-22
  • 1970-01-01
  • 1970-01-01
  • 2019-10-06
  • 2020-05-03
  • 2016-11-25
  • 2013-08-07
  • 1970-01-01
相关资源
最近更新 更多