老师,想在同一个框架中支持appium driver和selenium driver,那就要在初始化的时候同时初始化然后通过某一些参数来决定该怎么初始化,请问如何实现更好呢?
使用简单工厂模式实现比较好
可以再具体一些吗
你可以去看看工厂模式具体是咋样的,看看你有没有思路
老师,我自己设计的思路如下,麻烦您帮看看,我好改进:
1、有一个Pyweb的类用来初始化driver(这个地方初始化的时候会根据参数进行区分)
def init(self, mobile_mode=False):
if mobile_mode:
self.driver = webdriver.Remote(‘http://127.0.0.1:4723/wd/hub’, desired_capabilities=caps)
# init operator
self.operator = AppiumOperator(self.driver)
else:
# init selenium driver and init selenium operator
2、还有另外的三个类是进行元素操作的封装(Operator类-appium和selenium相同操作,AppOperator类继承Operator是appium元素特有的操作,SeleniumOperator类继承Operator是selenium的特有操作)
Operator class:
def init(self, driver):
self.driver = driver
def get_element(self, locator):
#解析locator并调用不同的By
3、在实现Operator操作的时候需要driver调用方法(比如selenium driver调用selenium的方法),所以就在pyweb初始化不同driver的时候,同时会初始化不同的operator(使用不同的driver参数初始化)
4、在脚本实现的时候如下:
web = Pyweb(mobileMode = True).operator
ele = web.get_element(“id=>id_value”)
ele.click()
assert_that().is_equal()
我的想法是这样的,你看看:
class AppiumOperator(Operator):
def __init__(driver):
#这里可以调用父类的init方法,初始化driver,代码还可以优化
self._driver=driver
def click(*location):
self._driver.click(*location)
# 其他方法省略 ....
class SeleniumOperator(Operator):
def __init__(driver):
self._driver=driver
def click(*location):
self._driver.click(*location)
# 其他方法省略 ...
其实这两个方法是一样的,都可以在Operator里面实现,然后调用父类的方法,传不同的driver就好了,我们假设两个方法不一样,属于特有的方法
简单工厂方法:
class SimpleFactory():
def __init__(flag):
self._flag=flag
def creat_driver():
if flag=="web":
#web driver 初始化
return web_driver
#可能还有其他的驱动
else:
return appium_driver
测试函数:
driver=SimpleFactory("web").creat_driver()
#省略操作
只写了一个大概的思路,希望你能看懂
老师,我又修改了一版,思想是仍然是按照Factory在case获取driver,底层的driver的init和operator分开。大概的文件和类如下:
1、Driver类:
放在driver.py,有AppiumDriver和SeleniumDriver类,主要功能是根据配置文件初始化driver
2、Operator类:
放element和driver的一些操作,BaseOperator放一些通用的操作,AppiumOperator和SeleniumOperator分别放特有的操作,如下
3、PyWeb类:相当于factory类,根据不同的参数产生不同的driver和对应的operator
4、在脚本中的应用如下:
老师,麻烦帮做一下review,有什么问题,我再改进,谢谢
driver这一层没啥问题了,脚本中的具体操作你就自己再封装一下咯