0

我已经使用带有 Appium 的工具创建了一个自动化框架,它适用于 IOS 和 Android。Toolium 是我用来促进页面对象建模的python 包装器。基本上,UI 与测试用例是分开的,因此可以在 android 和 IOS 上使用相同的测试用例。

我现在需要让框架与 IOS 10 一起工作(使用 XCUI 测试框架)。所以我改变了IOS的元素以支持XCUI(使用XPATH的地方,没有其他元素识别方法)。文件夹结构/执行机制没有任何变化。但是使用新框架时,我从 toolium 收到了一个导入错误。

工具移动页面 objects.py 中的代码看起来像这样。

# -*- coding: utf-8 -*-

import importlib

from toolium.driver_wrapper import DriverWrappersPool
from toolium.pageobjects.page_object import PageObject


class MobilePageObject(PageObject):
    def __new__(cls, driver_wrapper=None):
    """Instantiate android or ios page object from base page object depending on driver configuration

    Base, Android and iOS page objects must be defined with following structure:
        FOLDER/base/MODULE_NAME.py
            class BasePAGE_OBJECT_NAME(MobilePageObject)
        FOLDER/android/MODULE_NAME.py
            class AndroidPAGE_OBJECT_NAME(BasePAGE_OBJECT_NAME)
        FOLDER/ios/MODULE_NAME.py
            class IosPAGE_OBJECT_NAME(BasePAGE_OBJECT_NAME)

    :param driver_wrapper: driver wrapper instance
    :returns: android or ios page object instance
    """
    if cls.__name__.startswith('Base'):
        __driver_wrapper = driver_wrapper if driver_wrapper else DriverWrappersPool.get_default_wrapper()
        __os_name = 'ios' if __driver_wrapper.is_ios_test() else 'android'
        __class_name = cls.__name__.replace('Base', __os_name.capitalize())            
        try:        
            return getattr(importlib.import_module(cls.__module__), __class_name)(__driver_wrapper)

        except AttributeError:
            __module_name = cls.__module__.replace('.base.', '.{}.'.format(__os_name))
            print __module_name
            print __class_name
            print __driver_wrapper
            return getattr(importlib.import_module(__module_name), __class_name)(__driver_wrapper)

    else: 
        return super(MobilePageObject, cls).__new__(cls)

我遵循 toolium 中提到的文件夹结构。基本上我有,pageobjects 文件夹下我有基本文件夹,ios 文件夹和 android 文件夹。我所有的方法都在基类中。这些元素在运行时根据驱动程序类型从 iOS 文件夹或 android 文件夹中获取。

以下是导入模块的错误

名称 = 'pageobjects.ios.intro',包 = 无

def import_module(name, package=None):
    """Import a module.

    The 'package' argument is required when performing a relative import. It
    specifies the package to use as the anchor point from which to resolve the
    relative import to an absolute import.

    """
    if name.startswith('.'):
        if not package:
            raise TypeError("relative imports require the 'package' argument")
        level = 0
        for character in name:
            if character != '.':
                break
            level += 1
        name = _resolve_name(name[level:], package, level)
  __import__(name)

E ImportError: 没有名为 ios.intro 的模块

当我打印模块名称和类名称时,这就是我得到的。

module name = pageobjects.ios.intro
class name = IosIntroduction

介绍基本上是模块之一。我像这样访问它

from pageobjects.base.intro import BaseIntroduction

在同一台机器上,我的旧框架可以正常工作。我已经检查了环境变量/权限等。但我似乎无法弄清楚导入失败的原因。

PS:我在 MACOSX 上运行它并且还使用了 python 的虚拟环境

4

0 回答 0