我有一个Angular 的应用程序,我为创建 cypress E2E.

该应用程序的一个页面有一个表,其中第三列包含一个类名为‘link ng-star-Inserted’的链接,我希望测试在找到特定行后点击该链接.

实际上,我已经让测试完成了这项工作--链接实际上是被点击的.

但它不是很优雅,而且它将.Click()方法标记为错误(尽管它确实可以工作).

我正在寻找一种方法,使其不将.ick()方法标记为错误.

这是我的密码...

cy.get(SELECTOR.dataTableBody).should('be.visible')
        .contains('tr', 'Text I am looking for in the row I want')
        .then($row => {
            cy.log('found it');
            cy.log('on row ' + $row.index());

            //Yes this is kind of ugly.  I tried it every other way I could think of and this is the only way it worked
            let cellWithLink = $row.find('td:nth-child(3)');
            cellWithLink.children().get(0).getElementsByClassName('link ng-star-inserted').item(0).click();
            
});

这张截图显示了IDE将Click()标记为错误的地方--尽管它确实有效.

enter image description here

多谢了!

推荐答案

从测试代码来看,HTML看起来类似于

<table>
  <tbody class="p-datatable-tbody">
    <tr>
      <td></td>
      <td>Some text</td>
    </tr>
    <tr>
      <td>Text I am looking for in the row I want</td>
      <td></td>
      <td>
        <span>
          <a class="link ng-star-inserted">Click me</a></td>
        </span>
    </tr>
  </tbody>
</table>

判断从.getElementsByClassName()返回的type,你可以看到它是HTMLCollection,这是103.

cy.get('table').should('be.visible')
  .contains('tr', 'Text I am looking for in the row I want')
  .then($row => {

    let cellWithLink = $row.find('td:nth-child(3)')

    const link = cellWithLink.children()
      .get(0)
      .getElementsByClassName('link ng-star-inserted')
      // .item(0)
      // .click()

    console.log(link)   // result of getElementsByClassName()
  })

item(0)方法返回一个Element,它没有.click()方法(因为该类型是针对all elements的,而不仅仅是可点击的)

假设是打字判断器抛出了红色的弯弯曲曲的(因为您运行的是Angular ),您可以try 将类型强制转换为HTMLElement,它确实有click()方法.

cy.get('table').should('be.visible')
  .contains('tr', 'Text I am looking for in the row I want')
  .then($row => {

    let cellWithLink = $row.find('td:nth-child(3)')
    const link = cellWithLink.children()
      .get(0)
      .getElementsByClassName('link ng-star-inserted')
      .item(0);
      // .click()

    (link as HTMLElement).click()

  })

enter image description here


减少丑陋

您的测试从Cypress查询开始,然后转移到jQuery查询,然后使用原生HTML查询(从.get(0)开始).

如果你想一路保持Cypress ,这应该就足够了:

cy.get('table').should('be.visible')
  .contains('tr', 'Text I am looking for in the row I want')
  .find('td:nth-child(3)')
  .find('.link.ng-star-inserted')
  .click()

Typescript相关问答推荐

如何根据另一个属性的布尔值来缩小函数属性的返回类型?

基于平台的重定向,Angular 为16

contextPaneTitleText类型的参数不能分配给remoteconfig类型的关键参数'""'''

有没有办法解决相互影响的路由之间的合并?

如何在react组件中使用doctype和html标签?

类型TTextKey不能用于索引类型 ;TOption

TypeScrip泛型类未提供预期的类型错误

为什么我的动画状态在组件实例之间共享?

@TANSTACK/REACT-QUERY中发生Mutations 后的数据刷新问题

在组件卸载时try 使用useEffect清除状态时发生冲突.react +打字

TypeScrip:使用Union ToInterval辅助对象,但保留子表达式

创建一个TypeScrip对象并基于来自输入对象的约束定义其类型

map 未显示控制台未显示任何错误@reaction-google-map/api

从以下内容之一提取属性类型

垫子工具栏不起作用的Angular 布线

使用RXJS获取数据的3种不同REST API

TS 排除带点符号的键

如何使用动态生成的键和值定义对象的形状?

是否可以从 TypeScript 的类型推断中排除this?

如何使用 TypeScript 接口中第一个属性的值定义第二个属性