文章目录
1.什么是PO模式
PO(Page Object)模式是一种在自动化测试中广泛应用的设计模式,它将页面元素和操作封装成独立的类,提高了测试代码的可维护性、可复用性和可读性。
优点:
- 解决元素定位改变带来的维护成本增加
- 元素定位与用例分离
大家看到元素定位与用例分离是不是有点懵,别急接我们先来看元素定位与用例分离会有哪些问题
2.元素定位与用例分离会有哪些问题
下面是两条百度页面的测试用例,一个是登录状态下的,另一个是未登录状态下的。
python
from selenium.webdriver.common.by import By
class TestBaidu:
def test_baidu_1(self,driver):
# 未登录状态下
driver.get("https://www.baidu.com/")
title = driver.title
url = driver.current_url
text = driver.find_element(By.CSS_SELECTOR, 'a[href="http://news.baidu.com"]').text
button_text = driver.find_element(By.ID, 'su').accessible_name
assert title == "百度一下,你就知道"
assert url == "https://www.baidu.com/"
assert text == "新闻"
assert button_text == "百度一下"
def test_baidu_2(self,driver):
# 登录状态下
driver.get("https://www.baidu.com/")
title = driver.title
url = driver.current_url
text = driver.find_element(By.CSS_SELECTOR, 'a[href="http://news.baidu.com"]').text
button_text = driver.find_element(By.ID, 'su').accessible_name
assert title == "百度一下,你就知道"
assert url == "https://www.baidu.com/"
assert text == "新闻"
assert button_text == "百度一下"
两个用例都有text
和button_text
,都是需要用到元素定位。假设这个页面还有很多测试用例也需要用到这几个元素的定位,如果哪天元素的样式改变了,原本的定位方式定位不到元素了,那么测试用例中所有用到这个元素定位的地方都需要更改。因此会造成维护成本的增加。那么上述问题如何解决呢?
我们可以将定位元素的方法抽离出来 ,之后用的时候引用一个就可以了,如果后面需要修改,只需要修改一个地方就可以了。
如图所示:
上述只是一个简单的分离,我们要学习的是这种解决问题的思路。一般来说我们需要新建一个Page类对象
python
from selenium.webdriver.common.by import By
class PageBaidu:
# 新闻
news = (By.CSS_SELECTOR, 'a[href="http://news.baidu.com"]')
# 百度一下按钮
button = (By.ID, 'su')
# 百度输入框
input = (By.ID, 'kw')
# 帮助
help = (By.CSS_SELECTOR, 'a[href="//help.baidu.com"]')
# 更多
more = (By.XPATH, '//*[@id="s-top-left"]/div/a')
我们在使用的时候直接创建page的实例化对象即可
这种只是单独将元素抽离了出来,对于定位元素的操作我们还是写在测试用例里面的。
其实还有一种思路,我们也可以封装对于元素的操作,作为page对象的方法,例如输入框搜索内容
python
def search_keyword(self, keyword):
self.driver.find_element(*self.input).send_keys(keyword)
self.driver.find_element(*self.button).click()
那么如果要在测试用例中搜索内容,只需要传入变量,调用方法即可,这是PO模式两种分离的思路。