Appium 求助!使用 PO 设计模式 Driver 封装后调用问题

martinGz · 2017年12月13日 · 最后由 Jerry li 回复于 2017年12月13日 · 2484 次阅读

以前在 testerhome 上面看到一篇文章:
2015 年 3 月 新秀群作业-- Appium+Python+PO 设计模式 入门笔记(https://testerhome.com/topics/2226PageObject 的模式来写 app 的自动化用例,使用的是 appium+python。)自己也照着这种
自己把 driver 封装在了 AppiumTest 类里面,同时把登录模块也进行封装 LoginAction,运行 test_case 时,提示报错 'WebDriver' object has no attribute 'driver'

代码:
test_login.py

class case_login(unittest.TestCase):

    def setUp(self):
        self.driver = AppiumTest().get_driver()
        print("开始执行登录用例")


    def tearDown(self):
        self.driver.quit()

    def test_clear_login(self):
        LoginAction.Login(self.driver,"","")
        self.assertIsNone(obj=LoginPage.submitForget_loc,msg="用户名为空,登录失败")

if __name__ == "__main__":
    unittest.main(case_login)

LoginAction.py

class LoginAction(object):

    def __init__(self):
        print("login...")

    @staticmethod
    def Login(driver,username,password):
        LoginDriver = LoginPage.Login(driver)
        LoginDriver.userNameObj().send_keys(username)
        LoginDriver.passWordObj().send_keys(password)
        LoginDriver.LoginButtonObj().click()

LoginPage.py

#用户名
username_loc = (By.ID,(ParseConfigurationFile.ParseCofigFile().getOptionValue('login','username')))
# 密码
password_loc = (By.ID,(ParseConfigurationFile.ParseCofigFile().getOptionValue('login','password')))
# 登录按钮
submitLogin_loc = (By.NAME,(ParseConfigurationFile.ParseCofigFile().getOptionValue('login','submitLogin')))
# 忘记密码按钮
submitForget_loc = (By.NAME,(ParseConfigurationFile.ParseCofigFile().getOptionValue('login','submitForget')))

class Login(object):


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

    def userNameObj(self):
        elementObj =Base.find_element(self.driver,username_loc)
        return elementObj

    def passWordObj(self):
        elementObj = Base.find_element(self.driver,password_loc)
        return elementObj

    def LoginButtonObj(self):
        elementObj = Base.find_element(self.driver,submitLogin_loc)
        return elementObj

    def ForgetButtonObj(self):
        elementObj = Base.find_element(self.driver,submitForget_loc)
        return  elementObj

AppiumTest.py

from appium import webdriver
class AppiumTest:
    def __init__(self):

        capabilities = {'platformName': 'Android',
                        'platformVersion': '4.4.2',
                        'deviceName': 'd779f807',  # 通过CMD adb devices获得
                        'app': 'F://AppiumTest//DianJianbao_2017-10-18_1.2.4_official_.apk',# aapt dump badging 电脑中apk的绝对路径
                        'appPackage': 'com.gzkit.dianjianbao',# 导入的APP包名
                        'appActivity': 'com.gzkit.dianjianbao.module.login.LoginActivity',
                        'unicodeKeyboard': True,  # 支持中文输入,会自动安装Unicode 输入法。默认值为 false
                        'resetKeyboard': True  # 在设定了 unicodeKeyboard 关键字的 Unicode 测试结束后,重置输入法到原有状态
                        }
        self.driver = webdriver.Remote('http://localhost:4723/wd/hub', capabilities)
        self.driver.implicitly_wait(30)

    def get_driver(self):
        return self.driver

困扰了一段时间 仍未解决,自己基础不足,恳请大神们指点一下非常感谢。

最后贴上报错信息 orz

Error
Traceback (most recent call last):
  File "C:\Users\zhenggor\AppData\Local\Programs\Python\Python36-32\lib\unittest\case.py", line 59, in testPartExecutor
    yield
  File "C:\Users\zhenggor\AppData\Local\Programs\Python\Python36-32\lib\unittest\case.py", line 605, in run
    testMethod()
  File "C:\Users\zhenggor\Desktop\JianlibaoUnittest1\TestScripts\test_login.py", line 19, in test_01_clear_login
    LoginAction.Login(self.driver,"","")
  File "C:\Users\zhenggor\Desktop\JianlibaoUnittest1\appModules\LoginAction.py", line 12, in Login
    LoginDriver = LoginPage.Login(driver)
  File "C:\Users\zhenggor\Desktop\JianlibaoUnittest1\PageObjects\LoginPage.py", line 20, in __init__
    self.driver = AppiumTest.get_driver(driver)
  File "C:\Users\zhenggor\Desktop\JianlibaoUnittest1\util\AppiumTest.py", line 22, in get_driver
    return self.driver
AttributeError: 'WebDriver' object has no attribute 'driver'
共收到 11 条回复 时间 点赞

提示语已经说了,你的代码少放了一块

人生无限 回复

我把 AppiumTest 的代码也放上来,我单元测试 AppiumTest 是能正常运行的,代码少放一块是什么意思呢,是 WebDriver 没有获取到 driver 吗

self.driver = AppiumTest.get_driver(driver)
改为
self.driver = AppiumTest.get_driver() 试试

Jerry li 回复

你的意思是修改 LoginPage 中代码 但是如果按照你这样改 LoginAction 里面就缺少了一个 driver 参数 应该不是这里的问题😟

martinGz 回复

你看你两个调用到 AppiumTest().get_driver() 方法的地方,一个传了 driver, 一个没有传,说明肯定有一个弄错了。
看你 AppiumTest().get_driver() 的定义是初始化 driver,所以是不需要传入 driver 的。

martinGz · #7 · 2017年12月13日 Author
仅楼主可见
Jerry li 回复

我还是有点不太明白😟 能加个 QQ 具体问一下你吗 谢谢

Jerry li 回复

我 LoginPage 传入的 driver 应该传的是哪个 driver 呢

martinGz 回复

class Login(object):

def init(self,driver):
self.driver = AppiumTest.get_driver(driver)

你把 LoginPage.py 的 self.driver = AppiumTest.get_driver(driver) 改为 self.driver = AppiumTest.get_driver() 试下就知道效果了

martinGz 回复

发现你还写漏了一个 ()

应该是:
self.driver = AppiumTest().get_driver()

自己的代码,多调试调试吧,这样才能找到原因和进步

martinGz 关闭了讨论 01月26日 10:10
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册