python + selenium 常用公共方法封装
selenium 环境配置及浏览器驱动的安装:https://www.cnblogs.com/gancuimian/p/16435300.html
uiautomator2 常用公共方法封装见之前的帖子:https://www.cnblogs.com/gancuimian/p/16948536.html
appium 常用公共方法封装见之前的帖子:https://www.cnblogs.com/gancuimian/p/16985527.html
在写(UI)自动化测试用例的时候,最常用的就是方法的调用。我们在这里,把公共方法封装到一个文件中,
这样以后需要使用,直接调用这个方法就可以了。
以下为个人常使用到的一些 selenium 公共方法的封装,(大多都与 appium 的公共方法通用,个别不太一样)
里面有一些操作是有重复的,这个根据个人情况,如果不需要可以不用。重复的话就多个选择,想用哪个用哪个。
首先需要导入/引用到的库
import os,time,faker,random from typing import Tuple, Union, Dict from selenium.webdriver import Chrome from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as when, expected_conditions from selenium.webdriver import ActionChains,Keys
直接上代码:
class Page: def __init__(self,driver:Chrome): self.driver = driver def goto(self,url): """ 去哪个url地址 """ # if url.find("https://") != -1: # return self.browser.get(url) return self.driver.get(url) def input(self,locator,values): """ 输入框当中输入内容 """ el = self.driver.find_element(*locator) el.send_keys(values) def clear(self, element): """ 清空输入框中的内容 """ el = self.driver.find_element(*element) el.clear() def click(self,locator): """ 点击 """ # 设置显性等待时间 wait = WebDriverWait(self.driver, timeout=8) # 等待某个元素出现并可点击 condition = when.element_to_be_clickable(locator) # 定位元素.点击按钮 element = wait.until(condition) # 点击元素 ActionChains(self.driver).click(element).perform() def double_click(self,locator): """ 双击 """ # 设置显性等待时间 wait = WebDriverWait(self.driver, timeout=10) # 等待某个元素出现并可点击 condition = when.element_to_be_clickable(locator) # 定位元素.点击按钮 element = wait.until(condition) # 双击元素 ActionChains(self.driver).double_click(element).perform() def drag_and_drop(self,locator1,locator2): """ 拖动 """ # 设置显性等待时间 wait = WebDriverWait(self.driver, timeout=10) condition = when.element_to_be_clickable(locator1) element1 = wait.until(condition) # 定位到元素1,定位到元素2 condition = when.element_to_be_clickable(locator2) element2 = wait.until(condition) # 拖动元素 ActionChains(self.driver).drag_and_drop(element1,element2).perform() def is_element_exist(self, element: Tuple[str, Union[str, Dict]], wait_seconds: int = 10) -> bool: """ 判断元素是否存在 """ by = element[0] value = element[1] try: if by == "id": WebDriverWait(self.driver, wait_seconds, 1).until(expected_conditions.presence_of_element_located((By.ID, value))) elif by == "name": WebDriverWait(self.driver, wait_seconds, 1).until(expected_conditions.presence_of_element_located((By.NAME, value))) elif by == "class": WebDriverWait(self.driver, wait_seconds, 1).until(expected_conditions.presence_of_element_located((By.CLASS_NAME, value))) elif by == "text": WebDriverWait(self.driver, wait_seconds, 1).until(expected_conditions.presence_of_element_located((By.LINK_TEXT, value))) elif by == "partial_text": WebDriverWait(self.driver, wait_seconds, 1).until(expected_conditions.presence_of_element_located((By.PARTIAL_LINK_TEXT, value))) elif by == "xpath": WebDriverWait(self.driver, wait_seconds, 1).until(expected_conditions.presence_of_element_located((By.XPATH, value))) elif by == "css": WebDriverWait(self.driver, wait_seconds, 1).until(expected_conditions.presence_of_element_located((By.CSS_SELECTOR, value))) elif by == "tag": WebDriverWait(self.driver, wait_seconds, 1).until(expected_conditions.presence_of_element_located((By.TAG_NAME, value))) else: raise NameError("Please enter the correct targeting elements,'id','name','class','text','xpath','css'.") except: return False return True def get_element_text(self,locator): """ 元素定位,获取text文本 """ el = self.driver.find_element(*locator) return el.text def is_text_exist(self, text: str, wait_seconds: int = 10) -> bool: """ 判断text是否于当前页面存在 """ for i in range(wait_seconds): if text in self.driver.page_source: return True time.sleep(1) return False def is_loaded(self,url,timeout=8): """ 判断某个 url 是否被加载 """ return WebDriverWait(self.driver, timeout).until(when.url_contains(url)) def get_element_attribute(self,locator,expected): """ 获取某个元素的属性 """ el = self.driver.find_element(*locator) return el.get_attribute(expected) def get_toast_text(self): """ toast弹窗/获取toast文本内容 """ toast = self.driver.find_element("xpath", "//android.widget.Toast") return toast.text def emter(self): """ 回车 """ return ActionChains(self.driver).send_keys(Keys.ENTER).perform() def copy(self): """ 复制快捷键 """ actions = ActionChains(self.driver) return actions.key_down(Keys.CONTROL).send_keys("c").key_up(Keys.CONTROL).perform() def paste(self): """ 粘贴的快捷键 """ actions = ActionChains(self.driver) return actions.key_down(Keys.CONTROL).send_keys("v").key_up(Keys.CONTROL).perform() def set_attribute(self,locator,name,value): """ 设置元素属性(12306) """ el = self.driver.find_element(*locator) js = f'arguments[0].{name} = f"{value}"' self.driver.execute_script(js,el) def switch_to_iframe(self,locator,timeout=10): """ 切换iframe """ # iframe = self.browser.find_element(*locator) # self.browser.switch_to.frame(iframe) # 使用显性等待 切换 iframe wait = WebDriverWait(self.driver, timeout) wait.until(when.frame_to_be_available_and_switch_to_it(locator)) def switch_to_default(self): """ iframe 切回主页面 """ self.driver.switch_to.default_content() def scroll_to_bottom(self): """ 滚动到页面底部,使用js操作 """ js = "window.scrollTo(0,document.body.scrollHeight)" self.driver.execute_script(js) def screenshot(self, name): """ 截图(注释的部分,根据个人需求可增or减) """ # day = time.strftime('%Y-%m-%d', time.localtime(time.time())) # fp = "..\\Result\\" + day fp = ".\\images\\" # ".":表示上级; "..":表示上上级 tm = time.strftime('%Y-%m-%d-%H_%M', time.localtime(time.time())) if os.path.exists(fp): filename = fp + "\\" + tm + '_' + name + '.png' else: os.makedirs(fp) filename = fp + "\\" + tm + '_' + name + '.png' self.driver.save_screenshot(filename) def randmon_phone(self): """ 随机生成一个手机号,或者其他想生成的数据 """ while True: phone = "130" for i in range(8): num = random.randint(0, 9) phone += str(num) return phone def generate_phone_number(self): """ 随机生成手机号(与上面的实现方法一致,写法用了列表推导式) """ prefix = "130" suffix = [random.randint(0, 9) for _ in range(8)] return f"{prefix}{''.join([str(i) for i in suffix])}" def new_mobile(self): """ 随机生成手机号,需下载:pip install pytest_facker """ fk = faker.Faker(locale=["zh_CN"]) return fk.phone_number() if __name__ == '__main__': pass
以上就是本人 selenium 自动化常用到的一些公共方法的封装。
后续可能会继续更新一些方法进去
更新一个截图的操作
import allure import time from selenium import webdriver class ScreenshotUtil: @staticmethod def get_file_path(dir_name, filename): """Construct the full path for the screenshot file.""" return f"{dir_name}/{filename}" @staticmethod def take_and_attach_screenshot(driver, step_title, file_name, dir_name='screenshots'): """Take a screenshot and attach it to the Allure report.""" file_path = ScreenshotUtil.get_file_path(dir_name, file_name) driver.get_screenshot_as_file(file_path) # 使用get_screenshot_as_file方法 with allure.step(step_title): allure.attach.file(file_path, name=step_title, attachment_type=allure.attachment_type.PNG) # Example usage in a test class class TestExample:
# 使用示例 def __init__(self, driver): self.driver = driver def test_login(self): """Test login and attach the screenshot of the login page to the test report.""" time.sleep(2) # Wait for the login page to load ScreenshotUtil.take_and_attach_screenshot(self.driver, "Login Page", "login.png", 'screen') # Continue with the rest of the test logic