0

I have created a codeceptJS project by following the mobile testing setup steps located here: https://codecept.io/mobile/#setting-up

So far, I'm unable to test any apps via simulator; I instead get the following error:

1) login
      I should be able to login with the correct username and password:

      >> The requested resource could not be found, or a request was received using an HTTP method that is not supported by the mapped resource <<
      
      at Object.getErrorFromResponseBody (node_modules/webdriver/build/utils.js:189:12)
      at NodeJSRequest._request (node_modules/webdriver/build/request/index.js:157:31)
      at processTicksAndRejections (internal/process/task_queues.js:93:5)

I have verified my appium config using appium-doctor, and there are no issues found.

My codecept.conf.js is as follows:

const path = require('path');
const { setHeadlessWhen } = require('@codeceptjs/configure');

// turn on headless mode when running with HEADLESS=true environment variable
// export HEADLESS=true && npx codeceptjs run
setHeadlessWhen(process.env.HEADLESS);

exports.config = {
  tests: './*_test.js',
  output: './output',
  helpers: {
    Appium: {
      platform: 'Android',
      device: 'emulator',
      desiredCapabilities: {
        avd: 'Pixel_5_API_28',
        app: path.resolve('./sample_apps/Android.apk'),
        appActivity: 'com.swaglabsmobileapp.MainActivity'
      }
    },
  },
  include: {
    I: './steps_file.js'
  },
  bootstrap: null,
  mocha: {},
  name: 'appium-codecept-android-POC',
  plugins: {
    pauseOnFail: {},
    retryFailedStep: {
      enabled: true
    },
    tryTo: {
      enabled: true
    },
    screenshotOnFail: {
      enabled: true
    }
  }
}

And here's my package.json as created by codeceptjs init:

{
  "name": "appium-codecept-android-POC",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "codeceptjs": "^3.0.7",
    "webdriverio": "^7.9.0"
  }
}

Finally, my test file is as follows:

Feature('login');

Scenario('I should be able to login with the correct username and password', ({ I }) => {
  setTimeout(() => {
    I.see('Username');
  }, 3000);
  I.click('//android.widget.EditText[@content-desc="test-Username"]');
  I.fillField('//android.widget.EditText[@content-desc="test-Username"]', 'standard_user');
  I.click('//android.widget.EditText[@content-desc="test-Password"]');
  I.fillField('//android.widget.EditText[@content-desc="test-Password"]', 'secret_sauce');
  I.click('//android.view.ViewGroup[@content-desc="test-LOGIN"]');
  I.waitForElement('//android.view.ViewGroup[@content-desc="test-Cart drop zone"]/android.view.ViewGroup/android.widget.TextView', 3)
  I.dontSeeElement('//android.view.ViewGroup[@content-desc="test-Error message"]/android.widget.TextView');
});

Scenario('I should not be able to login with an incorrect username or password', ({ I }) => {
  setTimeout(() => {
    I.see('Username');
  }, 3000);
  I.click('//android.widget.EditText[@content-desc="test-Username"]');
  I.fillField('//android.widget.EditText[@content-desc="test-Username"]', 'bob');
  I.click('//android.widget.EditText[@content-desc="test-Password"]');
  I.fillField('//android.widget.EditText[@content-desc="test-Password"]', 'secret_sauce');
  I.click('//android.view.ViewGroup[@content-desc="test-LOGIN"]');
  I.waitForElement('//android.view.ViewGroup[@content-desc="test-Cart drop zone"]/android.view.ViewGroup/android.widget.TextView', 3)
  I.dontSeeElement('//android.view.ViewGroup[@content-desc="test-Error message"]/android.widget.TextView');
});

Scenario('I should be able to see details', ({ I }) => {
  // login
  setTimeout(() => {
    I.see('Username');
  }, 3000);
  I.click('//android.widget.EditText[@content-desc="test-Username"]');
  I.fillField('//android.widget.EditText[@content-desc="test-Username"]', 'standard_user');
  I.click('//android.widget.EditText[@content-desc="test-Password"]');
  I.fillField('//android.widget.EditText[@content-desc="test-Password"]', 'secret_sauce');
  I.click('//android.view.ViewGroup[@content-desc="test-LOGIN"]');
  I.waitForElement('//android.view.ViewGroup[@content-desc="test-Cart drop zone"]/android.view.ViewGroup/android.widget.TextView', 3)

  // should be able to click a label to see details
  I.click('(//android.widget.TextView[@content-desc="test-Item title"])[2]');
  I.seeElement('//android.view.ViewGroup[@content-desc="test-Description"]/android.widget.TextView[2]');
  I.click('//android.view.ViewGroup[@content-desc="test-BACK TO PRODUCTS"]');
});

I'm at a loss here, as I haven't done anything except follow the setup instructions. Executing against ios works; it is only the android execution that fails. Appium is installed and running, env vars are set, etc. Any help would be appreciated, as this could be a deal breaker for me in terms of whether or not I can use codeceptjs. I love the project and really want to use it, but I must be able to test both ios and android native apps.

One final note: If anyone wants to try this config, the app I am using for the above test can be found here: https://github.com/saucelabs/sample-app-mobile/releases/download/2.7.1/Android.SauceLabs.Mobile.Sample.app.2.7.1.apk

Thomas W Tupper
  • 625
  • 1
  • 6
  • 17

0 Answers0