当前位置: 首页 > news >正文

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

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

二次封装

继续封装鼠标、键盘、元素定位的操作;

封装方法

第十五个:点击

封装点击的方法,直接使用 def click(self) 这个方法,这里用一个元组叫 locator:tuple 指定参数需要用元组类型,然后再来一个是否使用强制点击 force=False ;注意第一个参数需要用元组类型,使用 click 函数时就要去传一个元组;

同样需要异常处理,先写完整的异常代码块结构;导入没有找到元素的 NoSuchElementException 异常再使用;

from selenium.common import NoSuchElementExceptiontry:passexcept NoSuchElementException as e:pass

然后再写代码块,点击操作也是需要先定位到元素,再进行点击操作;用封装好的 ‘找到元素’方法直接调用;

self.location_element(*locator):前面带个星号就是以一个元组的类型传给这个 self.location_element() 方法,传给它之后它会自己去解抛,把结果给返回出去 element = self.location_element(*locator) ;

再对 force 参数做个判断,如果force 等于False 的话就执行一个 JavaScript 操作 execute_script(),就是使用JavaScript 去做一个点击,这里面跟上一个JavaScript代码arguments[0],再去调用arguments[0] 的点击 arguments[0].click() 方法,这就是execute_script()的第一个参数‘执行的脚本’,第二个是“找到这个元素”,只要找到这个元素了才能去执行点击操作;

若force 等于 True 的话,就把执行的脚本改成 "arguments[0].click({force:true})" 使用强制点击;

添加日志;

错误的时候打印一下错误日志,最后再抛出异常;

# 导包
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.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 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# 测试调试
if __name__ == '__main__':driver = webdriver.Edge()bros = BasePage(driver)bros.open_url('https://www.leafground.com/alert.xhtml')# driver.find_element(By.XPATH, '//*[@id="j_idt88:j_idt93"]/span[2]').click()# 通过类实例属性去调用封装好的 location_element 方法,查看新封装的方法能不能找到元素# bros.location_element(By.XPATH, '//*[@id="j_idt88:j_idt93"]/span[2]').click()# 定义一个元组locators = (By.XPATH, '//*[@id="j_idt88:j_idt93"]/span[2]')# 直接调用封装好的方法bros.click(locators)sleep(3)

第十六个:输入

封装输入的方法,大致与点击操作相同,传定位方式、定位表达式;第一个参数是元组类型 locator: tuple ,第二个参数 data 是‘要输入的内容’;先写好结构,亦是用 NoSuchElementException 异常;

    def send_keys(self, locator: tuple, data):"""封装输入操作:param locator:  (tuple)定位元素信息,元组类型:param data: 输入的内容:return:"""try:passexcept NoSuchElementException as e:pass

写好结构体后再开始写代码块;

信息输入还是得先定位到元素,直接调用已经封装完的 location_element 方法,用找到这个元素去输入的内容 data (传入的 data),添加日志;

# 导包
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 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/input.xhtml')locators = (By.ID, 'j_idt88:name')bros.send_keys(locators, '这是一个二次开发输入的测试')sleep(3)

第十七个:封装键盘操作
封装模拟键盘回车键操作

后续写页面类的时候,如果有遇到使用回车键时,不用每一个都写 “ActionChains(driver).send_keys(Keys.ENTER).perform()”这么长一遍,封装好方法之后直接调用方法即可;

# 模拟键盘回车键
ActionChains(driver).send_keys(Keys.ENTER).perform()# 调用封装方法 示例bros.enter()

定义一个 def enter(self): 类,里面不用跟参数;回车操作需要先导入 ActionChains 和 Keys 库;

写异常块,用 NoSuchElementException 异常;

调用 ActionChains() 把参数传进去 ActionChains(self.__driver) 再调用ActionChains(self.__driver).send_keys() 类,send_keys() 类里面传键盘 Keys.ENTER 操作,最后调用 perform() 方法提交完成一系列动作链;

ActionChains(self.__driver).send_keys(Keys.ENTER).perform() 这一句话就可以搞定了;

# 导包
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 Keysclass 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 edef enter(self):try:ActionChains(self.__driver).send_keys(Keys.ENTER).perform()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, '第二行回车键之后的测试内容')sleep(3)

第十八个:封装鼠标操作
封装鼠标右键点击操作

后续写页面类的时候,如果有遇到使用鼠标右键点击时,不用每一个都写 “ActionChains(driver).context_click(ele).perform())”这么长一遍,封装好方法之后直接调用方法即可;

先找到元素,调用封装好的 self.location_element() 方法,把self.location_element(*locator)定位方式传给它,再把结果返回出去;接着写鼠标右键点击操作,跟上日志;

    def right_click(self, locator: tuple):"""封装鼠标右键点击操作:param locator:  (tuple)定位元素信息,元组类型:return:"""try:element = self.location_element(*locator)ActionChains(driver).context_click(element).perform()logs.info("执行鼠标右键点击操作")except NoSuchElementException as e:logs.error(f"元素无法定位:{e}")raise e
# 导包
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 Keysclass 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 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.right_click(local)sleep(3)
封装鼠标双击操作

与上一个几乎相同,稍作更改;

    def double_click(self, locator: tuple):"""封装鼠标双操作:param locator:  (tuple)定位元素信息,元组类型:return:"""try:element = self.location_element(*locator)ActionChains(driver).double_click(element).perform()logs.info("执行鼠标双击操作")except NoSuchElementException as e:logs.error(f"元素无法定位:{e}")raise e
# 导包
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 Keysclass 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 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)sleep(3)
鼠标悬停、鼠标拖拽操作、鼠标滚动

与上类型,均是安装此种方式进行封装的,烦请自行参考;

未完待续。。。

http://www.dtcms.com/a/470505.html

相关文章:

  • 做平面的公司网站DNF做钓鱼网站
  • SpringBoot 集成 LangChain4j RAG Redis
  • 【QT】customPlot 设置图例透明背景和文字颜色
  • AT指令解析:ring_buffer、信号量、互斥量等基础知识
  • 任务网站(做任务学技能的)潍坊市建设局网站
  • 【算法】——动态规划之路径问题
  • 阿里云企业建站教程泰州东方医院
  • 东阿县住房和城乡建设局网站申请做版主 再什么网站
  • 深入理解数据在内存中的存储:整数与浮点数的二进制表示
  • 广东网站营销seo费用品牌推广活动有哪些
  • 特效音网站建设公司官网制作平台
  • MySQL数据库安装后,如何设置自动化备份策略?
  • 【开题答辩全过程】以 保险业务信息管理系统为例,包含答辩的问题和答案
  • 进口食品销售销售在那个网站做seo托管
  • 公司模板网站建设成绩查询系统网站开发
  • 建设大淘客网站雅布设计师
  • Oracle ADRCI工具全面使用指南:从基础到故障诊断实战
  • 美食网站设计欣赏上海著名网站建设
  • 【智能系统项目开发与学习记录】bringup功能包详解
  • 外贸网建站建公司网站的详细步骤
  • 美食网站建设书成都seo技术
  • 江河建设集团有限公司网站梧州网站建设流程
  • 在Qt中使用VTK
  • 正安北郊湖吉他文化广场自动化监测
  • 【论文阅读】DSPy-based neural-symbolic pipeline to enhance spatial reasoning in LLMs
  • cn域名后缀网站163企业邮箱格式
  • psql常用命令
  • 高速公路自动车道保持系统原理与实现
  • 番禺做网站最便宜的哪家公司wordpress注册界面
  • 【推荐100个unity插件】将您的场景渲染为美丽的冬季风景——Global Snow 2