测试学习记录,仅供参考!
二次封装
封装方法
第十九个:找到元素列表(多个)

像这种商城网站,要定位商城列表得用复数形式 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)
第二十二个:其他
目前为止只封装了一些比较常用的方法,基本操作的封装好了之后写页面类的时候会方便多了,需要用到哪个功能直接调用就行了;
其他封装方法烦请自行了解学习;
未完待续。。。