(十一) web自动化测试-basepage的封装
定义basepage类,其他的po类继承basepage类,避免代码冗余,易于维护,basepage类主要包含driver的初始化和元素查找方法为了避免在PO中重复的初始化driver,可以把初始化driver的部分抽离出来,封装在base_page中新建:base_page.py在index.py中可以继承basepage,实现封装调用,无需再去初始化driver二、元素查找方法的封装在上面in
(十一) web自动化测试-basepage的封装
前言
定义basepage类,其他的po类继承basepage类,避免代码冗余,易于维护,basepage类主要包含driver的初始化和元素查找方法
一、初始driver的封装
为了避免在PO中重复的初始化driver,可以把初始化driver的部分抽离出来,封装在base_page中
新建:base_page.py
class BasePage:
# 定义类变量driver和base_url
_driver = None
_base_url = ""
def __init__(self, driver: WebDriver = None):
# 判断是否传入了driver,如果初次调用,则初始化driver
if driver is None:
self._driver = webdriver.Chrome()
self._driver.maximize_window()
self._driver.implicitly_wait(3)
# 非首次调用,传入了driver,则把传入的driver赋给_driver
else:
self._driver = driver
# 判断base_url是否为空,非空则调用get进行打开操作
if self._base_url != "":
self._driver.get(self._base_url)
在index.py中可以继承basepage,实现封装调用,无需再去初始化driver
from selenium.webdriver.common.by import By
from page.base_page import BasePage
from page.login import Login
from page.search import Search
class Index(BasePage):
def goto_login(self):
self._driver.find_element(By.ID, 's-top-loginbtn').click()
return Login(self._driver)
def goto_search(self):
return Search(self._driver)
二、元素查找方法的封装
在上面index中可以看到,还是与driver在外暴露,我们可以在basepage中,find_element进行简单的封装,BasePage类添加方法find
def find(self, by, locator):
return self._driver.find_element(by, locator)
完成后,index.py元素查找部分可以直接调用该方法
from selenium.webdriver.common.by import By
from page.base_page import BasePage
from page.login import Login
from page.search import Search
class Index(BasePage):
def goto_login(self):
# self._driver.find_element可以使用self.find替换
self.find(By.ID, 's-top-loginbtn').click()
return Login(self._driver)
def goto_search(self):
return Search(self._driver)
三、封装显式等待
测试过程中,常常需要等待元素出现后才能操作,selenium中常用等待有三种:
sleep:强制等待,不建议使用
implicitly_wait:隐式等待,所有元素加载前都会进行轮询查找,缺点是元素一旦发现就会停止,但是此时元素在页面可能是不可见或不可操作的,会报错
WebDriverWait:显式等待,手动定义完成后,可以等待元素被发现,且满足一定的条件后,再执行后续的操作
在BasePage中定义显式等待的方法:
# 定义可被点击判断的方法
def wait_for_click(self, locator, time=10):
WebDriverWait(self._driver, time).until(expected_conditions.element_to_be_clickable(locator))
比如百度登录时,可以判断登录按钮是否可以被点击,login中如下:
def login(self):
# 判断登录按钮是否可以被点击
self.WebDriverWait((By.ID, 'TANGRAM__PSP_11__submit'))
# 可以被点击后,执行该元素的点击操作
self.find(By.ID, 'TANGRAM__PSP_11__submit').clik()
总结
- 显示等待的封装可以根据不同条件,去封装不同的方法,方便后续的调用
- 常用重复的代码,建议封装成函数去调用
- 显式等待时可以选择其他元素去判断需要的元素是否存在,进行佐证
更多推荐




所有评论(0)