标签:self Object driver Page class 自动化 Element id def
1、UI自动化中存在的问题
2、PO模式
3、poium 测试库
1、UI自动化中存在的问题
当为 Web 页面编写测试时,需要操作该 Web 页面上的元素。然而,如果在测试代码中直接操作 Web 页面上的元素,那么这样的代码是极其脆弱的,因为 UI 会经常变动。
举例:假设要对一个元素进行点击操作,而且会经常对该元素进行操作,那么你就可能会编写多处如下代码。
driver.find_element_by_id("login-btn").click()
存在的问题:
1. 如果开发人员修改了这个元素的id,这时候你就不得不修改所有对应的代码
2. 存在大量冗余代码
2、PO模式
核心思想是通过对界面元素的封装减少冗余代码,同时在后期维护中,若元素定位发生变化, 只需要调整页面元素封装的代码,提高测试用例的可维护性、可读性。
PO模式可以把一个页面分为三层,对象库层、操作层、业务层。
1. 对象库层:封装定位元素的方法。
2. 操作层:封装对元素的操作。
3. 业务层:将一个或多个操作组合起来完成一个业务功能。比如登录:需要输入帐号、密码、点击登录三个操作。
创建base.py(对象库层),封装定位元素的方法。
import time class BasePage: """ 基础 Page 层,封装一些常用方法 """ def __init__(self, driver): self.driver = driver # 打开页面 def open(self, url=None): if url is None: self.driver.get(self.url) else: self.driver.get(url) # id 定位 def by_id(self, id_): return self.driver.find_element_by_id(id_) # name 定位 def by_name(self, name): return self.driver.find_element_by_name(name) # class 定位 def by_class(self, class_name): return self.driver.find_element_by_class_name(class_name) # XPath 定位 def by_xpath(self, xpath): return self.driver.find_element_by_xpath(xpath) # CSS 定位 def by_css(self, css): return self.driver.find_element_by_css_selector(css) # 获取 title def get_title(self): return self.driver.title # 获取页面 text,仅使用 XPath 定位 def get_text(self, xpath): return self.by_xpath(xpath).text # 执行 JavaScript 脚本 def js(self, script): self.driver.execute_script(script)
1. open()方法用于打开网页,它接收一个 url 参数,默认为 None。如果 url 参数为None,则默认打开子类中定义的 url。稍后会在子类中定义 url 变量。
2. by_id()和 by_name()方法。我们知道,Selenium 提供的元素定位方法很长,这里做了简化,只是为了在子类中使用更加简便。
3. get_title()和 get_text()方法。这些方法是在写自动化测试时经常用到的方法,也可以定义在 BasePage 类中。需要注意的是,get_text()方法需要接收元素定位,这里默认为 XPath 定位。
创建baidu_page.py(操作层),封装对元素的操作。
from base import BasePage class BaiduPage(BasePage): """百度 Page 层,百度页面封装操作到的元素""" url = "https://www.baidu.com" def search_input(self, search_key): self.by_id("kw").send_keys(search_key) def search_button(self): self.by_id("su").click()
1. 创建 BaiduPage.py 类继承 BasePage 类,定义 url 变量,供父类中的 open()方法使用。
2. 在 search_input()和 search_button()方法中使用了父类的 self.by_id()方法来定位元素。
创建baidu_test.py(业务层),编写测试用例,封装一系列操作。
import unittest from time import sleep from selenium import webdriver from baidu_page import BaiduPage class TestBaidu(unittest.TestCase): @classmethod def setUpClass(cls): cls.driver = webdriver.Chrome() def test_baidu_search_case(self): page = BaiduPage(self.driver) page.open() page.search_input("selenium") page.search_button() sleep(2) self.assertEqual(page.get_title(), "selenium_百度搜索") @classmethod def tearDownClass(cls): cls.driver.quit() if __name__ == '__main__': unittest.main(verbosity=2)
3、poium 测试库
pip 安装
pip install poium
使用教程:
使用 poium 重写 baidu_page.py
from base import BasePage from poium import Page, Element class BaiduPage(BasePage): """百度 Page 层,百度页面封装操作到的元素""" search_input = Element(id_="kw") search_button = Element(id_="su")
在baidu_test.py 中改写如下:
import unittest from time import sleep from selenium import webdriver from baidu_page import BaiduPage class TestBaidu(unittest.TestCase): @classmethod def setUpClass(cls): cls.driver = webdriver.Chrome() def test_baidu_search_case(self): page = BaiduPage(self.driver) page.open("https://www.baidu.com") page.search_input = "selenium" page.search_button.click() sleep(2) self.assertEqual(page.get_title(), "selenium_百度搜索") @classmethod def tearDownClass(cls): cls.driver.quit() if __name__ == '__main__': unittest.main(verbosity=2)
1、poium支持的定位方法
from poium import Page, Element class SomePage(Page): elem_id = Element(id_='id') elem_name = Element(name='name') elem_class = Element(class_name='class') elem_tag = Element(tag='input') elem_link_text = Element(link_text='this_is_link') elem_partial_link_text = Element(partial_link_text='is_link') elem_xpath = Element(xpath='//*[@id="kk"]') elem_css = Element(css='#id')
2、设置元素超时时间
通过 timeout 参数可设置元素超时时间,默认为 10s。
from poium import Page, Element class BaiduPage(Page): search_input = Element(id_='kw', timeout=5) search_button = Element(id_='su', timeout=30)
3、设置元素描述
当一个 Page 类中定义的元素非常多时,必须通过注释来增加可读性,这时可以使用describe 参数。
from poium import Page, Element class LoginPage(Page): """ 登录 Page 类 """ username = Element(css='#loginAccount', describe="用户名") password = Element(css='#loginPwd', describe="密码")
4、定位一组元素
当我们要定位一组元素时,可以使用 PageElements 类。
from poium import Page, Elements class ResultPage(Page): # 定位一组元素 search_result = Elements(xpath="//div/h3/a")
标签:self,Object,driver,Page,class,自动化,Element,id,def 来源: https://www.cnblogs.com/mtoy/p/16440501.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。