微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

量角器中的 Angular ViewEncapsulation.ShadowDom 元素给出 StaleElementExceptionError

如何解决量角器中的 Angular ViewEncapsulation.ShadowDom 元素给出 StaleElementExceptionError

我在一个角度组件中有一个 iframe,我正在使用组件工厂(将本机元素附加到 iframe 的主体)动态地向其中注入一个组件 X。我这样做的原因是因为我需要媒体查询才能在组件中运行。如果没有 ViewEncapsulation.ShadowDom,框架内注入的组件将是“无样式”的。

到目前为止,一切都很好,而且功能完全符合我的要求。但是,在 e2e 测试期间,我无法访问 shadow-root 中的任何元素,我尝试了多种方法,例如 document.querySelector('component-id').shadowRoot.querySelector('element-id') 甚至提到的库和变通方法 {{3} }.

一切都导致同样的错误

StaleElementReferenceError: stale element reference: stale element not 找到

总结一下,

  • 一个带有 Shadow Dom 封装的 angular 组件被注入到 iframe 中
  • 无法使用所有可用方法访问注入组件的 shadowroot 内的元素

解决方法

我意识到这个答案可能无法解决您的特定问题,并且我冒着因投票失败而失去代表的风险,但我想根据我对上述问题的评论建议更改架构。

>

由于您可以完全控制 iframe 的内容,因此我建议您设置 Angular 路由,以允许您为 iframe 指定一个路由来显示您的简单组件,同时保持应用程序的其余路由完整。

摘要

因此,假设您已正常设置应用程序的路由,并使用托管 app.component 标记的顶级组件(通常为 <router-outlet>),我将创建一个新的顶级组件(我们称之为 { {1}}) 的模板中仅包含 app-plain.component,没有其他内容。我会将应用程序设置为将此组件用作引导程序组件(而不是 <router-outlet></router-outlet>),然后我将更改路由配置以将所有现有路由作为新的空白路径路由 (app.component ) 以旧的 '' 作为其组件。

最后,我将使用一些路径(比如 app.component)设置一个新路由,该路由将使用您希望在 iframe 中显示的组件作为其组件(我们称之为 iframe)。>

这将允许您将 iframe.component 之类的元素放置在组件中的任何位置,并让它仅显示您的 <iframe src="/iframe"></iframe>

实施

假设您现有的路由配置如下所示:

iframe.component

我将修改路由配置如下:

const routes = [
  { path: '',pathMatch: 'full',redirectTo: 'home' },{ path: 'home',component: HomeComponent },// ... more routes here
];

如前所述,我将创建一个名为 const newRoutes = [ { path: 'iframe',component: IframeComponent },{ path: '',component: AppComponent,children: routes // <-- the old routes } ]; 的新普通顶级组件,其模板中只有一个 app-plain.component,并将其设置为模块的引导程序组件:

<router-outlet>

注意:由于引导程序组件已更改,因此您也必须在 @NgModule({ declarations: [...],imports: [...],providers: [...],bootstrap: [AppPlainComponent] // <-- this is the change }) export class AppModule { } 中指定其选择器(而不是默认情况下的 index.html

演示/示例

我用这个解决方案概念创建了一个 github repo

我无法进行 StackBlitz,因为我尝试时 app-root 从未完成加载,这是我的 failed attempt

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。