二、封装base_page 以及基于对象的baidu_homepage_以及测试用的用例BaiduSearch.py

到目前为止 项目的结构如下

base_page的封装

import time
from selenium.common.exceptions import NoSuchElementException
import os.path
from framework.logger import Logger
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
#创建一个日志
logger = Logger(loggername="BasePage").getlog()

class BasePage(object):

    '''
     定义一个页面基类,让所有页面都继承这个类,封装一些常用的页面操作方法到这个类比如find_element
     显示等待
    '''
    def __init__(self,driver):
        self.driver = driver
    def quit_browser(self):
        self.driver.quit()
    def forward(self):
        logger.info("前进")
        self.driver.forward()
    def back(self):
        logger.info("后退")
        self.driver.back()
        #显式等待
    def wait(self,locator):
        #显式等待
        logger.info("显式等待")
        WebDriverWait(self.driver,timeout=20,poll_frequency=0.5).until(EC.presence_of_element_located(locator))
    def close_current_window(self):
        try:
            self.driver.close()
        except NameError as e:
            logger.error("Failed to quit the broswer with %s"% e)
    #保存截图
    def get_sreenshot(self,screenName):
        file_path = os.path.dirname(os.path.abspath("."))+"/screenshots/"
        timestamps = time.strftime("%Y%m%d%H%M%S",time.localtime(time.time()))#获取当前时间的时间戳
        screen_name = file_path+timestamps+screenName+".png"

        try:
            self.driver.get_screenshot_as_file(screen_name)
            logger.info("Had take screenshot and save to folder :/screenshots")
        except NameError as e:
            logger.error("Failed to take screeshot")
            self.get_sreenshot()

    def find_element(self, selector):
        """
         这个地方为什么是根据=>来切割字符串,请看页面里定位元素的方法
         submit_btn = "id=>su"
         login_lnk = "xpath => //*[@id='u1']/a[7]"  # 百度首页登录链接定位
         如果采用等号,结果很多xpath表达式中包含一个=,这样会造成切割不准确,影响元素定位
        :param selector:
        :return: element
        """
        element = ''
        if '=>' not in selector:
            return self.driver.find_element_by_id(selector)
        selector_by = selector.split('=>')[0]
        selector_value = selector.split('=>')[1]

        if selector_by == "i" or selector_by == 'id':
            try:
                element = self.driver.find_element_by_id(selector_value)
                logger.info("Had find the element \' %s \' successful "
                            "by %s via value: %s " % (element.text, selector_by, selector_value))
            except NoSuchElementException as e:
                logger.error("NoSuchElementException: %s" % e)
                self.get_windows_img()  # take screenshot
        elif selector_by == "n" or selector_by == 'name':
            element = self.driver.find_element_by_name(selector_value)
        elif selector_by == "c" or selector_by == 'class_name':
            element = self.driver.find_element_by_class_name(selector_value)
        elif selector_by == "l" or selector_by == 'link_text':
            element = self.driver.find_element_by_link_text(selector_value)
        elif selector_by == "p" or selector_by == 'partial_link_text':
            element = self.driver.find_element_by_partial_link_text(selector_value)
        elif selector_by == "t" or selector_by == 'tag_name':
            element = self.driver.find_element_by_tag_name(selector_value)
        elif selector_by == "x" or selector_by == 'xpath':
            try:
                element = self.driver.find_element_by_xpath(selector_value)
                logger.info("Had find the element \' %s \' successful "
                            "by %s via value: %s " % (element.text, selector_by, selector_value))
            except NoSuchElementException as e:
                logger.error("NoSuchElementException: %s" % e)
                self.get_windows_img()
        elif selector_by == "s" or selector_by == 'selector_selector':
            element = self.driver.find_element_by_css_selector(selector_value)
        else:
            raise NameError("Please enter a valid type of targeting elements.")

        return element

        # 输入
    def send_keys_text(self, selector, text):

        el = self.find_element(selector)
        el.clear()
        try:
            el.send_keys(text)
            logger.info("Had type \' %s \' in inputBox" % text)
        except NameError as e:
            logger.error("Failed to type in input box with %s" % e)
            self.get_windows_img()
            # 清除文本框

    def clear(self, selector):

        el = self.find_element(selector)
        try:
            el.clear()
            logger.info("Clear text in input box before typing.")
        except NameError as e:
            logger.error("Failed to clear in input box with %s" % e)
            self.get_windows_img()

            # 点击元素

    def click(self, selector):
        el = self.find_element(selector)
        val = el.get_attribute("value")
        try:
            el.click()
            logger.info("The element buttin %s was clicked."% val )
        except NameError as e:
            logger.error("Failed to click the element with %s" % e)
            # 或者网页标题

    def get_page_title(self):
        logger.info("Current page title is %s" % self.driver.title)
        return self.driver.title

    @staticmethod
    def sleep(seconds):
        time.sleep(seconds)
        logger.info("Sleep for %d seconds" % seconds)

基于basepage的的页面对象Baidu_homepage

from framework.base_page import BasePage

class HomePage(BasePage):
    input_box="id=>kw"
    search_submit_btn="id=>su"

    def send_keys_text_search(self,text):
        self.send_keys_text(self.input_box,text)
    def click_btn_search(self):
        self.click(self.search_submit_btn)

测试用例的书写

import  unittest

import  time

from  framework.brower_engin import BrowseEngin
from pageobject.baidu_homepage import HomePage

class BaiduSearch(unittest.TestCase):
    def setUp(self):
        browser = BrowseEngin(self)
        self.driver = browser.open_browser(self)
    def tearDown(self):
        self.driver.quit()
    def test_baidu_search(self):
        homePage = HomePage(self.driver)
        homePage.send_keys_text_search("selenium")
        time.sleep(2)
        homePage.click_btn_search()
        time.sleep(2)
        # homePage.get_sreenshot("百度截图")


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值