我有一些针对网站的端到端测试,这些测试是使用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的元素。
当元素和文本清晰可见时,为什么赛普拉斯无法在元素中找到文本?
答案 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>