Description
What problem does this feature solve?
It should be possible to find nodes by the text they contain. For example when I want to click the logout link in my component:
<template>
<a href="/my_account">My Account</a>
<a @click="logout">Logout</a>
</template>
Currently, I can do this:
wrapper.findAll("a").at(1).trigger("click")
I dislike using findAll.at
because requires the test to know the order of the links. For my test I don't care about the order, but I just want to click on the link with the text "Logout".
If later the component changes and the order is rearranged or a new a
-tag is inserted, I have to change my test, even though it has nothing to do with the order.
Second option is to use findAll
with a filter
:
wrapper.findAll("a").filter(node => node.text().match(/Logout/)).at(0).trigger("click")
This works, but is really cumbersome to write for such a simple thing. I would expect an easier method to be provided.
What does the proposed API look like?
I come from ruby where it is simply an option to the find
or findAll
call:
wrapper.findAll("a", { text: "Logout" }) // find all `a` which contain the text
wrapper.find("a", { text: "Logout" }) // find the first `a` which contains the text
There could be a second option exactText
which only finds element where the text is exactly the one provided.
wrapper.find("a", { exactText: "Log" }) // will not find `<a>Logout</a>`
wrapper.find("a", { text: "Log" }) // will find `<a>Logout</a>`
A possible way of implementing this with the current provided methods would be:
wrapper.find("a", { text: "Log" })
==>
wrapper.findAll("a").filter(node => node.text().match(/Log/)).at(0)
wrapper.find("a", { exactText: "Log" })
==>
wrapper.findAll("a").filter(node => node.text() == "Log").at(0)
Not sure if there is a more efficient method though.
I think it would be handy to have this filtering by text provided by vue-test-utils directly, since it makes writing tests much easier and error prone.