从 0 到 1 搭建 Python 语言 Web UI自动化测试学习系列 15--二次开发--封装公共方法 3

测试学习记录,仅供参考!

二次封装

封装方法

第十九个:找到元素列表(多个)

像这种商城网站,要定位商城列表得用复数形式 driver.find_elements() 的定位方法查找元素才能找到;

开始封装找到复数元素的方法,与找到单个元素的方法几乎相同,稍做修改即可;

更改类 location_elements 名称,

把 presence_of_element_located() 改成 presence_of_all_elements_located() 方法,

然后调用 self.__driver.find_elements(by, value) 并把结果给返回出去;

复制代码
    def location_elements(self, by, value):
        """
        二次封装find_elements方法,定位页面元素列表
        :param by: 定位方式,比如By.ID、By.XPATH等等
        :param value: 定位表达式
        :return:
        """
        try:
            self.__wait.until(ec.presence_of_all_elements_located((by, value)))
            elements = self.__driver.find_elements(by, value)
            logs.info(f"找到元素列表:{by}={value}")
            return elements
        except Exception as e:
            logs.error(f"未找到元素列表:{by}={value}")
            raise e

调试查看:首先定位到最外层(可以看到里面的每一个列表元素),通过返回一个 list (列表)下面的每一个元素,然后通过列表索引去找到并操作下面的每一个元素;

复制代码
# 导包
from selenium import webdriver
from selenium.common import NoSuchElementException
from selenium.webdriver.common.by import By
from time import sleep
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.support.wait import WebDriverWait
from config import setting
from util_tools.logs_util.recordlog import logs

class BasePage(object):

    def __init__(self, driver):
        self.__driver = driver
        self.__wait = WebDriverWait(self.__driver, setting.WAIT_TIME)

    def window_max(self):
        self.__driver.maximize_window()

    def window_full(self):
        self.__driver.fullscreen_window()

    def screenshot(self):
        self.__driver.get_screenshot_as_png()

    def open_url(self, url):
        self.__driver.get(url)

    @property
    def current_url(self):
        return self.__driver.current_url

    @property
    def title(self):
        return self.__driver.title

    def refresh(self):
        self.__driver.refresh()

    @property
    def switch_to(self):
        return self.__driver.switch_to

    def iframe(self, frame):
        self.switch_to.frame(frame)

    def exit_iframe(self):
        self.switch_to.default_content()

    @property
    def alert(self):
        # return self.switch_to.alert
        # 等待直到页面上出现alert弹框,存在就返回Alert对象,若不存在就返回False
        return self.__wait.until(ec.alert_is_present())

    def alert_confirm(self):
        self.alert.accept()

    def alert_cancel(self):
        self.alert.dismiss()

    def location_element(self, by, value):
        try:
            element = self.__wait.until(ec.presence_of_element_located((by, value)))
            logs.info(f"找到元素:{by}={value}")
            return element
        except Exception as e:
            logs.error(f"未找到元素:{by}={value}")
            raise e

    def location_elements(self, by, value):
        try:
            self.__wait.until(ec.presence_of_all_elements_located((by, value)))
            elements = self.__driver.find_elements(by, value)
            logs.info(f"找到元素列表:{by}={value}")
            return elements
        except Exception as e:
            logs.error(f"未找到元素列表:{by}={value}")
            raise e

    def click(self, locator: tuple, force=False):
        try:
            element = self.location_element(*locator)
            if not force:
                self.__driver.execute_script("arguments[0].click()", element)
            else:
                self.__driver.execute_script("arguments[0].click({force:true})", element)
            logs.info(f"元素被点击:{locator}")
        except NoSuchElementException as e:
            logs.error(f"元素无法定位:{e}")
            raise e

    def send_keys(self, locator: tuple, data):
        try:
            element = self.location_element(*locator)
            element.send_keys(data)
            logs.info(f"元素被输入内容:{locator},输入的内容为:{data}")
        except NoSuchElementException as e:
            logs.error(f"元素无法定位:{e}")
            raise e


# 测试调试
if __name__ == '__main__':
    driver = webdriver.Edge()
    bros = BasePage(driver)
    bros.open_url('https://www.leafground.com/list.xhtml')
    locators = (By.XPATH, '//*[@id="j_idt88_content"]/div')
    # 调用查找 list(列表)的情况--返回一下
    eles = bros.location_elements(By.XPATH, '//*[@id="j_idt88_content"]/div')
    # 可以通过索引去操作每一个元素
    eles[0].click()
    # 也可以通过循环去点击每一个元素
    for i in eles:
        i.click()
        sleep(1)
    sleep(3)
第二十个:截图

之前"第三个:浏览器截屏"是直接截图,补充一下"截图保存的路径"和"文件名称";

1、在项目根目录下新建名称为 screenshot 的目录文件,用于存放截图图片;

2、优化 setting.py 文件;配置截图文件路径;

复制代码
# 导包
import os
import sys


DIR_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(DIR_PATH)

# 显示等待时间设置,默认为10秒
WAIT_TIME = 10

# 文件路径
FILE_PATH = {
    'log': os.path.join(DIR_PATH, 'log'),
    'screenshot': os.path.join(DIR_PATH, 'screenshot')
}

3、用 文件名 加上 当前时间 来展示;

获取当前时间,先导入(from datetime import datetime) datetime 模块;然后 .点 strftime() 里面注意格式"年(大写)月(小写)日(小写)时(大写)分(大写)秒(大写)";

定义文件名称截图格式组成:第一个用 image_name 这个传给它的文件名称,再跟上时间 current_time ,图片格式(jpg、png 等格式都行);

文件存放路径:直接调用配置文件中设置好的截图文件存放路径;通过os.path.join() 函数组装 '文件路径'目录 setting.FILE_PATH.get('screenshot') 和 '文件名'file_name 并赋值给 file_path 存放到screenshot 目录文件中;

在直接写 self.__driver .点 调用 get_screenshot_as_file() 里面传存放路径 file_path,看能不能传这里面去;

复制代码
    def screenshots(self, image_name):
        """
        封装截图的方法
        :param image_name:  文件名
        :return:
        """
        import os
        # 获取当前时间
        current_time = datetime.now().strftime("%Y%m%d%H%M%S")
        file_name = f"{image_name}-{current_time}.png"
        file_path = os.path.join(setting.FILE_PATH.get('screenshot'), file_name)
        self.__driver.get_screenshot_as_file(file_path)

运行成功后会在 screenshot 目录文件下生成 截图图片(文件名+当前时间的年月日时分秒格式),能够存到指定的路径下;

复制代码
# 导包
from pyxnat.core.uriutil import file_path
from selenium import webdriver
from selenium.common import NoSuchElementException
from selenium.webdriver.common.by import By
from time import sleep
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.support.wait import WebDriverWait
from config import setting
from util_tools.logs_util.recordlog import logs
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from datetime import datetime

class BasePage(object):

    def __init__(self, driver):
        self.__driver = driver
        self.__wait = WebDriverWait(self.__driver, setting.WAIT_TIME)

    def window_max(self):
        self.__driver.maximize_window()

    def window_full(self):
        self.__driver.fullscreen_window()

    def screenshot(self):
        self.__driver.get_screenshot_as_png()

    def open_url(self, url):
        self.__driver.get(url)

    @property
    def current_url(self):
        return self.__driver.current_url

    @property
    def title(self):
        return self.__driver.title

    def refresh(self):
        self.__driver.refresh()

    @property
    def switch_to(self):
        return self.__driver.switch_to

    def iframe(self, frame):
        self.switch_to.frame(frame)

    def exit_iframe(self):
        self.switch_to.default_content()

    @property
    def alert(self):
        # return self.switch_to.alert
        return self.__wait.until(ec.alert_is_present())

    def alert_confirm(self):
        self.alert.accept()

    def alert_cancel(self):
        self.alert.dismiss()

    def location_element(self, by, value):
        try:
            element = self.__wait.until(ec.presence_of_element_located((by, value)))
            logs.info(f"找到元素:{by}={value}")
            return element
        except Exception as e:
            logs.error(f"未找到元素:{by}={value}")
            raise e

    def location_elements(self, by, value):
        try:
            self.__wait.until(ec.presence_of_all_elements_located((by, value)))
            elements = self.__driver.find_elements(by, value)
            logs.info(f"找到元素列表:{by}={value}")
            return elements
        except Exception as e:
            logs.error(f"未找到元素列表:{by}={value}")
            raise e

    def click(self, locator: tuple, force=False):
        try:
            element = self.location_element(*locator)
            if not force:
                self.__driver.execute_script("arguments[0].click()", element)
            else:
                self.__driver.execute_script("arguments[0].click({force:true})", element)
            logs.info(f"元素被点击:{locator}")
        except NoSuchElementException as e:
            logs.error(f"元素无法定位:{e}")
            raise e

    def send_keys(self, locator: tuple, data):
        try:
            element = self.location_element(*locator)
            element.send_keys(data)
            logs.info(f"元素被输入内容:{locator},输入的内容为:{data}")
        except NoSuchElementException as e:
            logs.error(f"元素无法定位:{e}")
            raise e

    def enter(self):
        try:
            ActionChains(self.__driver).send_keys(Keys.ENTER).perform()
            logs.info("按下回车键")
        except NoSuchElementException as e:
            logs.error(f"元素无法定位:{e}")
            raise e

    def right_click(self, locator: tuple):
        try:
            element = self.location_element(*locator)
            ActionChains(driver).context_click(element).perform()
            logs.info("执行鼠标右键点击操作")
        except NoSuchElementException as e:
            logs.error(f"元素无法定位:{e}")
            raise e

    def double_click(self, locator: tuple):
        try:
            element = self.location_element(*locator)
            ActionChains(driver).double_click(element).perform()
            logs.info("执行鼠标双击操作")
        except NoSuchElementException as e:
            logs.error(f"元素无法定位:{e}")
            raise e

    def screenshots(self, image_name):
        import os
        # 获取当前时间
        current_time = datetime.now().strftime("%Y%m%d%H%M%S")
        file_name = f"{image_name}-{current_time}.png"
        file_path = os.path.join(setting.FILE_PATH.get('screenshot'), file_name)
        self.__driver.get_screenshot_as_file(file_path)


# 测试调试
if __name__ == '__main__':
    driver = webdriver.Edge()
    bros = BasePage(driver)
    bros.open_url('https://www.leafground.com/input.xhtml')
    local = (By.ID, 'j_idt88:j_idt101')
    bros.send_keys(local, '第一行测试内容')
    bros.enter()
    bros.send_keys(local, '第二行回车键之后的测试内容')
    # 调用鼠标双击方法
    bros.double_click(local)
    # 调用封装好的截图方法--里面传文件名
    bros.screenshots('多行文本')
    sleep(3)
第二十一个:清空

封装清空文本内容方法;

复制代码
# 导包
from pyxnat.core.uriutil import file_path
from selenium import webdriver
from selenium.common import NoSuchElementException
from selenium.webdriver.common.by import By
from time import sleep
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.support.wait import WebDriverWait
from config import setting
from util_tools.logs_util.recordlog import logs
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from datetime import datetime


class BasePage(object):

    def __init__(self, driver):
        self.__driver = driver
        self.__wait = WebDriverWait(self.__driver, setting.WAIT_TIME)

    def window_max(self):
        self.__driver.maximize_window()

    def window_full(self):
        self.__driver.fullscreen_window()

    def screenshot(self):
        self.__driver.get_screenshot_as_png()

    def open_url(self, url):
        self.__driver.get(url)

    @property
    def current_url(self):
        return self.__driver.current_url

    @property
    def title(self):
        return self.__driver.title

    def refresh(self):
        self.__driver.refresh()

    @property
    def switch_to(self):
        return self.__driver.switch_to

    def iframe(self, frame):
        self.switch_to.frame(frame)

    def exit_iframe(self):
        self.switch_to.default_content()

    @property
    def alert(self):
        # return self.switch_to.alert
        return self.__wait.until(ec.alert_is_present())

    def alert_confirm(self):
        self.alert.accept()

    def alert_cancel(self):
        self.alert.dismiss()

    def location_element(self, by, value):
        try:
            element = self.__wait.until(ec.presence_of_element_located((by, value)))
            logs.info(f"找到元素:{by}={value}")
            return element
        except Exception as e:
            logs.error(f"未找到元素:{by}={value}")
            raise e

    def location_elements(self, by, value):
        try:
            self.__wait.until(ec.presence_of_all_elements_located((by, value)))
            elements = self.__driver.find_elements(by, value)
            logs.info(f"找到元素列表:{by}={value}")
            return elements
        except Exception as e:
            logs.error(f"未找到元素列表:{by}={value}")
            raise e

    def click(self, locator: tuple, force=False):
        try:
            element = self.location_element(*locator)
            if not force:
                self.__driver.execute_script("arguments[0].click()", element)
            else:
                self.__driver.execute_script("arguments[0].click({force:true})", element)
            logs.info(f"元素被点击:{locator}")
        except NoSuchElementException as e:
            logs.error(f"元素无法定位:{e}")
            raise e

    def send_keys(self, locator: tuple, data):
        try:
            element = self.location_element(*locator)
            element.send_keys(data)
            logs.info(f"元素被输入内容:{locator},输入的内容为:{data}")
        except NoSuchElementException as e:
            logs.error(f"元素无法定位:{e}")
            raise e

    def enter(self):
        try:
            ActionChains(self.__driver).send_keys(Keys.ENTER).perform()
            logs.info("按下回车键")
        except NoSuchElementException as e:
            logs.error(f"元素无法定位:{e}")
            raise e

    def right_click(self, locator: tuple):
        try:
            element = self.location_element(*locator)
            ActionChains(driver).context_click(element).perform()
            logs.info("执行鼠标右键点击操作")
        except NoSuchElementException as e:
            logs.error(f"元素无法定位:{e}")
            raise e

    def double_click(self, locator: tuple):
        try:
            element = self.location_element(*locator)
            ActionChains(driver).double_click(element).perform()
            logs.info("执行鼠标双击操作")
        except NoSuchElementException as e:
            logs.error(f"元素无法定位:{e}")
            raise e

    def screenshots(self, image_name):
        import os
        # 获取当前时间
        current_time = datetime.now().strftime("%Y%m%d%H%M%S")
        file_name = f"{image_name}-{current_time}.png"
        file_path = os.path.join(setting.FILE_PATH.get('screenshot'), file_name)
        self.__driver.get_screenshot_as_file(file_path)

    def clear(self, locator: tuple):
        try:
            element = self.location_element(*locator)
            element.clear()
            logs.info("清空文本")
        except NoSuchElementException as e:
            logs.error(f"元素无法定位:{e}")
            raise e


# 测试调试
if __name__ == '__main__':
    driver = webdriver.Edge()
    bros = BasePage(driver)
    bros.open_url('https://www.leafground.com/input.xhtml')
    local = (By.ID, 'j_idt88:j_idt101')
    bros.send_keys(local, '第一行测试内容')
    bros.enter()
    bros.send_keys(local, '第二行回车键之后的测试内容')
    # 调用鼠标双击方法
    bros.double_click(local)
    # 调用封装好的截图方法--里面传文件名
    bros.screenshots('多行文本')
    # 清空文本
    bros.clear(local)
    sleep(3)
第二十二个:其他

目前为止只封装了一些比较常用的方法,基本操作的封装好了之后写页面类的时候会方便多了,需要用到哪个功能直接调用就行了;

其他封装方法烦请自行了解学习;

未完待续。。。

相关推荐
CodeLongBear28 分钟前
计算机网络学习笔记 | 传输层核心知识点总结(DAY03,匠心制作)
笔记·学习·计算机网络
测试老哥30 分钟前
python+requests+excel 接口测试
自动化测试·软件测试·python·测试工具·测试用例·excel·接口测试
AI纪元故事会31 分钟前
冰泪与雨丝:一个AI的Python挽歌
开发语言·人工智能·python
ColderYY35 分钟前
Python连接MySQL数据库
数据库·python·mysql
晓北斗NorSnow37 分钟前
机器学习核心算法与学习资源解析
学习·算法·机器学习
寒秋丶1 小时前
Milvus:数据库层操作详解(二)
数据库·人工智能·python·ai·ai编程·milvus·向量数据库
wdfk_prog1 小时前
[Linux]学习笔记系列 -- [kernel][time]tick
linux·笔记·学习
凯歌的博客2 小时前
python虚拟环境应用
linux·开发语言·python
西柚小萌新2 小时前
【深入浅出PyTorch】--8.1.PyTorch生态--torchvision
人工智能·pytorch·python
MonkeyKing_sunyuhua2 小时前
can‘t read /etc/apt/sources.list: No such file or directory
python