【问题标题】:I can't locate element in cypress because the css selector is changing each time我无法在 cypress 中找到元素,因为 css 选择器每次都在变化
【发布时间】:2021-07-02 09:21:59
【问题描述】:

我正在使用此代码来定位元素以便单击它,但 jss403 每次都会更改

cy.get('.jss403 > .MuiButtonBase-root > .MuiButton-label').click()

如何更改定位策略,我刚开始在cypress,这是我的第一次测试。

【问题讨论】:

    标签: automation cypress


    【解决方案1】:

    请看Paper-Button always as upper case

    按钮的材料设计规范规定文本应为大写

    这意味着 DOM 中显示的文本是您应该搜索的内容

    cy.contains('.MuiButton-label', 'text in same case as DOM has')  // fails if wrong case
    

    或使用具有不区分大小写选项的正则表达式

    cy.contains('.MuiButton-label', /text in ANY case/i )            // succeeds for any case
    

    【讨论】:

      【解决方案2】:

      .jss403 在每次构建时由 React 生成。其他两个类是固定的,由 Material-UI 库提供。

      既然你有一个标签,你能在标签的文字上搜索吗?

      cy.contains('.MuiButton-label', 'the-label-text')
      

      如果您可以使用 devtools 检查页面,请复制 HTML 部分(使用右键单击选项“编辑为 HTML”)并将其添加到您的问题中,然后可以给出更准确的答案。


      根据 MUI 文档页面 here,您将针对具有文本“默认”文本的第一个示例按钮的元素是

      <span class="MuiButton-label">Default</span>
      

      我从他们提供的 CodeSandbox 链接中克隆了该页面,并向默认按钮添加了一个简单的点击处理程序

      应用程序 - demo.js

      import React from 'react';
      import { makeStyles } from '@material-ui/core/styles';
      import Button from '@material-ui/core/Button';
      
      ...
      
      export default function OutlinedButtons() {
        const classes = useStyles();
      
        return (
          <div className={classes.root}>
            <Button variant="outlined" onClick={() => { alert('clicked') }}>Default</Button>
      

      测试

      it('clicks the MUI button', () => {
      
        cy.visit('http://localhost:3000')  // cloned the example and running it locally
      
        cy.contains('.MuiButton-label', 'Default')
          .click()                         // shows "(alert) clicked" 
                                           // in Cypress runner log
      
      })
      

      警报实际上并没有显示,因为赛普拉斯抑制了它,但日志中有一个条目。

      【讨论】:

      • 在 30000 毫秒后重试超时:应在选择器中找到内容:“AD”:“.MuiButton-label”,但从未找到。
      • 包含文字后可以直接点击吗?因为它已经不工作了!
      • 不,如果.contains() 不起作用,点击将不起作用。我将添加一个我刚刚尝试过的测试。
      • 再次感谢您的尝试!我很感激,实际上我发布了我是如何使用另一个测试解决问题的
      【解决方案3】:

      终于解决了!

      使用此代码,

       cy.get('.MuiButtonBase-root > .MuiButton-label').eq(4).click({force: true})
      

      我发现我有 5 个元素,所以在初始代码中使用eq(x)(通过删除与反应相关的变量部分。

      【讨论】:

      • 我建议搜索标签文本比使用位置信息更好,应该不那么脆弱。
      • 您可能也不需要.MuiButtonBase-root,因为.MuiButton-label 非常具体。
      • 那么,出于兴趣,标签上的文字是什么? &lt;span&gt; 显示什么?
      • 我正在搜索的文本,但它是小写的你认为这是它不起作用的原因吗?因为文本在 UI 级别打印为大写
      • 听起来可能。不知道它是如何大写的。将有办法以不区分大小写的方式检查它,将发布答案。
      猜你喜欢
      • 2016-03-24
      • 2012-09-03
      • 1970-01-01
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      • 2015-04-28
      • 1970-01-01
      • 2016-01-21
      相关资源
      最近更新 更多