Javascript Cypress检查主体中不存在字符串,不包括块或div

Javascript Cypress检查主体中不存在字符串,不包括块或div,javascript,cypress,Javascript,Cypress,我有一系列的字符串来检查它们是否存在于不同的页面中;但我不想查一个div 我有好几页要检查字符串“Miami”、“Tampa”、“Naples”、“Orlando”是否存在,但在每个包含 <div class="footer"><h3 class="availability"> We are also available in </h3> <a href=&

我有一系列的字符串来检查它们是否存在于不同的页面中;但我不想查一个div

我有好几页要检查字符串“Miami”、“Tampa”、“Naples”、“Orlando”是否存在,但在每个包含

<div class="footer"><h3 class="availability">
                 We are also available in
            </h3> <a href="..." class="province">
                Miami
            </a><a href="..." class="province">
                Tampa
            </a><a href="..." class="province">
                Naples
            </a><a href="..." class="province">
                Orlando
            </a>
</div>
但是这些测试显然失败了,因为cypress在
div
中找到了这些字符串

有没有办法将其从搜索中排除?我试过了

cy.get('body')
    .not('footer')
    .should('not.contain', 'Miami')
但这不管用


作为一种解决方法,我认为我可以从dom中删除div,但我不确定这是否是一个好主意,而且无论如何我不知道如何在cypress中执行它。

我认为您使用
.not('footer')
的问题是因为您将其指定为
div
,类名为
footer
,而不是声明
footer
元素。正确地将页脚标识为
。页脚
应该可以解决您的问题

cy.get('body')
    .not('.footer')
    .should('not.contain', 'Miami')
为简单起见,您可以使用
as
命令指定
cy.get('body')。而不是('.footer')

cy.get('body').not('.footer').as('bodyNoFooter');
cy.get('@bodyNoFooter').should('not.contain', 'Miami');
cy.get('@bodyNoFooter').should('not.contain', 'Orlando');
cy.get()

与.filter()相反

哪种方法*获取
get()
中找到的所有元素,并过滤掉与
匹配的所有元素

所以在

cy.get('body'))
.not('.footer')//正文上没有类页脚,没有效果
.should('not.contain','Miami')//失败,因为not.contain是递归的
正文
没有
.footer
,因此不会过滤掉任何内容

下一步
.should('not.contain'
搜索
body
的所有子项,其中包括
.footer
,因此测试失败

如果页脚是
正文
直接子项,则可以添加一个
.children()
,使其正常工作


纽约市
迈阿密
cy.get('body'))
.children()//仅限直系后代
.not('.footer')//现在排除.footer
.should('not.contain','Miami')//传递
或者使用相反的逻辑

cy.get('body'))
.find(“.footer”)
.兄弟姐妹()
.should('not.contain','Miami')
如果正文和页脚之间有一个或多个级别,则需要正确地确定该级别的目标


纽约市
迈阿密
cy.get('body'))
.children()//包装器1
.children()//包装器2
.儿童()
.not(“.footer”)//.footer被排除在外
.should('not.contain','Miami')//传递
但这开始看起来很混乱,如果结构发生变化,它就会变得脆弱

基本问题是
.not()
不是递归的,但是
.should('not.contain','Miami')
是递归的。非递归文本检查器可以工作

这是我能想出的最有力的方法

cy.get('body'))
.find('*')//正文的子项-递归
.not('.footer')//排除页脚
.每个($el=>{
cy.wrap($el.contents().get(0.textContent)//仅此元素的文本(非子元素)
.should('not.contain','Miami')//传递
})
在哪里


感谢您的帮助,它实际上是错误的,但无论如何都不起作用;是否有办法
控制台.log
或以某种方式打印排除的元素(例如
bodynoFooter
)?也许我在选择的时候做错了什么,如果我在
页脚
中有其他元素,它们也被排除在外了吗?非常感谢,伙计。我几周前才开始使用Cypress,但我完全不知道所有这些事情。我学到了很多,加上这段代码很有效:我刚刚添加了一个小检查,以避免在divs中没有定义text:
if($el.contents().get(0)){cy.wrap($el.contents().get(0.textContent)).should('not.contain','Miami')}
修改代码也让我有机会了解这些选择器的行为。谢谢!注意:我使用了
children()
版本,因为该网站位于vuejs中,并且使用
。查找('*')
导致在子菜单中进行了大量检查:)还有一个小问题:如果要排除多个块,是否可以链接
。not()
?e、 g.
.not('.footer')。not('header')
?是的,它可以与多个
.not()
一起工作,以排除DOM的不同部分。是的
。查找('*')
有点代码味道。更好的做法是更有选择性地确定目标,对于Vue应用程序,您很可能会有一个
main
来确定目标,而不是
body
,这样就排除了页眉、页脚、菜单等辅助内容。
cy.get('body').not('.footer').as('bodyNoFooter');
cy.get('@bodyNoFooter').should('not.contain', 'Miami');
cy.get('@bodyNoFooter').should('not.contain', 'Orlando');
$el.contents()     // list of element and all child nodes
   .get(0)         // filter just the parent
   .textContent    // get it's text