Reputation: 2604
Im using Nightwatch for e2e and Im finding these two command a little bit confusing given the name and explanation that comes with them.
.waitForElementVisible: Waits a given time in milliseconds for an element to be visible in the page before performing any other commands or assertions.
What is the meaning of visible?
display:hidden
, position:relative; left:20000px;
, ...? Not actually visible for a user but dom is existing basically..waitForElementPresent: Waits a given time in milliseconds for an element to be present in the page before performing any other commands or assertions.
What is the meaning of present?
Is there any relation/implication between these two command?
A lot of questions but maybe an explanation about how they work would solve all of these small questions...
Sometimes Im just getting errors and Im thinking that it might be my bad understanding of these two commands.
Upvotes: 5
Views: 10959
Reputation: 1139
At the time of my writing, Nightwatch didn't explain the difference between "visible" and "present". After digging their source code, I've noticed:
Both waitForElementVisible
and waitForElementPresent
commands rely on selenium-webdriver
under the hood to search for the first element that matches the given selector. See locator.
However, waitForElementVisible
takes another action in the queue: call this.elementFound()
, which leads to calling this.executeProtocolAction('isElementDisplayed')
This does a bunch of plumbing work under the hood, which eventually leads to calling Selenium's method isDisplayed()
. The function you want to look for in the source code of Selenium is bot.dom.isShown
. The comments are quite detailed regarding what Selenium considers as being "shown". Some common scenrios:
I think the main mistake regarding waitForElementVisible
and waitForElementPresent
is when you use the former because it is commonly used, but your element is in fact not considered visible/shown by Selenium, so the test fails unexpectedly. If you want to assert that the element is in the DOM and don't care whether it is "visible", use waitForElementPresent
.
This is an important point, as sometimes your test may fail because the element is in the DOM, but not visible on the web page, and you incorrectly waitForElementVisible
, while you should have gone for waitForElementPresnet
.
Upvotes: 0
Reputation: 51
Basically an element might be present (as in loaded in DOM) but not visible (e.g. out of view so you might need to scroll to see it, or it might be hidden).
If you want to perform an action like a click on an element then you want to be using 'visible'.
Upvotes: 0
Reputation: 626
What is problem with definition ? You already answer your question.
An element position in the footer, you need to scroll to see it, is it considered visible?
Does it mean visible in the DOM even if it is display:hidden, position:relative; left:20000px;, ...? Not actually visible for a user but dom is existing basically.
If an element return truth for .waitForElementVisible does it imply that .waitForElementPresent will return true?
For usage , you can check out my an example answer here,it might help .
Upvotes: 1