You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Karate UI中嵌套ShadowRoot下带点ID输入框的文本输入问题

问题:嵌套两层ShadowRoot的含点ID输入框无法在Karate中写入文本

我尝试向ID为streetAddress.unitNumber的输入框插入文本但失败,该元素嵌套在两层开放ShadowRoot中。能点击同ShadowRoot内的按钮,但无法操作这类ID包含点(如streetAddress.quickSearch)的输入框。

尝试的JavaScript路径

document.querySelector("#appContainer > crma")
  .shadowRoot.querySelector("div > div > div:nth-child(2) > ppma")
  .shadowRoot.querySelector("#streetAddress\.quickSearch")

Karate中的尝试及报错

在Karate feature中,我尝试了JS路径、选择器、XPath等多种方法,均报错:

script("document.querySelector('#appContainer > crma')
  .shadowRoot.querySelector('div > div > div:nth-child(2) > ppma')
  .shadowRoot.querySelector('#streetAddress\.quickSearch')
  .value='1234'")

错误信息:

org.graalvm.polyglot.PolyglotException: js eval failed twice:
document.querySelector('#appContainer > crma')
  .shadowRoot.querySelector('div > div > div:nth-child(2) > ppma')
  .shadowRoot.querySelector('#streetAddress.unitNumber')
  .value='1234',
error: [type: MAP, value: {type=object, subtype=error, className=TypeError, description=TypeError: Cannot set properties of null (setting 'value')

转义符问题

控制台输出的查询选择器路径显示单转义符,但提交时实际是双转义符。尝试单转义、双转义或无转义均无效果。

Playwright成功案例对比

使用Playwright可成功向该输入框写入文本:

await page.evaluate(() => {
  const container = document.querySelector('#appContainer');
  const firstShadowRoot = container.shadowRoot;
  const nestedContainer = firstShadowRoot.querySelector('ppma');
  const secondShadowRoot = nestedContainer.shadowRoot;
  const inputElement = secondShadowRoot.querySelector('#streetAddress\.unitNumber');
  inputElement.value = '123';
});

但对应的Karate测试代码执行失败:

script("document.querySelector('#appContainer > crma')
  .shadowRoot.querySelector('div > div > div:nth-child(2) > ppma')
  .shadowRoot.querySelector('#streetAddress\.unitNumber')
  .value='1234'");

另一段失败的Karate代码:

* def script =
      """
      function() {
      val container = document.querySelector('#crma');
      val firstShadowRoot = container.shadowRoot;
      val nestedContainer = firstShadowRoot.querySelector('ppma');
      val secondShadowRoot = nestedContainer.shadowRoot;
      val inputElement = secondShadowRoot.querySelector('#streetAddress\.unitNumber');
      inputElement.value = '777';
      }
      """
* delay(2000)
* driver.eval(script)

补充说明

尝试在示例/练习站点复现该问题,但未找到具有此类特定元素结构(ID格式为value1.value2)的站点。

内容的提问来源于stack exchange,提问作者jbart18

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 07:34:51