我已经使用带有 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 的虚拟环境