1.因为登录功能的用例只需要打开和关闭一次游览器,故可将webdriver步骤创建在一个fixture(脚手架)中
一.共享夹具的使用
1.conftest.py为pytest的共享夹具,pytest自动发现并执行
2.在test_cases文件夹中新建conftest.py模块
importpytestfromseleniumimportwebdriver @pytest.fixture(scope='class')defdriver():withwebdriver.Chrome()aswd:# 最大化游览器wd.maximize_window()# 返回游览器对象,不能使用return,return返回之后会关闭游览器,无法进行后续操作yieldwd
3.登录模块使用共享夹具,修改test_cases文件夹下test_login.py文件,修改后内容
fromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasEC importsettings classTestLogin:# 传入夹具名称driver,pytest自动发现并调用deftest_login_success(self,driver):'''测试登录成功'''# 1.访问登录页面driver.get(settings.PROJECT_HOST+settings.INTERFACE['login'])# 2.输入用户名和密码# 2.1 定位输入框# 定义元素等待时间wait=WebDriverWait(driver,timeout=3)username_input=wait.until(EC.visibility_of_element_located(('xpath','//input[@name="username"]')))# 2.2 输入用户名username_input.send_keys(settings.TEST_NORMAL_USERNAME)# 2.3 定位密码框、输入密码wait.until(EC.visibility_of_element_located(('xpath','//input[@name="password"]'))).send_keys(settings.TEST_NORMAL_PASSWORD)# 3.点击登录wait.until(EC.visibility_of_element_located(('xpath','//a[@name="sbtbutton"]'))).click()# 4.断言是否登录成功# 断言标准怎么简单怎么来,怎么可靠怎么来,没有固定的模式,要灵活# 本案例中,就是判断是否出现退出按钮assertwait.until(EC.visibility_of_element_located(('xpath','//a[@title="退出"]')))
4.混合夹具的使用
4.1.在pytest中,可以使用不同风格的夹具4.2.当需要在一个测试类的测试执行前后输出日志时,使用pytest风格的夹具难以实现该功能,可以通过unittest或者xunit风格实现
4.3.登录模块混合夹具的使用:修改test_cases文件夹下test_login.py文件,将常用模块绑定到类属性,定义前后置内容,通过对象方法调用常用模块
fromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasEC importsettingsfromcommonimportlogger classTestLogin:name='登录功能'logger=logger settings=settings # xunit风格的前置后置@classmethoddefsetup_class(cls):cls.logger.info('======={}测试开始======'.format(cls.name))@classmethoddefteardown_class(cls):cls.logger.info('======={}测试结束======'.format(cls.name))# 传入夹具名称driver,pytest自动发现并调用deftest_login_success(self,driver):'''测试登录成功'''# 1.访问登录页面driver.get(self.settings.PROJECT_HOST+self.settings.INTERFACE['login'])# 2.输入用户名和密码# 2.1 定位输入框# 定义元素等待时间wait=WebDriverWait(driver,timeout=3)username_input=wait.until(EC.visibility_of_element_located(('xpath','//input[@name="username"]')))# 2.2 输入用户名username_input.send_keys(self.settings.TEST_NORMAL_USERNAME)# 2.3 定位密码框、输入密码wait.until(EC.visibility_of_element_located(('xpath','//input[@name="password"]'))).send_keys(self.settings.TEST_NORMAL_PASSWORD)# 3.点击登录wait.until(EC.visibility_of_element_located(('xpath','//a[@name="sbtbutton"]'))).click()# 4.断言是否登录成功# 断言标准怎么简单怎么来,怎么可靠怎么来,没有固定的模式,要灵活# 本案例中,就是判断是否出现退出按钮assertwait.until(EC.visibility_of_element_located(('xpath','//a[@title="退出"]')))
5.测试用例基类的抽取:可以将公用代码抽取到基类中,并将公共模块绑定到类属性中
6.测试用例基类的编写:测试模块前后置打印内容一致,故在test_cases文件夹下新建base_case.py文件
importsettingsfromcommonimportloggerclassBaseCase:''' 测试用例基类 '''# 测试套名称name=Nonelogger=logger settings=settings# xunit风格的前置后置@classmethoddefsetup_class(cls):cls.logger.info('======={}测试开始======'.format(cls.name))@classmethoddefteardown_class(cls):cls.logger.info('======={}测试结束======'.format(cls.name))
7.测试用例基类的使用:使测试用例继承BaseCase类实现公共模块的复用,修改test_cases文件夹下的test_login.py文件
fromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasECfromtest_cases.base_caseimportBaseCase# 继承基类classTestLogin(BaseCase):name='登录功能'# 传入夹具名称driver,pytest自动发现并调用deftest_login_success(self,driver):'''测试登录成功'''# 1.访问登录页面driver.get(self.settings.PROJECT_HOST+self.settings.INTERFACE['login'])# 2.输入用户名和密码# 2.1 定位输入框# 定义元素等待时间wait=WebDriverWait(driver,timeout=3)username_input=wait.until(EC.visibility_of_element_located(('xpath','//input[@name="username"]')))# 2.2 输入用户名username_input.send_keys(self.settings.TEST_NORMAL_USERNAME)# 2.3 定位密码框、输入密码wait.until(EC.visibility_of_element_located(('xpath','//input[@name="password"]'))).send_keys(self.settings.TEST_NORMAL_PASSWORD)# 3.点击登录wait.until(EC.visibility_of_element_located(('xpath','//a[@name="sbtbutton"]'))).click()# 4.断言是否登录成功# 断言标准怎么简单怎么来,怎么可靠怎么来,没有固定的模式,要灵活# 本案例中,就是判断是否出现退出按钮assertwait.until(EC.visibility_of_element_located(('xpath','//a[@title="退出"]')))
7.1.通过运行main.py入口文件可执行用例7.2.至此,简单的ui自动化框架搭建完成,后续对框架进行优化