一:简化
1. 新建common 包 新建diver.py
封装浏览器驱动类
from selenium import webdriverclass Driver():"""浏览器驱动类定义 一个【获取浏览器驱动对象driver的方法】。支持多种类型浏览器"""def get_driver(self,browser_type):if browser_type == 'chrome':self.driver = webdriver.Chrome()elif browser_type == 'Firefox':self.driver = webdriver.Firefox()# 最大化窗口、隐式等待、最大加载时长self.driver.maximize_window()self.driver.implicitly_wait(20)self.driver.set_page_load_timeout(20) # 页面加载时长, 超时则停止,避免因页面加载过慢而拖延整个测试流程return self.driver
新建configs包,config.py
把超时时间,隐式等待时间写到配置里
两种写配置的方式,都行
# 页面允许超时时间 小技巧 按 ctrl +shift +U, 可以转大写
SET_PAGE_LOAD_TIMEOUT = 20# 默认浏览器类型
DEF_BROWSER_TYPE = 'chrome'
我用第二种方式,那么在driver.py 中,就这么导入
from configs.config import SET_PAGE_LOAD_TIMEOUT,DEF_BROWSER_TYPE
driver.py 中,引入config的配置的时间,引用config中配置的浏览器类型
from selenium import webdriver
from configs.config import SET_PAGE_LOAD_TIMEOUT,DEF_BROWSER_TYPE
class Driver():"""浏览器驱动类定义 一个【获取浏览器驱动对象driver的方法】。支持多种类型浏览器"""def get_driver(self,browser_type = DEF_BROWSER_TYPE):if browser_type == 'chrome':self.driver = webdriver.Chrome()elif browser_type == 'Firefox':self.driver = webdriver.Firefox()# 最大化窗口、隐式等待、最大加载时长self.driver.maximize_window()self.driver.implicitly_wait(20)self.driver.set_page_load_timeout(SET_PAGE_LOAD_TIMEOUT) # 页面加载时长, 超时则停止,避免因页面加载过慢而拖延整个测试流程return self.driver
2. 新建页面基类
在common包中,新建basePage.py , BasePage类,
表示页面基类, 把不同的页面,能做的同样的事情,都封装在这个类中。
from common.driver import Driverclass BasePage:"""页面基类:不同的页面 能做同样的事,封装在这个类中打开浏览器、进入页面、定位元素、点击、输入等"""def __init__(self):self.driver = Driver().get_driver() # 这个就表示打开浏览器# 打开网址def open_url(self,url): # 二次封装,提供更多的可能性self.driver.get(url)# 定位到元素def get_element(self,locator):""":param locator: 如: 'id','kw':return:"""return self.driver.find_element(*locator)# 输入文本def input_text(self,locator,text,append=False):# 默认:清空后输入if not append:self.get_element(locator).clear()self.get_element(locator).send_keys(text)# 否则是追加输入else:self.get_element(locator).send_keys(text)# 返回driver对象, 让页面对象灵活操作def new_Driver(self):return self.driver# 倒退def back(self):self.driver.back()
3.新建pages包
一个页面一个py文件, 在pages目录下,
新增baidu_page.py
表示 百度的页面,里面
有纯元素,比如下面的 “【百度一下】 按钮元素”
有元素做动作的方法,“输入框输入文本”
在main中,可以进行调试
from common.basePage import BasePage# 继承基类
class BaiduPage(BasePage):def open_baidu_page(self):# self.open_url(f"{URL}/login")self.open_url("https://www.baidu.com/")return self # 返回后,可以链式调用 BaiduPage().open_baidu_page().login_polly('花西子262','123456')# (动作)输入框输入xxdef input_ele_input(self,text):self.input_text(('id','kw'),text)# (元素) 百度一下 按钮def submit_ele(self):return self.get_element(('id','su'))Baidu_Page_Obj = BaiduPage()if __name__ == '__main__':Baidu_Page_Obj = BaiduPage()# 输入Baidu_Page_Obj.open_baidu_page().input_ele_input("测试一下")# 点击确定Baidu_Page_Obj.submit_ele().click()
新建sahitest_page.py
再新增一个页面,其中,封装了两个元素
main 中
- 点击一个元素,然后 使用 basePage中封装的 back方法,回退
- 再点击另一个元素,使用basePage中,先获取到driver,然后再用driver
import time
from common.basePage import BasePage
# 继承基类
class SahiTestPage(BasePage):def open_sahi_page(self):self.open_url("https://sahitest.com/demo/")return self# (元素1)def _ele1(self):return self.get_element(("link text",'Drag Drop Test'))# (元素2)def _ele2(self):return self.get_element(("link text",'Alert Test'))sihi_Page_Obj = SahiTestPage()if __name__ == '__main__':sihi_Page_Obj = SahiTestPage()# 打开网址sihi_Page_Obj= sihi_Page_Obj.open_sahi_page()# 点击一个元素sihi_Page_Obj._ele2().click()time.sleep(2)# 回退 (使用封装的back方法)sihi_Page_Obj.back()# 点击第二个元素sihi_Page_Obj._ele1().click()time.sleep(2)# 回退(使用dirver对象 的)sihi_Page_Obj.new_Driver().back()
4 . 新建testCases包。
新建test_demo1.py
一个py文件就用来写一个 页面的测试用例,可以这么设计,那这个就写百度页面的测试用例。
我就直接两个用例,对应两个页面了
- 用例1: 百度页面 输入 CSDN,百度一下
- 用例2: sahitest页面,点击一个, 回退,点击另一个,再回退
from pages.baidu_page import Baidu_Page_Obj
from pages.sahitest_page import sihi_Page_Obj
import time,pytestclass Test_Demo():def test_case1(self):"""打开百度"""Baidu_Page_Obj.open_baidu_page().input_ele_input("CSDN")Baidu_Page_Obj.submit_ele().click()time.sleep(1)def test_case2(self):"""打开sihitest网页"""time.sleep(1)sihi_Page_Obj.open_sahi_page()# 点击一个元素sihi_Page_Obj._ele2().click()time.sleep(2)# 回退 (使用封装的back方法)sihi_Page_Obj.back()# 点击第二个元素sihi_Page_Obj._ele1().click()time.sleep(2)# 回退(使用dirver对象 的)sihi_Page_Obj.new_Driver().back()if __name__ == '__main__':pytest.main([__file__])
pytest的知识,要执行main中的代码要设置pycharm:不明白可以看 【自动化总结1】pytest使用整理
执行时,会完成测试用例 ,但是会打开两个浏览器。这个是可以去解决的问题
二:升级(待整理)
集中管理元素定位、解决打开多个浏览器问题(如果只打开一次,就只登录一次就够了)