前言
这里是清安,前一章我们学习了简单的脚本输出,本章我们来将脚本优化优化,可能有一定的难度,但是跟着一步步来,多码几遍问题不大。本章我们直接使用类来编写自动化脚本,也就是所谓的封装。
简简单单的封装
from appium import webdriver from time import sleep class San: def __init__(self,desired_capas): self.ap = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_capas) def login(self): self.ap.find_element_by_id('com.mxchip.project352:id/etPhone').send_keys('18674622237') self.ap.find_elements_by_class_name('android.widget.EditText')[1].send_keys('jx123456') self.ap.find_element_by_id('com.mxchip.project352:id/cbAgree').click() self.ap.find_element_by_xpath('//*[@text="登录"]').click() if __name__ == '__main__': desired_capas = { "deviceName": "emulator-5554", "platformName": "Android", "appPackage": "com.mxchip.project352", "appActivity": "com.mxchip.project352.activity.login.LoginActivity", "platformVersion": "7.1.2", "noReset": "True" } San(desired_capas).login()
如上所示,代码中就是封装了的方法了,对比上一章的简单脚本,你是不是觉得,这样写它的好处,作用在哪。如你所想,此处并没有体现出太多的优点,好处出来。试图往下想想,步骤多了之后也只是显的比较的整洁而已。
❝此处主旨并不是极大程度的优化代码,而是要告诉你,如何封装一个脚本,后续在框架上,这种封装思想就会突显的格外的重要。
❞
再次改进
我们再次对上面的进行改进一下,上面的看着~没太多感觉,复用性不高,从代码量上看,我们可以再缩减一些。我们将上述类直接变成一个方法容器,专门放入一些方法进去,供我们调用。一起来看看吧。
# ----清安—--- # 微信:qing_an_an # 公众号:测个der from appium import webdriver from selenium.webdriver.common.by import By class San: def __init__(self, desired_capas): self.ap = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_capas) def element_(self, loc, ele, num=None): if num: return self.ap.find_elements(loc, ele)[num] else: return self.ap.find_element(loc, ele) def clicks_(self,loc, ele, num=None): if num: self.element_(loc, ele, num).click() else: self.element_(loc, ele).click() def inputs_(self, loc, ele, value, num=None): if num: self.element_(loc, ele, num).send_keys(value) else: self.element_(loc, ele).send_keys(value) if __name__ == '__main__': desired_capas = { "deviceName": "emulator-5554", "platformName": "Android", "appPackage": "com.mxchip.project352", "appActivity": "com.mxchip.project352.activity.login.LoginActivity", "platformVersion": "7.1.2", "noReset": "True" } i = San(desired_capas) i.inputs_(By.ID, 'com.mxchip.project352:id/etPhone', 'qing_an_an') i.inputs_(By.CLASS_NAME, 'android.widget.EditText', 'jx123456', 1) i.clicks_(By.ID,'com.mxchip.project352:id/cbAgree') i.clicks_(By.XPATH,'//*[@text="登录"]')
这里对于初学者或许有些许的复杂,这就是二次封装了,将webdriver里的一些原有的方法,再次写一个类出来,方便自己调用。此外,这里我也没有用上两章所讲的元素方法了,这里用的selenium中的方法。没有安装的可以安装一下。pip install selenium==3.14。selenium的一些方法在appium中依然适用,比如说显示等待、上述例子中所写的方法,只要是支持都可以使用。如果没有name属性,你非得要用,那就显的有点无药可救了。上述的方法没有什么特殊的写法,结合了if-else做了一个判断,因为这里不想写太多的类似的方法了。当然你也可以拆开来写:
def clicks_(self,loc, ele, num): self.element_(loc, ele, num).click() def click_(self,loc, ele): self.element_(loc, ele).click()
上述只是举例,同时也希望能以此,举一反三。
❝最后说一下传值后的走向,例如i.inputs_(By.ID, 'com.mxchip.project352:id/etPhone', 'qing_an_an')
❞
通过类调用了inputs_方法,他会进行一个判断,看时候存在num值,如果传值了那么就会走if,如果没有则会走else,看示例明显没有num,所以,我们走的else,进入到else后继续调用element_方方法,同样的道理,进行判断,传值,并且放回这个方法给到inputs_方法,执行后面的操作,例如我们需要输入值,那么执行send_keys方法。或许你在跑代码的过程中会遇到元素无法操作或者元素找不到的情况,不慌,下一章就会讲到。