首先,我确定之前已经问过这个问题,但是我缺乏足够的词汇来找到我正在寻找的答案。抱歉新手问题,并提前感谢您的帮助。
所以我正在创建一个python测试Web应用程序抽象层,用于未来的测试用例。我遇到的问题是我正在测试的Web应用程序是巨大的,我的课程正在失控。到目前为止,我创建的代码就是这样......
app = ApplicationUi(browser=Chrome)
app.login(USER, PASS)
app.menu_network_settings()
app.network_dns3("192.168.1.1")
app.network_save()
app.menu_user_settings()
app.user_change_password(USER, PASS)
app.logout()
所以一切正常,我正在摒弃定义所有方法,事情进展顺利。我担心的问题是这个配置应用程序中有数千个元素,我想把它分解成更小的文件。然而,我并不是最好的方法。例如,这里有一些代码结构。
class ApplicationUi(object):
def __init__(self, url, browser="chrome"):
display = Display(visible=0, size=(1366, 1920))
display.start()
self.driver = _driver_init(browser)
self.driver.set_window_size(1366, 1920)
self.driver.get(url)
time.sleep(BASE_SLEEP)
def __del__(self):
if "driver" in self.__dict__.keys():
self.driver.close()
def logon(self, user, passwd):
self.driver.find_element_by_xpath('//*[@id="userName"]').send_keys(user)
self.driver.find_element_by_xpath('//*[@id="password"]').send_keys(passwd)
self.driver.find_element_by_xpath('//*[@id="buttonid"]').click()
time.sleep(BASE_SLEEP)
def menu_audit(self):
self.driver.find_element_by_xpath('//*[@id="toolsMenu"]/span').click()
time.sleep(BASE_SLEEP)
def menu_resources(self):
self.driver.find_element_by_xpath('//*[@id="PrimaryNavigationCollapse"]/ul/li[2]/ul/li[1]/ul/li[1]').click()
time.sleep(BASE_SLEEP)
def menu_notifications(self):
self.driver.find_element_by_xpath('//*[@id="PrimaryNavigationCollapse"]/ul/li[2]/ul/li[1]/ul/li[2]').click()
time.sleep(BASE_SLEEP)
def menu_audit(self):
self.driver.find_element_by_xpath('//*[@id="PrimaryNavigationCollapse"]/ul/li[2]/ul/li[1]/ul/li[3]').click()
time.sleep(BASE_SLEEP)
def menu_network(self):
self.driver.find_element_by_xpath('//*[@id="PrimaryNavigationCollapse"]/ul/li[2]/ul/li[1]/ul/li[4]').click()
time.sleep(BASE_SLEEP)
def menu_emailer(self):
self.driver.find_element_by_xpath('//*[@id="PrimaryNavigationCollapse"]/ul/li[2]/ul/li[1]/ul/li[5]').click()
time.sleep(BASE_SLEEP)
所以问题是将菜单和网络部分移动到自己的文件的最佳方法是什么?
我意识到我可以拥有一个只有驱动程序初始化和登录的基类,并且每个其他部分都有一个子类,但这会将我的用户代码更改为类似的内容
net = NetworkPage(BROWSER, USER, PASS)
net.dns3("192.168.1.1")
net.save()
users = UsersPage(BROWSER, USER, PASS)
users.change_password(user, password)
如果可能的话,我想保留它的使用方式,但我不确定如何实现。
我也意识到我可以将它切换到一个模块,这将允许我想要的结构,但然后(我认为)我将无法多次实例化它(用于模拟多个用户连接)。
再次感谢。