PO模式 - common目录下的basepa_element.py

先来看看common有哪些东西
PO模式 - common目录下的basepa_element.py_第1张图片
basepage_element.py和basepage_elements.py 封装的是关键字驱动,一个是单一的页面元素,一个是多个页面元素的情况下
config.py 用来判断环境
contants.py 读取目录结构
log.py 封装日志文件
uploding.py 封装页面文件上传

basepage(无关业务):关键字封装。等待、查找元素、点击、输入、获取 文本、获取 属性、窗口切换、iframe切换、上传、select
元素的操作:等待、查找、操作。
实现了:页面当中的每一个操作,都进行了异常捕获、失败截图、操作时间。
现在就来封装一个basepage文件

导入包:根据自己的需求来定

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import datetime
from PO.Common.log import MyLog
from PO.Common.contants import Open
from PO.Common.uploading import upload

然后命名,先把显性等待和页面截图操作,写出来。只有当执行失败的时候,才进行截图操作。

class BasePage:
    def __init__(self, driver):
        self.driver = driver
        '''
        loc:定位参数输入
        img_doc:截图名字
        timeout:显性等待的时长
        frequency:显示等待的间隔
        path:文件上传的路径
        '''
    # 等待时间
    def wait_eleVisble(self, loc, img_doc="", timeout=30, frequency=0.5):
        MyLog ().info ("等待元素可见:{}".format (loc))
        try:
            # 开始时间
            start = datetime.datetime.now ()
            WebDriverWait (self.driver, timeout, frequency).until (EC.visibility_of_element_located (loc))
            # 结束时间
            end = datetime.datetime.now ()
            MyLog ().info ("开始等待时间:{},等待结束时间:{},共等待:{}".format (start, end, end - start))
        except:
            MyLog ().info ("等待时间失效")
            # 截图
            self.save_web_screenshot (img_doc)
            raise
    # 网页截图
    def save_web_screenshot(self, img_doc):

        now = time.strftime ('%Y-%m-%d %H-%M')
        filename = ("{}_{}.png".format (img_doc, now))

        try:
            self.driver.save_screenshot (Open.screenshots () + '/' + filename)
            MyLog ().info ("网页截图成功,保存在:{}".format (Open.screenshots () + r'/' + filename))
        except:
            MyLog ().info ("请检查你定位是否正确")
            raise

然后加入查找元素,和点击操作

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import datetime
from PO.Common.log import MyLog
from PO.Common.contants import Open
from PO.Common.uploading import upload

class BasePage:
    def __init__(self, driver):
        self.driver = driver
        '''
        loc:定位参数输入
        img_doc:截图名字
        timeout:显性等待的时长
        frequency:显示等待的间隔
        path:文件上传的路径
        '''


    # 等待时间
    def wait_eleVisble(self, loc, img_doc="", timeout=30, frequency=0.5):
        MyLog ().info ("等待元素可见:{}".format (loc))
        try:
            # 开始时间
            start = datetime.datetime.now ()
            WebDriverWait (self.driver, timeout, frequency).until (EC.visibility_of_element_located (loc))
            # 结束时间
            end = datetime.datetime.now ()
            MyLog ().info ("开始等待时间:{},等待结束时间:{},共等待:{}".format (start, end, end - start))
        except:
            MyLog ().info ("等待时间失效")
            # 截图
            self.save_web_screenshot (img_doc)
            raise

    # 查找一个元素
    def get_element(self, loc, img_doc=""):
        MyLog().info ("定位的元素:{}".format (loc))
        try:
            return self.driver.find_element (*loc)
        except:
            MyLog ().warning ("查找元素失败")
            # 截图
            self.save_web_screenshot (img_doc)
            raise
    # 点击元素
    def click_element(self, loc, img_doc=""):
        # 等待元素,查找元素,点击元素
        self.wait_eleVisble (loc, img_doc)
        ele = self.get_element (loc, img_doc)
        MyLog().info ("要点击的元素:{}".format (loc))
        try:
            ele.click ()
        except:
            MyLog().warning ("点击元素失败")
            self.save_web_screenshot (img_doc)
            raise
    # 网页截图
    def save_web_screenshot(self, img_doc):

        now = time.strftime ('%Y-%m-%d %H-%M')
        filename = ("{}_{}.png".format (img_doc, now))
        try:
           self.driver.save_screenshot (Open.screenshots () + '/' + filename)
            MyLog ().info ("网页截图成功,保存在:{}".format (Open.screenshots () + r'/' + filename))
        except:
            MyLog ().info ("请检查你定位是否正确")
            raise

可以根据自己的场景需要,进行封装,我现在暂时用到的是获取文本值、输入文本操作,文件上传,点击操作
整体代码:

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import datetime
from PO.Common.log import MyLog
from PO.Common.contants import Open
from PO.Common.uploading import upload




class BasePage:
    def __init__(self, driver):
        self.driver = driver
        '''
        loc:定位参数输入
        img_doc:截图名字
        timeout:显性等待的时长
        frequency:显示等待的间隔
        path:文件上传的路径
        '''


    # 等待时间
    def wait_eleVisble(self, loc, img_doc="", timeout=30, frequency=0.5):
        MyLog ().info ("等待元素可见:{}".format (loc))
        try:
            # 开始时间
            start = datetime.datetime.now ()
            WebDriverWait(self.driver,timeout,frequency).until(EC.visibility_of_element_located (loc))
            # 结束时间
            end = datetime.datetime.now ()
            MyLog ().info ("开始等待时间:{},等待结束时间:{},共等待:{}".format (start, end, end - start))
        except:
            MyLog ().info ("等待时间失效")
            # 截图
            self.save_web_screenshot (img_doc)
            raise

    # 查找一个元素
    def get_element(self, loc, img_doc=""):
        MyLog().info ("定位的元素:{}".format (loc))
        try:
            return self.driver.find_element (*loc)
        except:
            MyLog ().warning ("查找元素失败")
            # 截图
            self.save_web_screenshot (img_doc)
            raise
    # 点击元素
    def click_element(self, loc, img_doc=""):
        # 等待元素,查找元素,点击元素
        self.wait_eleVisble (loc, img_doc)
        ele = self.get_element (loc, img_doc)
        MyLog().info ("要点击的元素:{}".format (loc))
        try:
            ele.click ()
        except:
            MyLog().warning ("点击元素失败")
            self.save_web_screenshot (img_doc)
            raise
    #输入文本操作
    def text_input_element(self,loc,img_doc="",*args):
        self.wait_eleVisble (loc, img_doc)
        ele = self.get_element (loc, img_doc)
        MyLog().info ("文本输入:{}".format (args))
        try:
            ele.clear()
            ele.send_keys(args)
        except:
            MyLog().warning ("输入文本值失败")
            self.save_web_screenshot (img_doc)
            raise
    #获取文值
    def text_element(self,loc,img_doc=""):
        self.wait_eleVisble(loc,img_doc)
        ele =self.get_element(loc,img_doc)
        try:
            text = ele.text
            MyLog ().info ("元素:{}获取的文本值是:{}".format (loc, text))
            return text
        except:
            MyLog().warning("获取文本值失败")
            self.save_web_screenshot(img_doc)
            raise

    #文件上传
    def files_upload_element(self,path,img_doc=""):
        try:
            time.sleep(3)
            upload(path)
            time.sleep(2)
        except:
            MyLog().warning("文件路径错误")
            self.save_web_screenshot(img_doc)
            raise

    # 网页截图
    def save_web_screenshot(self, img_doc):
        now = time.strftime ('%Y-%m-%d %H-%M')
        filename = ("{}_{}.png".format (img_doc, now))
        try:
            self.driver.save_screenshot (Open.screenshots () + '/' + filename)
            MyLog ().info ("网页截图成功,保存在:{}".format (Open.screenshots () + r'/' + filename))
        except:
            MyLog ().info ("请检查你定位是否正确")
            raise

怎么调用?很简单,好处:我们这么一写,别人就不知道我们在干嘛了,只知道这个东西能做点击操作,却没发现我们里面还有等待、点击、查找、日志、截图等操作。
也节约了每次写重复代码,比如要重复写显性等待,重复写find_xxx.click()操作。

from selenium import webdriver
from selenium.webdriver.common.by import By
from PO.Common.basepage_element import BasePage

driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
BasePage(driver).click_element((By.XPATH,'//div[@id="u1"]//a[@name="tj_settingicon"]'),'百度点击设置')

你可能感兴趣的:(selenium,python)