'AttributeError: 'Context' object has no attribute 'app'

Hello I did not found answer for similar problem so I add new topic. I have problem with bdd + appium using a page object model. When I run my script I have issue:

Traceback (most recent call last):
  File "/home/mimy/.local/lib/python3.8/site-packages/behave/model.py", line 1329, in run
    match.run(runner.context)
  File "/home/mimy/.local/lib/python3.8/site-packages/behave/matchers.py", line 98, in run
    self.func(context, *args, **kwargs)
  File "features/steps/allow_to_app_steps.py", line 6, in tap_allow_when_using_app
    context.app.launch_page.tap_allow_button()
  File "/home/mimy/.local/lib/python3.8/site-packages/behave/runner.py", line 321, in __getattr__
    raise AttributeError(msg)
AttributeError: 'Context' object has no attribute 'app'

My environment.py file looks like this:

from appium import webdriver
from app.application import Application


def before_scenario(context, scenario):
    desired_capabilities = {
        "platformName": "Android",
        "platformVersion": "10",
        "deviceName": "Pixel 2 XL",
        "appPackage": "com.xxx.xxx",
        "appActivity": ".ui.MainActivity",
        "automationName": "UiAutomator2"

    }

    context.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_capabilities=desired_capabilities)
    context.driver.implicitly_wait(5)
    context.app = Application(context.driver)


def after_scenario(context, scenario):
    context.driver.quit()

My steps file looks like this:

from behave import given, when, then, step


@given('I click on the "Allow only while using the app" button')
def tap_allow_when_using_app(context):
    context.app.launch_page.tap_allow_button()



@when('I click on the "Allow" button')
def tap_allow(context):
    context.app.launch_page.tap_allow()

My pages file for my page object model looks like:

###LunchPage###

from selenium.webdriver.common.by import By
from pages.base_page import Page


class LaunchPage(Page):
    dialog_title = (By.XPATH, "//android.widget.TextView[contains(@text,'Allow QSpot to access this device')]")
    allow_only_while_using_the_app = (By.XPATH, "//android.widget.Button[@text='Allow only while using the app']")
    allow = (By.XPATH, "//android.widget.Button[@text='Allow']")

    def tap_allow_button(self):
        self.click(*self.allow_only_while_using_the_app)

    def tap_allow(self):
        self.click(*self.allow)

###BasePage###
class Page:

    def __init__(self, driver):
        self.driver = driver

    def find_element(self, *locator):
        return self.driver.find_element(*locator)

    def click(self, *locator):
        e = self.find_element(*locator)
        e.click()

And class Application

from pages.launch_page import LaunchPage


class Application:

    def __init__(self, driver):
        self.launch_page = LaunchPage(driver)

As I now this issue may be related with "driver was not starting" but I am not able to fix it. Many thanks for help!



Solution 1:[1]

In my case, I missed up names in architecture names. So after changing from "enviroment" to "environment" (missing N). it became alive.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Ilia Pavlov