在Web自动化测试中,定位和操作网页元素是我们最常用的任务之一。为了方便这些任务的执行,开发者们使用了一种叫做“page对象”的模式。这种模式的主要目标是将一个网页的所有元素封装成一个对象,以此来进行更加方便的定位和操作。
一、“page对象”的定义
所谓“page对象”,就是将一个Web页面的所有元素,包括按钮、文本框、下拉框等等,封装成一个对象。这个对象作为一种接口,为测试代码提供了所有需要的属性和方法。这个对象的核心是封装,所有的元素都封装在类中,只需要通过调用这个类的实例来访问这些元素,从而使得测试代码更加清晰、简洁。
“page对象”的另外一个重要作用是隐藏页面的实现细节。因为在访问页面元素时,页面的实现可能会发生变化,比如说页面中的按钮在某一时刻会被删除,或者下拉框的选项会发生变化。如果测试代码基于页面的HTML结构来直接定位元素,那么当HTML结构发生变化时就需要修改测试代码,这给测试代码的维护带来了很大的负担。 而“page对象”则可以处理这些变化,精简测试代码,并提高可维护性。
二、“page对象”的构建
想要构建一个“page对象”,首先要做的是对页面进行分析。需要考虑页面上有哪些元素,它们的ID、名称、类、标签名等属性是什么,这些元素能够产生什么行为,比如点击、输入等。
一般来说,可以将每个页面都封装成一个类,该类代表了一个具体的页面,并且将页面上的所有元素都封装为该类中的属性。这些属性可以是Web元素的ID、名称、类、标签名等属性。而每个属性所对应的值则是该元素的实例。
在这种基本结构上,再针对这些元素所具有的行为进行方法的封装。比如说对于文本框,可以封装出输入的方法;对于按钮则可以封装出点击的方法。
最终,我们可以得到一个类似于以下代码的“page对象”(以百度搜索引擎页面为例):
```
class BaiduHomePage(object):
def __init__(self, driver):
self.driver = driver
self.search_box = driver.find_element_by_name('wd')
self.search_button = driver.find_element_by_css_selector('#su')
def search(self, keywords):
self.search_box.clear()
self.search_box.send_keys(keywords)
self.search_button.click()
```
在这个例子中,我们首先实现了一个BaiduHomePage类,该类的构造函数接收一个WebDriver对象。该类中包含了两个属性:search_box和search_button。这两个属性分别表示百度首页上的搜索框和搜索按钮。在该类中还实现了一个search()方法,该方法可以输入关键字并点击搜索按钮来进行搜索。
三、“page对象”的应用
在开发了“page对象”之后,我们就可以在测试代码中调用这些对象来实现各种操作。
以前面的例子为例,如果我们要进行搜索操作,可以这样写:
```
def test_baidu_search():
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
home_page = BaiduHomePage(driver)
home_page.search('Selenium')
assert "Selenium" in driver.page_source
driver.quit()
```
在这个例子中,我们首先创建了一个WebDriver实例,并打开了百度首页。然后我们创建了一个BaiduHomePage实例,该实例可以表示百度首页,并调用它的search()方法来进行搜索。最后我们判断页面中是否包含了“Selenium”这个关键字。如果包含,那么我们就认为测试通过通过。
通过这样的方式,我们可以大幅简化测试代码的实现。我们不再需要大量的定位代码、等待代码等等。代码的可读性和可维护性都得到了很大的提升。
四、“page对象”的优点和缺点
“page对象”的优点是显而易见的:
1. 代码简洁:因为所有的元素都封装在对象中,所以测试代码更加简洁明了,易于阅读和理解。
2. 维护性强:因为“page对象”能够隐藏页面的实现细节,可以屏蔽页面结构的变化,所以测试代码更加稳定,容易维护。
3. 提高测试效率:通过“page对象”,测试人员可以更加快速地定位和操作页面元素,提高测试效率。
但是“page对象”也存在一些缺点:
1. 构建“page对象”需要大量的时间和精力,需要详细分析页面结构和元素行为。
2. 如果页面结构和元素行为频繁变化,也就需要经常更新和维护“page对象”。否则,就会降低测试代码的可维护性。
3. 有时候难以调试。因为封装了大量的代码,如果出现问题需要排查时,可能需要对多个对象进行调试。
总的来说,“page对象”还是非常有用的开发模式。它能够简化测试代码,提高测试效率,同时也能提高测试代码的可读性和可维护性。而这些优点,恰恰是自动化测试中的十分重要的品质。