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

使用Cypress+TypeScript无法选中对话框内单选按钮求助

Cypress+TypeScript无法选中对话框中的Angular Material单选按钮

我用Cypress结合TypeScript做自动化测试时,没法点击或选中对话框里的单选按钮,对应的HTML结构如下:

<div _ngcontent-ng-c3278589420="" class="dialog-container">
  <div _ngcontent-ng-c3278589420="" class="content-container">
    <div _ngcontent-ng-c3278589420="" class="title">Change the current stop sequence?</div>
    <div _ngcontent-ng-c3278589420="" class="content">
      <span _ngcontent-ng-c3278589420="" class="supporting-text"> With the addition of the new stop(s) on an existing route, would you like to- </span>
      <mat-radio-group _ngcontent-ng-c3278589420="" role="radiogroup" class="mat-mdc-radio-group radio-buttons">
        <mat-radio-button _ngcontent-ng-c3278589420="" value="1" ngdefaultcontrol="" class="mat-mdc-radio-button mat-accent ng-untouched ng-pristine ng-valid" id="mat-radio-38">
          <div mat-internal-form-field="" class="mdc-form-field mat-internal-form-field">
            <div class="mdc-radio">
              <div class="mat-mdc-radio-touch-target"></div>
              <input type="radio" class="mdc-radio__native-control" id="mat-radio-38-input" name="mat-radio-group-36" value="1" tabindex="0">
              <div class="mdc-radio__background">
                <div class="mdc-radio__outer-circle"></div>
                <div class="mdc-radio__inner-circle"></div>
              </div>
              <div mat-ripple="" class="mat-ripple mat-radio-ripple mat-mdc-focus-indicator">
                <div class="mat-ripple-element mat-radio-persistent-ripple"></div>
              </div>
            </div>
            <label class="mdc-label" for="mat-radio-38-input"> Keep the existing sequence number of the current stops. </label>
          </div>
        </mat-radio-button>
        <mat-radio-button _ngcontent-ng-c3278589420="" value="2" ngdefaultcontrol="" class="mat-mdc-radio-button mat-accent ng-untouched ng-pristine ng-valid" id="mat-radio-39">
          <div mat-internal-form-field="" class="mdc-form-field mat-internal-form-field">
            <div class="mdc-radio">
              <div class="mat-mdc-radio-touch-target"></div>
              <input type="radio" class="mdc-radio__native-control" id="mat-radio-39-input" name="mat-radio-group-36" value="2" tabindex="0">
              <div class="mdc-radio__background">
                <div class="mdc-radio__outer-circle"></div>
                <div class="mdc-radio__inner-circle"></div>
              </div>
              <div mat-ripple="" class="mat-ripple mat-radio-ripple mat-mdc-focus-indicator">
                <div class="mat-ripple-element mat-radio-persistent-ripple"></div>
              </div>
            </div>
            <label class="mdc-label" for="mat-radio-39-input"> Adjust the sequence of current stops </label>
          </div>
        </mat-radio-button>
      </mat-radio-group>
    </div>
  </div>
  <div _ngcontent-ng-c3278589420="" class="buttons">
    <div _ngcontent-ng-c3278589420="" class="green-text-btn">Cancel</div>
    <div _ngcontent-ng-c3278589420="" class="orange-text-btn disabled-text-btn"> Add Stops </div>
  </div>
</div>

我试过以下几种写法,但都没效果:

  • 写法1:
cy.get('mat-radio-group > mat-radio-button[value="1"] input[type="radio"]') 
  .find('input[type="radio"]') 
  .check({ force: true }); 
  • 写法2:
cy.get("mat-radio-group > mat-radio-button")
  .first()
  .check({ force: true }); 
  • 写法3:
cy.get('input[type="radio"][value="2"]')
  .first()
  .check({ force: true }); 
  • 写法4:
cy.get('input[type="radio"][value="2"]')
  .check({ force: true }); 
  • 写法5:
cy.get('[value="1"]')
  .first()
  .check({ force: true }); 

我已经加了足够的等待时间,还是找不到并选中单选按钮,求解决办法。


可行的解决思路

1. 点击单选按钮的外层容器或标签

Angular Material的单选按钮交互通常绑定在外层的mat-radio-button或label元素上,直接操作底层input可能被遮挡,试试:

// 通过文本定位标签并点击
cy.contains('label.mdc-label', 'Keep the existing sequence number of the current stops.')
  .click({ force: true });

// 或者通过value定位mat-radio-button组件
cy.get('mat-radio-button[value="1"]')
  .click({ force: true });

2. 确保对话框完全可见后再操作

用Cypress的断言强制等待对话框加载完成,避免元素未就绪:

// 等待对话框容器可见
cy.get('.dialog-container').should('be.visible');

// 点击单选按钮的点击区域
cy.get('mat-radio-button[value="2"] .mdc-radio')
  .click({ force: true });

3. 手动设置选中状态并触发change事件

如果check()方法无效,可以直接修改input的checked属性并触发Angular需要的change事件:

cy.get('input.mdc-radio__native-control[value="1"]')
  .invoke('prop', 'checked', true)
  .trigger('change');

4. 检查是否存在iframe或shadow DOM

如果对话框是在iframe或shadow DOM中,需要先切换上下文:

// 如果是iframe
cy.get('iframe').then($iframe => {
  const body = $iframe.contents().find('body');
  cy.wrap(body).find('mat-radio-button[value="1"]').click();
});

// 如果是shadow DOM
cy.get('.dialog-container').shadow().find('mat-radio-button[value="1"]').click();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 11:12:03