我是自动化测试的新手。我正在训练赛普拉斯实现自动化,但我遇到的问题是,在赛普拉斯的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> грн</span
><br /><span class="warr"
><a target="_blank" href="/faq.html#q17">Гарантия:</a> 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&tab=subscribe&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请求的唯一站点(嗯,我触发了,但只触发了其中一些)。我尝试了另一个逻辑非常相似的站点,但出现了相同的问题。
请帮助。
答案 0 :(得分:0)
此问题已解决:https://github.com/cypress-io/cypress/issues/8224
当元素cy.get(".vit-item").eq(index).find(".tovar-compare")
可见且可单击时,赛普拉斯会找到该元素,但并非所有EventListener都已附加到该元素。您可以在cypress-pipe
插件的帮助下解决这种情况