赛普拉斯为什么找不到我的H1元素?

时间:2019-04-30 08:40:15

标签: javascript cypress end-to-end

我有一些针对网站的端到端测试,这些测试是使用Cypress.io v3.2.0用Javascript实现的。我的测试步骤之一是这样实现的:

cy.get('h1#feed_header_id').contains('אביזרי');  //('אביזרי' is in Hebrew)

当我在赛普拉斯GUI中运行测试时,它在CONTAINS步骤上失败了。但是,当我单击日志中的CONTAINS步骤时,快照清楚地显示了其中带有文本“אביזרי”的H1元素。

截屏:

请注意:该元素为:<h1 id="feed_header_id">אביזרי רכב</h1>,并且是页面中唯一具有此ID的元素。

当元素和文本清晰可见时,为什么赛普拉斯无法在元素中找到文本?

3 个答案:

答案 0 :(得分:0)

您可能有多个具有相同文本的元素。 尝试cy.get('#feed_header_id').find('h1').contains('אביזרי');

答案 1 :(得分:0)

我强烈怀疑应该归咎于测试工具。

某些测试工具在RTL语言方面存在问题,并且它们颠倒了字母的顺序。更糟糕的是,如果字符串中包含拉丁字母,数字或标点符号,它也会同时转换字符串。

我建议尝试:

cy.get('h1#feed_header_id').contains('ירזיבא');

答案 2 :(得分:0)

您可以使用备用的“包含”命令

cy.contains('#feed_header_id', 'אביזרי');

原因是cy.get(...).contains(...)不等待异步 content

get()部分具有自动重试功能,但是id选择器在html中进行了硬编码,因此get()立即成功(在xhr返回其值之前),然后对该元素的内容进行测试(最初为空)。

上面的替代语法将自动重试应用于选择器和内容。

这是我用来确保不是由于RTL语言功能引起的快速测试。

规范-包含-rtl.js

describe('contains', () => {
  it('waits for content', () => {
    cy.visit('app/hebrew-calendar.html').then(x => console.log('x', x))
    // cy.get('h1#feed_header_id').contains('כ״ט בְּאִיָּר תשע״א');
    cy.contains('h1#feed_header_id', 'כ״ט בְּאִיָּר תשע״א');
  })
})

示例页面-hebrew-calendar.html

<h1 id="feed_header_id"></h1>

<script>
  var xhr = new XMLHttpRequest();
  xhr.open('GET', 'https://www.hebcal.com/converter/?cfg=json&gy=2011&gm=6&gd=2&g2h=1', true);

  xhr.onload = function () {
    const hebrewDate = JSON.parse(xhr.response).hebrew;
    const el = document.querySelector('h1#feed_header_id');
    el.textContent = hebrewDate;
  };

  xhr.send(null);
</script>
相关问题