RickNotTheMorty
RickNotTheMorty

Reputation: 13

Non of the webdriverio methods work to wait until an element is shown using Appium & WebDriverIO (JavaScript)

I am trying to write a test case use in JavaScript with webdriverio (using appium server) for a native android app.

My test case requires me to log in the app, and after logging (which takes 3-4 seconds) I should click a button (element). I tried all of the WebDriverIO APIs like waitForDisplayed, isDisplayed(), non of them work, most the time the error message is that :

  TypeError: client.element(...).waitForDisplayed is not a function
      at Context.<anonymous> (test-auto-obi-copy.js:142:14)
      at processImmediate (internal/timers.js:439:21)
      at process.topLevelDomainCallback (domain.js:130:23)

Here is the WebDriverIO Documentation for waitForDisplayed https://webdriver.io/docs/api/element/waitForClickable.html

My code looks like this:

it("should press the profile button", function () {
    return client
    .element('android=new UiSelector().resourceId("com.example.dev:id/nav_graph_profile")')
    .waitForDisplayed(undefined, true)
    .click('android=new UiSelector().resourceId("com.example.dev:id/nav_graph_profile")')
    .then( function() {
        //whatever
    })
})

The login test completes succesfully, but after the LOG-IN button is pressed I want to make my test suite "sleep" until the next page loads, to achieve this I was trying to wait until this particular Profile button (element) becomes available, but it seems impossible to wait for it.

Can anyone suggest me what to do in this case, how can I wait?

Upvotes: 1

Views: 6029

Answers (1)

Shiny
Shiny

Reputation: 5055

WebDriverIO changed the names of some of their functions when moving from v4 -> v5 .waitForDisplayed() was one of them, as seen in the changelogs.

  • WebdriverIO v4 -> .waitForVisible()
  • WebdriverIO v5 -> .waitForDisplayed()

There's a fair few functions that changed names slightly, so it's worth a look - Additionally, the Docs for v4 still exist though are a little harder to search - Here is the entry for .waitForVisible()

Also, by passing undefined as the first parameter, your delay will only wait for the default 500ms. You'll probably want something like this instead

.waitForDisplayed(5000, true)

Upvotes: 2

Related Questions