# WebdriverIO - Wait Commands Example

If you have had some experience with Automated testing, I'm sure you've had to deal with flaky/unstable tests. 
Some of these unstable tests can be fixed by utilizing the right wait commands, let's take a look at a couple of examples below...

#### 1. waitForDisplayed
`waitForDisplayed` is one of the most commonly used wait commands, it waits for an element to be displayed or not be displayed on the screen for 'X' amount of milliseconds. 

**Scenario**: Wait for *'Watches'* link to be displayed after hovering over the *'Fashion'* link on the [eBay](https://www.ebay.com/) site. (see gif below)

<img src="https://media.giphy.com/media/H5B31De7UbrxrI5jG1/giphy.gif" width="600" height="400"/>

*Note: I'm using Page Object Model in my example below. To learn more about POM you can take a look at my video [here](https://www.youtube.com/watch?v=kUF_ipMs3us).*

```javascript
  it('should click on watches link', () => {
    // open the ebay site
    WatchesPage.open();

    // hover over the fashion link
    WatchesPage.fashionLink.moveTo();

    // wait for max 5 secs for watches link to be displayed after hovering over the fashion link
    WatchesPage.watchesLink.waitForDisplayed({ timeout: 5000 });

    // once displayed, click on the watches link
    WatchesPage.watchesLink.click();
  });
```

#### 2. waitUntil
`waitUntil` is used to wait conditionally, once the condition fulfills, it moves on to the next action. 

**Scenario**: Wait for *'All Categories'* text in the drop-down to change to "PC laptops & Notebooks" text after searching for the *'Laptop'* keyword on the [eBay](https://www.ebay.com/) site. (see gif below)

<img src="https://media.giphy.com/media/kGEwYhNXjWtPwvN8tO/giphy.gif" width="600"/>

```javascript
  it('should update the search category', () => {
    browser.waitUntil(
      function () {
        // get text for the search category selector
        // and check if it matches the expected text
        return SearchPage.category.getText() === 'PC Laptops & Netbooks';
      },
      // wait for 3 seconds for condition to fulfill
      { timeout: 3000 }
    );
    // add your assertion
    expect(SearchPage.category).toHaveText('PC Laptops & Netbooks');
  });

```

Similarly, you can use other wait commands provided by WebdriverIO for different scenarios such as `waitForClickable`, `waitForDisplayed` etc.. You can find all the commands in their [API docs](https://webdriver.io/docs/api.html).

💎 This code is also available on [GitHub](https://github.com/automationbro/webdriverio-tutorial/tree/wait-commands-11) for you to access and play around with.

---

#### You can also check out the video below that will show you a detailed explanation of the code above.

<iframe width="560" height="315" src="https://www.youtube.com/embed/JCXSCeSs76A" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

---

#### To learn more about WebdriverIO, you can check out my free tutorial series here -
https://www.youtube.com/watch?v=e8goAKb6CC0&list=PL6AdzyjjD5HBbt9amjf3wIVMaobb28ZYN.
