框架构建(2):提取出页面元素的各项基础操作,创建一个BasePage基类

首先,先看一下,我的项目目录结构:

 主要包括4个部分:

1. config: 存储全局变量,例如测试报告存储位置,测试web url等

2. data:测试数据存放位置。以数据驱动测试,脚本编写好之后,除非修改脚本bug以外,基本不用再动脚本,只需要维护不同场景下的测试数据即可,这是自动化测试的目标。

3. src:存放测试脚本的位置:

  • common:存放公共方法
  • pages:存放测试页面的定义,此部分定义测试页面有关元素的定位以及页面元素操作,例如:对于登陆页面,在此定义有关登陆页面所有的操作,如:输入用户名方法,点击登陆按钮方法,检查登陆是否成功方法;
  • test_case: 存放测试用例,在pages 目录下定义的页面的基础上,将测试有关操作整合成一个个测试用例。

4. sar.py: 这个文件是一个运行测试用例的小工具,可以对test_case目录下的测试用例指定一个运行,也可以指定几个来运行。

下面,开始对上述架构中的每一个细节逐个讲解。在此之前,config目录下创建一个存放全局变量的文件globalparameter.py

//config/globalparameter.py
import time,os
'''
config gloable parameters
'''
# the web url for test
web_url = "http://xxxx/xxx/"
# the project absolute path
project_path = "C:\\Users\\xxx\\Desktop\\test\\unittest_project\\"
print project_path

# The test cases path
test_case_path = project_path+"\\src\\test_case\\"

# log file path
log_path = "C:\\Users\\xxx\\Desktop\\test\\test_records\\log\\"
print 'log path:'+log_path

# test report path, the report file starts with the current time
report_path = "C:\\Users\\xxx\\Desktop\\test\\test_records\\report\\"

# Error screenshots path,notice: it must be /, not \ 
img_path = "C:/Users/xxx/Desktop/test/test_records/img/" 


然后,在common创建一个BasePage基类,这里封装了一些公共方法,例如:查找元素/ 输入文本框等,后续所有page/页面都基于BasePage类,这样在page只着重于页面元素的定位和操作即可:

//common/BasePage.py
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import sys

'''
page public function
'''
class BasePage(object):
    def __init__(self, selenium_driver, base_url):
        self.driver = selenium_driver
        self.url = base_url        
 
    # open one page 
    def _open_page(self, url):
        try:
            self.driver.get(url)
            self.driver.maximize_window()
        except:
            raise Exception('Failed to open page:' + url)
        else:
            Print "Success to open web page."

    # override find_element method
    def find_element(self, *loc):        
        try:
            for i in range(0,3):
                try:
                    WebDriverWait(self.driver,10).until(EC.visibility_of_element_located(loc))
                    return self.driver.find_element(*loc)
                    break
                except:
                    continue
        except:
            raise Exception('Faild to locate web element:'+str(loc))

    # override send_keys method
    def send_keys(self, value, clear=True, *loc):
        try:
            if clear:
                self.find_element(*loc).clear()
                self.find_element(*loc).send_keys(value)
        except AttributeError:
            raise Exception('Failed to send key,loc='+str(loc)+u';value='+value)

    #screenshot
    def img_screenshot(self, img_path, img_name):
        try:
            img_real_path = img_path +'/'+ img_name + ".png"
            print "img_path is %s" % img_real_path
            self.driver.get_screenshot_as_file(img_real_path)            
        except:
            print 'Screenshots failed: '+img_real_path

    def title(self):
        return self.driver.title

    def check_page_loaded_correct(self, text, *loc):
        """
        After opening a new page by clicking a menu or link
        check if the given text is included in the element *loc
        """
        print "check page load:step1: locate the given element: %s" % str(loc)
        element = self.find_element(*loc)
        print "The full content included in the given element: %s" % element.text

        print "check page load:step2: check the text given: %s" % text
        return EC.text_to_be_present_in_element((loc),text)(self.driver)

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以!下面是一个基本的Page Object(PO)框架模板,供你参考: ```python # 导入相关的库和模块 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 创建一个基类,用于封装共用的方法和属性 class BasePage: def __init__(self, driver): self.driver = driver self.wait = WebDriverWait(self.driver, 10) def find_element(self, by, value): return self.wait.until(EC.presence_of_element_located((by, value))) # 可以根据需要添加更多的公共方法 # 创建一个页面类,继承基类,用于封装特定页面的方法和属性 class HomePage(BasePage): # 定义页面元素的定位方式和值 SEARCH_INPUT = (By.ID, "search-input") SEARCH_BUTTON = (By.ID, "search-button") def search(self, keyword): # 操作页面元素 search_input = self.find_element(*self.SEARCH_INPUT) search_input.clear() search_input.send_keys(keyword) search_button = self.find_element(*self.SEARCH_BUTTON) search_button.click() # 创建一个测试类,用于编写测试逻辑 class TestHomePage: def setup_method(self): self.driver = webdriver.Chrome() self.driver.get("https://www.example.com") self.home_page = HomePage(self.driver) def teardown_method(self): self.driver.quit() def test_search(self): self.home_page.search("example") # 运行测试类 if __name__ == "__main__": test = TestHomePage() test.setup_method() test.test_search() test.teardown_method() ``` 上述模板是一个基本的PO框架示例,你可以根据自己的需求进行修改和扩展。在这个模板中,我们使用了Selenium库来操作网页,通过Page Object模式来封装页面元素操作方法,以及使用测试类来编写测试逻辑。 希望这个模板对你有所帮助!如果你还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值