ui自动化po框架版本02
一、
pages下的BasePage.py模块
'''
此模块是封装所有用例的基类
比如说:所有用例要用到的元素定位,以及输入框输入,点击,下拉等等公共方法
'''
import unittest #导入unittest 框架
from time import *
# 调试代码
from selenium import webdriver
#driver = webdriver.Chrome()
class BasePage(unittest.TestCase): #创建一个BasePage类,这个类继承unittest框架中TestCase这个类
@classmethod #我们在Ui 自动化我们就是打开浏览器,,我们之前是把所有的浏览器都是同一个,我们创建类方法,
def set_driver(cls,driver): #入参是一个driver对象,把创建好的driver对象传进来,变成BasePage这个类的属性
#把传进来的谷歌浏览器对象作为当前类、基类属性,基类的变量
cls.driver = driver #保证每一个用例用的是同一个driver
@classmethod
def get_driver(cls): #单例设计模式 #创建好以后basepage来拿通过get_driver来都是同一个对象
return cls.driver :
#baidu_input=("id","kw")
@classmethod
#优点,把重复的代码都省了
def find_element(cls,element): #定位元素的时候用到很多种方法
type = element[0] #id
value = element[1] #kw
if type == "id":
elem = cls.driver.find_element_by_id(value)
elif type == "xpath":
elem = cls.driver.find_element_by_xpath(value)
elif type == "class":
elem = cls.driver.find_element_by_class_name(value)
elif type == "name":
elem = cls.driver.find_element_by_name(value)
elif type == "css":
elem = cls.driver.find_element_by_css_selector(value)
elif type == "link_text":
elem = cls.driver.find_element_by_link_text(value)
elif type == "partial":
elem = cls.driver.find_element_by_partial_link_text(value)
else:
raise ValueError("plese input corrt paramters")
return elem
@classmethod #封装输入函数
def sendKeys(cls,elem,text):
return elem.send_keys(text)
@classmethod #封装点击操作
def click(cls,elem):
return elem.click()
@classmethod
def wait(cls,sec):
'''封装一个隐式等待'''
return driver.implicitly_wait(sec)
@classmethod
def sleep(cls,sec):
return sleep(sec)
@classmethod
def frame(cls,elem):
'''定位iframe框'''
return cls.driver.switch_to.frame(elem)
@classmethod
def outframe(cls):
return cls.driver.switch_to.default_content()
@classmethod
def get_text(cls,element):
'''封装根据网页元素拿到text值'''
value = BasePage.find_element(element).text
return value
if __name__ == '__main__':
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.maximize_window()
baidu_input = ("id","kw")
elem = BasePage.find_element(baidu_input).send_keys("多测师")
# elem = BasePage.find_element(baidu_input) #调用elem的返回值就得得到elem值
# BasePage.sendKeys(elem,"多测师")
注意:1、点通过解释调试
2、调用的时候用类的方法
注解:
unittest.TestCase的子类BasePage增加两个类方法:set_driver和get_driver
set_driver(cls, driver) 方法是用来设置driver属性的。这个方法接收一个driver参数,这个参数通常是一个webdriver对象(例如来自selenium库),然后把这个对象赋值给BasePage类的一个属性(也就是cls.driver)。这个方法通常在测试类的setup方法中被调用,以便在执行测试用例前准备好webdriver。
get_driver(cls) 方法是用来获取driver属性的。这个方法返回BasePage类的一个属性(也就是cls.driver)。这个方法通常在测试类的teardown方法中被调用,以便在执行测试用例后清理webdriver。
然而,这段代码中存在一个问题。set_driver和get_driver方法都是类方法,它们都需要一个cls参数。但是,在set_driver方法中,你并没有使用这个cls参数。如果你想在set_driver中使用cls参数,你可以像下面这样修改代码:
=================================
下面我们写两条用例:登陆,用户中心
我们先写登陆:
```python
rom public.pages.BasePage import BasePage #导入BasePage ,基类,导入后我们在类中继承
from selenium import webdriver
from public.utiles.read_ini import read #导入read对象
import unittest
from public.pages.Pages_Element impor Pages_Element as p
url = read.read_data_ini("test_data","url")
username = read.read_data_ini("test_data","username")
pwd = read.read_data_ini("test_data","pwd")
class Test_login(BasePage): #定义一个登陆的类,我们要继承basepage 要导包,因为BasePage引入了unttest类 也就是爷爷类
@classmethod
def setUpClass(cls) -> None: #类的开始
driver = webdriver.Chrome() #创建一个唯一的driver,只能打开一次,我们保证后面的都引用同一个对象,类是可以传递的,
BasePage.set_driver(driver) #我们继承的 BasePage,dirver当一个变量来传递,后面通过调用ge——driver
@classmethod
def tearDownClass(cls) -> None:
'''每次跑完用例等待3秒'''
BasePage.sleep(3)
def test_01_login(self):
#1.拿到driver对象
driver = BasePage.get_driver()
driver.get(url)
driver.maximize_window()
driver.implicitly_wait(20)
#2.输入用户名
elem =BasePage.find_element(p.userName)
BasePage.sendKeys(elem,username)
#3.输入密码
elem = BasePage.find_element(p.passWord)
BasePage.sendKeys(elem,pwd)
#4.点击登陆
elem = BasePage.find_element(p.loginBtn)
BasePage.click(elem)
#5.断言
value =BasePage.get_text(p.desktop)
assert value=="我的桌面"
if __name__ == '__main__':
unittest.main()
注意:cls类方法, self 实例方法