(十一) 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()


总结

  1. 显示等待的封装可以根据不同条件,去封装不同的方法,方便后续的调用
  2. 常用重复的代码,建议封装成函数去调用
  3. 显式等待时可以选择其他元素去判断需要的元素是否存在,进行佐证
Logo

一站式 AI 云服务平台

更多推荐