【问题标题】:How do I target a nested input that has no id attribute using Cypress?如何使用赛普拉斯定位没有 id 属性的嵌套输入?
【发布时间】:2019-07-03 18:48:38
【问题描述】:

我正在为一个 React 项目编写 Cypress 测试。我需要能够定位嵌套在<label> 内的<input>,以便我可以在该输入字段中输入。 <input>s 没有类 ID。

这是我的 HTML。

    <label class="Input">
        <div class="label">LABEL TEXT</div>
        <input type="text">
    </label>

我有许多输入格式与上面显示的完全相同的 HTML。它们仅在&lt;div&gt; 中的文本不同(即标签文本)。

我在标签标签中包围&lt;input&gt; 的原因是我希望用户能够通过单击标签文本或输入周围的任意位置来定位输入。仅仅为了赛普拉斯测试,向输入添加一个类对我们的代码库没有意义。我不能使用伪选择器,例如 :first cy.get('input[type="text"]:first'),因为我不希望我的测试在我向表单中添加额外的输入时中断。

我尝试了以下方法,但它尝试输入标签而不是输入。

  cy.contains('LABEL TEXT')
      .click()
      .type('test')

即使它在 Cypress 测试运行器中将焦点放在了,它仍然会尝试输入 &lt;div&gt; 而不是焦点输入。

由于我对 Cypress 和断言非常陌生,所以我只能摸不着头脑。我对一个解决方案(如果可能的话)感兴趣,该解决方案不涉及仅仅为了赛普拉斯测试而向我的输入添加类。我希望这只是我的 CSS、Cypress 或断言知识的一个不足。

谢谢

【问题讨论】:

    标签: html css reactjs cypress end-to-end


    【解决方案1】:

    我刚刚复制了您的完全相同的场景,即有几个相同的标签,只是内部 div 的文本不同。 Miguel Carvajal 的答案很接近,但需要进行一些调整。以下代码正常工作:

    cy.get("div[class='label']").contains("LABEL TEXT2").parent().within(() => {
       cy.get("input[type='text']").type("StackOverflowHelp")
    })
    

    在以下 HTML 上测试:

    <label class="Input">
      <div class="label">LABEL TEXT1</div>
      <input type="text">
    </label>
    <label class="Input">
      <div class="label">LABEL TEXT2</div>
      <input type="text">
    </label>
    

    结果:

    【讨论】:

      【解决方案2】:

      我觉得有点像

      cy.getByText("label text").parent().within(() => {
      
         cy.get('input') // this yields the input
      })
      

      会起作用的。

      我建议您查看https://github.com/testing-library/cypress-testing-library 以获得一些简洁的选择器

      【讨论】:

        【解决方案3】:

        是的,您可以使用CSS selectors 来获得更高的精度!

        试试:

        cy.get('.Input > input') // selects an <input> tag that is a direct
                                 // descendant of a "Input" class
        .click()
        .type('test')
        

        您还可以使用 CSS 选择器来选择 DOM 中与选择器匹配的 nth 元素:

        cy.get('.Input:nth-child(2) > input') // selects all <input> tags that
                                              // are direct children of the
                                              // second "Input"-class element
                                              // in any containing element
        .click()
        .type('test')
        

        【讨论】:

        • 不幸的是,我有许多以 ALL 形式的输入,其 HTML 结构与我的示例中显示的相同。它们仅在
          的内容上有所不同;文本“标签文本”。因此,Cypress 会抛出错误,因为它不会导致 DOM 中的单个元素为目标。我会在我的问题中澄清这一点。谢谢。
        • 您可以使用 CSS 选择器来选择 DOM 中的第 n 个元素。 :) 我会把它添加到我的答案中。
        猜你喜欢
        相关资源
        最近更新 更多
        热门标签