赛普拉斯

时间:2020-08-07 15:17:29

标签: javascript cypress

我是自动化测试的新手。我正在训练赛普拉斯实现自动化,但我遇到的问题是,在赛普拉斯的click()命令之后,网络请求(尤其是GET-XHR请求)并不总是被触发。

我的/support/commands.js中有一个自定义命令,应该单击“添加到比较”链接并返回添加到比较中的项目的标题:

Cypress.Commands.add("addToComparison", function (index) {
  cy.get(".vit-item").eq(index).find(".tovar-compare").click();
  return cy
    .get(".vit-item")
    .eq(index)
    .find(".vit-name")
    .invoke("text")
    .then((title) => {
      return title;
    });
});

然后我在/integration/smoke.spec.js:中调用此命令

describe("Add 2 items to comparison", () => {
  it("Add 2 items to comparison", () => {
    cy.visit("https://elmir.ua/cell_phones/");
    cy.addToComparison(0);
    cy.addToComparison(1);
    cy.get("#top-paging .compare-link").click();
  });
});

当用户在网站上手动执行相同操作时,单击“添加到比较”链接(cy.get(".vit-item").eq(index).find(".tovar-compare").click()功能中的addToComparison)后,将触发对URL https://elmir.ua/response/compare.php的GET请求,但是当我运行测试时,会不时触发GET请求,但几乎从不针对测试中的两个项目触发。 Screenshot of Cypress test Runner

我曾尝试像这样将addToComparison()then()的调用链接起来,但没有任何区别:

describe("Add 2 items to comparison", () => {
  it("Add 2 items to comparison", () => {
    cy.visit("https://elmir.ua/cell_phones/");
    cy.addToComparison(0).then((item1) => {
      cy.addToComparison(1).then((item2) => {
        cy.get("#top-paging .compare-link").click();
      });
    });
  });
});

此外,我尝试避免创建自定义函数,而只是在测试中直接调用get()方法,但这也没有任何区别:

describe("Add 2 items to comparison", () => {
  it("Add 2 items to comparison", () => {
    cy.visit("https://elmir.ua/cell_phones/");
    cy.get(".vit-item").eq(0).find(".tovar-compare").click();
    cy.get(".vit-item").eq(1).find(".tovar-compare").click();
    cy.get("#top-paging .compare-link").click();
  });
});

html代码段

<li class="vit-item">
  <section class="vit-info">
    <a
      href="/cell_phones/mobile_phone_samsung_a207f_galaxy_a20s_32_duos_red_sm-a207fzrdsek.html"
      class="vit-name"
      >Мобильный телефон Samsung A207F Galaxy A20s/32 Duos Red
      (SM-A207FZRDSEK)</a
    >
    <p class="vit-desc">
      6,5" / 720х1560 / IPS / ОЗУ - 3 ГБ / 32 ГБ встроенной памяти / Сканер
      отпечатка пальца / 4G / 2 SIM / 4000 мАч
    </p>
    <div class="vit-buy">
      <div class="btn-buy ready-1 status-1 buy-1000663 no-print">
        <div class="no-print ready btn" onclick="btn_buy(1000663);">
          <svg><use xlink:href="#v-basket"></use></svg>В корзину
        </div>
        <span class="status stat-1">есть в наличии</span>
      </div>
    </div>
    <span class="price vit-cost"
      ><zl>7</zl><zj>0</zj><zf>9</zf><zy>4</zy><zf>5</zf><zr>0</zr><zb>8</zb
      ><zu>3</zu><zx>9</zx><zv>6</zv><ze>1</ze><zz>9</zz><ze>9</ze><zo>6</zo
      ><zu>9</zu>&nbsp;грн</span
    ><br /><span class="warr"
      ><a target="_blank" href="/faq.html#q17">Гарантия:</a>&nbsp;12 мес.</span
    ><br /><span
      product="1000663"
      class="icon-eye view-rest internal-link link no-print"
      ><svg><use xlink:href="#v-avail"></use></svg>Посмотреть наличие</span
    ><br /><a
      class="icon-mail notify no-print"
      href="/?module=profile&amp;tab=subscribe&amp;add=1000663"
      ><svg><use xlink:href="#v-notify"></use></svg>Уведомить</a
    ><br /><a
      class="icon-reviews no-print"
      href="/cell_phones/mobile_phone_samsung_a207f_galaxy_a20s_32_duos_red_sm-a207fzrdsek.html#reviews"
      ><svg><use xlink:href="#v-reviews"></use></svg>Отзывы (0)</a
    ><br /><span product="1000663" class="tovar-wishlist no-print"
      ><svg><use xlink:href="#v-wish"></use></svg></span
    ><br /><span class="catalog-tovar-id">Код товара: 1000663</span><br /><span
      compare_id="lg47"
      parent_id="97516"
      class="no-print tovar-compare add-link"
      >Добавить к сравнению</span
    >
  </section>
</li>

通常只有第一轮测试通过,但是在我重新运行测试后,问题就会出现(但是我不确定)。

我想我做错了什么,因为这不是单击元素不会触发GET XHR请求的唯一站点(嗯,我触发了,但只触发了其中一些)。我尝试了另一个逻辑非常相似的站点,但出现了相同的问题。

请帮助。

1 个答案:

答案 0 :(得分:0)

此问题已解决:https://github.com/cypress-io/cypress/issues/8224 当元素cy.get(".vit-item").eq(index).find(".tovar-compare")可见且可单击时,赛普拉斯会找到该元素,但并非所有EventListener都已附加到该元素。您可以在cypress-pipe插件的帮助下解决这种情况