In this chapter, we spent some time looking at the different sorts of waits and timeouts that are available to you when working with Selenium. We exposed some of the pitfalls of using static waits, such as Thread.sleep(), and implicit waits. We then went into some depth with explicit waits, examining how they work, and how you can create your own. As part of this investigation we explored the fluent wait API; then we learnt how to use and extend both fluent and explicit waits with functions and lambdas. Eventually we came to the conclusion that explicit waits are the solution we should always be aspiring to use. We also explored the effects of mixing up different wait strategies, highlighting the various potential errors that could occur.
In the next chapter, we will be looking at page objects and how we can use them effectively without letting them get...