- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我一直在忍受这个。我正在使用第三方列表框小部件 (jqx-listbox) 并尝试对其进行测试。在 ng serve
下一切正常甚至查看 Chrome 中的 Karma 输出,我可以看到整个 UI,包括列表框和项目,这是我想要测试的。
问题是在测试中查询元素:
let openListbox = fixture.debugElement.query(By.css('.jqx-listitem-element'));
返回 null,而如果我在该行放置一个断点,并在 Chrome 控制台中使用 jQuery $('.jqx-listitem-element)
然后返回 DOM 元素!
如果我将测试中的查找更改为模板中定义的元素 (<jqxlistbox>
),如下所示:let openListbox = fixture.debugElement.query(By.css('jqxlistbox'))
,这将返回 debugElement,我什至可以在那个断点处检查那个东西的 native 元素内部,看看它里面有东西,但无论我尝试了什么(返回那个元素然后对其进行查询),我似乎无法更深入地查询对象,所以我的测试一直失败。
我也试过使用 fakeAsync
和 fixture.whenStable
但这似乎完全被跳过了(或者它永远不会稳定)。
这是小部件在运行时生成的渲染模板代码(这是我要检查的最里面的跨度)
<jqxlistbox _ngcontent-c0="" class="" style="" ng-reflect-attr-display-member="message" ng-reflect-attr-source="[object Object]"
ng-reflect-attr-value-member="errorType" ng-reflect-attr-width="100%">
<div class="ng-tns-c0-0 jqx-listbox jqx-reset jqx-rc-all jqx-widget jqx-widget-content jqx-disableselect" id="jqxWidgete238403f0fb8"
style="width: 100%; height: 200px;" aria-multiselectable="false" role="listbox" tabindex="1">
<div style="-webkit-appearance: none; background: transparent; outline: none; width:100%; height: 100%; align:left; border: 0px; padding: 0px; margin: 0px; left: 0px; top: 0px; valign:top; position: relative;">
<div style="-webkit-appearance: none; border: none; background: transparent; outline: none; width:100%; height: 100%; padding: 0px; margin: 0px; align:left; left: 0px; top: 0px; valign:top; position: relative;">
<div id="listBoxContentjqxWidgete238403f0fb8" style="-webkit-appearance: none; background: transparent; outline: none; border: none; padding: 0px; overflow: hidden; margin: 0px; left: 0px; top: 0px; position: absolute; width: 328px; height: 198px;">
<div style="outline: none 0px; overflow: hidden; width: 329px; position: relative; height: 404px;">
<div role="option" id="listitem0jqxWidgete238403f0fb8" class="jqx-listitem-element" style="height: 24px; top: 0px; left: 0px;"
aria-selected="true">
<span style="white-space: pre; display: block; visibility: inherit; width: 318px;" class="jqx-listitem-state-normal jqx-item jqx-rc-all jqx-listitem-state-selected jqx-fill-state-pressed">Open hard error</span>
</div>
</div>
</div>
</div>
</div>
</div>
</jqxlistbox>
编辑我可以获得外部元素,它是 innerText
是该跨度的文本:“打开硬错误”,但这只是因为它是整个元素中唯一的文本节点。
使用此测试代码,第一个断言通过,第二个断言失败,出现错误“无法读取 null 的属性 nativeElement”,这对我来说太奇怪了,因为如果它能找到 innerText,那么它就有了整个 DOM 元素.我想知道查询由查询返回的 DebugElement 是否有问题?:
fixture.detectChanges();
let openListbox = fixture.debugElement.query(By.css('#open jqxlistbox'));
expect(openListbox.nativeElement.innerText).toContain('Open hard error', 'item in listbox');
fixture.detectChanges();
let openListboxItem: HTMLElement = openListbox.query(By.css('span')).nativeElement;
expect(openListboxItem.textContent).toBe('Open hard error', 'item in listbox');
最佳答案
我有一种感觉,你的 jqx-listitem-element
是根据提供给 jqxlistbox
的一些数据呈现的。为了访问那些依赖于数据的子元素,您需要在组件“初始化”(通过调用 fixture.detectChanges
) 之后查询它们。
所以,请尝试以下操作:
let openListBox = fixture.debugElement.query(By.css('jqxlistbox'));
fixture.detectChanges();
let listItems = fixture.debugElement.queryAll(By.css('.jqx-listitem-element'));
这将初始化组件,导致 jqxlistbox
注册它的数据并呈现它的子列表项,然后您可以使用第二行 queryAll
查询这些列表项在上面的片段中。
根据第一条评论和其他信息进行编辑:
I'm wondering if there's something wrong with querying a DebugElement returned by a query?
查询 DebugElement 没有任何问题,您所做的在语法上是正确的。您应该能够使用我在此答案的第一个版本中添加的代码。我认为这可能与您如何填充这些列表项有关。检查您的模拟数据/提供者。我看不到你的整个 spec
,所以我无法在那里进行故障排除。
关于Angular:debugElement 查询找不到元素,但 jQuery 找到了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48345814/
例如,我有一个父类Author: class Author { String name static hasMany = [ fiction: Book,
代码如下: dojo.query(subNav.navClass).forEach(function(node, index, arr){ if(dojo.style(node, 'd
我有一个带有 Id 和姓名的学生表和一个带有 Id 和 friend Id 的 Friends 表。我想加入这两个表并找到学生的 friend 。 例如,Ashley 的 friend 是 Saman
我通过互联网浏览,但仍未找到问题的答案。应该很容易: class Parent { String name Child child } 当我有一个 child 对象时,如何获得它的 paren
我正在尝试创建一个以 Firebase 作为我的后端的社交应用。现在我正面临如何(在哪里?)找到 friend 功能的问题。 我有每个用户的邮件地址。 我可以访问用户的电话也预订。 在传统的后端中,我
我主要想澄清以下几点: 1。有人告诉我,在 iOS 5 及以下版本中,如果您使用 Game Center 设置多人游戏,则“查找 Facebook 好友”(如与好友争夺战)的功能不是内置的,因此您需要
关于redis docker镜像ENTRYPOINT脚本 docker-entrypoint.sh : #!/bin/sh set -e # first arg is `-f` or `--some-
我是一名优秀的程序员,十分优秀!