从 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)
鼠标悬停、鼠标拖拽操作、鼠标滚动
与上类型,均是安装此种方式进行封装的,烦请自行参考;
未完待续。。。