从 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 elementsexcept 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 logsclass BasePage(object):def __init__(self, driver):self.__driver = driverself.__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)@propertydef current_url(self):return self.__driver.current_url@propertydef title(self):return self.__driver.titledef refresh(self):self.__driver.refresh()@propertydef switch_to(self):return self.__driver.switch_todef iframe(self, frame):self.switch_to.frame(frame)def exit_iframe(self):self.switch_to.default_content()@propertydef alert(self):# return self.switch_to.alert# 等待直到页面上出现alert弹框,存在就返回Alert对象,若不存在就返回Falsereturn 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 elementexcept Exception as e:logs.error(f"未找到元素:{by}={value}")raise edef 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 elementsexcept Exception as e:logs.error(f"未找到元素列表:{by}={value}")raise edef 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 edef 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 sysDIR_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 datetimeclass BasePage(object):def __init__(self, driver):self.__driver = driverself.__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)@propertydef current_url(self):return self.__driver.current_url@propertydef title(self):return self.__driver.titledef refresh(self):self.__driver.refresh()@propertydef switch_to(self):return self.__driver.switch_todef iframe(self, frame):self.switch_to.frame(frame)def exit_iframe(self):self.switch_to.default_content()@propertydef alert(self):# return self.switch_to.alertreturn 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 elementexcept Exception as e:logs.error(f"未找到元素:{by}={value}")raise edef 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 elementsexcept Exception as e:logs.error(f"未找到元素列表:{by}={value}")raise edef 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 edef 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 edef enter(self):try:ActionChains(self.__driver).send_keys(Keys.ENTER).perform()logs.info("按下回车键")except NoSuchElementException as e:logs.error(f"元素无法定位:{e}")raise edef 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 edef 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 edef 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 datetimeclass BasePage(object):def __init__(self, driver):self.__driver = driverself.__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)@propertydef current_url(self):return self.__driver.current_url@propertydef title(self):return self.__driver.titledef refresh(self):self.__driver.refresh()@propertydef switch_to(self):return self.__driver.switch_todef iframe(self, frame):self.switch_to.frame(frame)def exit_iframe(self):self.switch_to.default_content()@propertydef alert(self):# return self.switch_to.alertreturn 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 elementexcept Exception as e:logs.error(f"未找到元素:{by}={value}")raise edef 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 elementsexcept Exception as e:logs.error(f"未找到元素列表:{by}={value}")raise edef 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 edef 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 edef enter(self):try:ActionChains(self.__driver).send_keys(Keys.ENTER).perform()logs.info("按下回车键")except NoSuchElementException as e:logs.error(f"元素无法定位:{e}")raise edef 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 edef 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 edef 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)
第二十二个:其他
目前为止只封装了一些比较常用的方法,基本操作的封装好了之后写页面类的时候会方便多了,需要用到哪个功能直接调用就行了;
其他封装方法烦请自行了解学习;
未完待续。。。