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 自动化常用到的一些公共方法的封装。

后续可能会继续更新一些方法进去

python + selenium 常用公共方法封装的更多相关文章

  1. JS常用公共方法封装

    _ooOoo_ o8888888o 88" . "88 (| -_- |) O\ = /O ____/`---'\____ .' \\| |// `. / \\||| : |||/ ...

  2. Python&Selenium智能等待方法封装

    摘要:本篇博文用几行代码展示Python和Selenium做自动化测试时常见的显示等待和封装 # 用于实现智能等待页面元素的出现 # encoding = utf-8 ""&quo ...

  3. python selenium常用基本方法---H5和键盘鼠标操作

    一.模拟手机打开页面(H5测试) from selenium import webdriver mobile_emulation = {'deviceName':'iPhone X'} options ...

  4. iOS常用公共方法

      iOS常用公共方法 字数2917 阅读3070 评论45 喜欢236 1. 获取磁盘总空间大小 //磁盘总空间 + (CGFloat)diskOfAllSizeMBytes{ CGFloat si ...

  5. iOS 常用公共方法

    iOS常用公共方法 1. 获取磁盘总空间大小 //磁盘总空间 + (CGFloat)diskOfAllSizeMBytes{ CGFloat size = 0.0; NSError *error; N ...

  6. appium安卓自动化的 常用driver方法封装

    appium安卓自动化的 常用driver方法封装 做安卓自动化的时候,很多方法写起来会造成代码冗余,把这部分封装起来 ,添加到androidUI工具类里,随时可调用 都放在这个类下面: @Compo ...

  7. 常用js方法封装

    常用js方法封装 var myJs = { /* * 格式化日期 * @param dt 日期对象 * @returns {string} 返回值是格式化的字符串日期 */ getDates: fun ...

  8. Java&Selenium智能等待方法封装

    Java&Selenium智能等待方法封装 ExpectedConditions方法还有很多,自然也可以继续扩展很多 package util; import org.openqa.selen ...

  9. Java&Selenium 模拟键盘方法封装

    Java&Selenium 模拟键盘方法封装 package util; import java.awt.AWTException; import java.awt.Robot; import ...

  10. Java&Selenium控制滚动条方法封装

    Java&Selenium控制滚动条方法封装 package util; import org.openqa.selenium.JavascriptExecutor; import org.o ...

随机推荐

  1. vue3 门户网站搭建2-ngnix

    路由配好了,需要调试下 build 后是否可用,这时我们需要一个服务端来运行静态网页. 官网直接下载一个 windows 版本的 ngnix 即可: http://nginx.org/en/downl ...

  2. 直播平台制作,Android 悬浮窗延时5秒返回APP问题

    直播平台制作,Android 悬浮窗延时5秒返回APP问题 案例需求分析:在APP界面,点击Home键后,APP退出后台,同时会打开一个悬浮窗,当用户点击悬浮窗上的按键会返回APP. 出现的问题是:点 ...

  3. API对象--Ingress(chrono《kubernetes入门实战课》笔记整理)

    [概念说明] Service 的功能和运行机制,主要由 kube-proxy 控制的四层负载均衡,即根据IP.PORT来做负载均衡.而很多应用都是在7层做均衡更为合理,比如根据主机名.URI.请求头. ...

  4. centos7添加swap区

    背景:拿到服务器后,部署了多个服务,内存还剩下5G左右,但是在使用的过程中,内存会突然爆满,然后服务器个别服务由于内存不够而终止进程 分析:通过free命令查看内存使用状况,发现Swap区为0,也就是 ...

  5. 路由器WDS(无线桥接,无线中继)

    路由器WDS(无线桥接,无线中继)设置,网上的坑货教程只教了一半,却不教另一半.这些教程一般会教你填写远程路由(被中继的路由器信息),顶多再教你把本地路由的网段,改得跟远程路由一样,或关掉本地路由的D ...

  6. Android蓝牙固件升级 DFU-OTA 固件升级

    1.添加 依赖包: implementation 'no.nordicsemi.android:dfu:1.11.0' 2.DfuService类继承  DfuBaseService package ...

  7. python调用包中函数__init__作用

    python调用包中函数__init__作用 lx:分享一个小知识点 lx:主函数中 调用了 包(目录)中某个模块的函数,但是没有出现模块名.函数铭 lx:可能是再包中的__init__中已经提前调用 ...

  8. idea的小tip

    1. 校验正则表达式 String类型的matches方法中键入option+return选择 check regexp可以测试正则的正确性

  9. webrtc 拥塞控制相关

    RFC8836 对实时交互式音视频应用的拥塞控制算法需求进行了较为全面的总结 延迟 拥塞控制算法应该尽可能降低延时,尤其是算法本身引入的延时.与此同时仍然需要提供可用的带宽水平. -吞吐率:在相应场景 ...

  10. Redis缓存雪崩,击穿和穿透

    这三个问题的发生,会导致大量的请求直接积压到数据库,如果并发量很大,则可能会导致数据库宕机或故障. 缓存雪崩   描述:大量的请求无法在redis缓存中进行处理而被发送到数据库,导致数据库压力陡增. ...