python+selenium实现UI自动化(一)

2023-11-03

一.selenium  

selenium官方网站

  1. selenium ide 录制工具。 火狐/google/edge插件
  2. selenium webdriver   结合代码来编写自动化用例。提供很多在浏览器上的操作的api,本文主要记录此项的学习过程
  3. selenium grid   分布式。火狐/google/edge上同时运行。把所有用例拆分到多设备上运行,运行效率更高,更快。

二.环境准备。(以Chrome为例)

1.查看电脑的浏览器版本

 下载谷歌驱动,解压至python安装目录下

 2.安装python环境,这个就不多说了

     安装selenium库

pip3 install -U selenium. #已装过的加 -u可以更新

 三、浏览器操作

# 写段代码,打开浏览器,访问百度
# 1、导入selenium
from selenium import webdriver

# 2、打开浏览器。开始与浏览器会话。会去启动chromedriver程序
driver = webdriver.Chrome()
# 3、访问百度
driver.get("http://www.baidu.com")#到这运行弹出百度后自动退出。也可能存在部分windows系统版本没自动退

# 4、浏览器最大化
driver.maximize_window()

# 5、网页刷新操作
driver.refresh()

# 再访问一个页面.     新增了一个窗口
driver.get('https://blog.csdn.net/m0_52310579')
time.sleep(2)

# 6、在有历史访问记录情况下,返回上一次访问的页面。
driver.back()
time.sleep(2)

# 7、在有历史访问记录情况下,访问下一页。
driver.forward()

# 关闭当前窗口。存在多个窗口时,仅关闭当前窗口。存在一个窗口时关闭窗口但不会关驱动程序
driver.close()

# 关闭整个浏览器会话,关闭驱动程序。
driver.quit()

 四、了解html构成

html快速了解

html的内容表达:
<起始标签名 属性名=值 属性名=值 属性名=值> 文本内容 </结束标签名>      标签名也叫做元素名
元素的特征:标签名/元素类别、属性、文本内容

通用属性

id: 在这个html当中是唯一的。 id有可能是变动的。

class: 在html当中并不是唯一的。class值可以有多个,用空格隔开。

name: 在html当中并不是唯一的,概率比较高,根据元素的功能业务取的名字。

style: 样式。display: none; visibility: hidden; -- 隐藏不可见

script元素不要考虑用它定位

元素与元素之间的关系: 树形结构 - 兄弟姐妹节点、父节点、先辈节点、子孙后代节点

五、元素定位

目的:希望在整个html中,快速的找到要操作的元素,尽量只匹配到1个

传统八大定位.

第一类:只根据一个特征来定位  >>>很难根据一个特征来定位,可以组合

id  元素的id属性
name  元素的name属性
class_name  元素的class属性
tag_name   元素的标签名

针对a元素:
link_text   a元素的文本精准匹配
partial_link_text   a元素的文本部分匹配

第二类:万能定位
xpath(相对定位):
css_selector(选择器,难度大需要有前端基础先了解): 参考CSS

五、xpath相对定位

绝对定位:太长,依赖于路径和位置,而且可能页面会发生变动,不稳定。不考虑此方法

相对定位:相对于根结点,相对于上一个节点,只要符合条件的元素

方法1. //元素标签名[@属性名=值] (不变动的属性,不会因为用户的操作发生改变 )

 方法2.//元素标签名[text()=值]   (还是那个元素,可以换成文本定位)

 方法3.and or    组合定位
//元素标签名[text()=值 and @属性名=值 and @属性名=值] 
//元素标签名[text()=值 or @属性名=值 or @属性名=值]

方法4.contains(@属性,值)  属性值部分包含       contains(text(),值)  文本内容部分包含 
//元素标签名[text()=值 and contains(@属性,值)]

如图:已连续活跃0天,这个0是可变的,所以用contains部分包含“已连续活跃”即可定位

 ===================以上4种只利用了元素本身的特征来定位=====================

 ============以下2种利用元素之间的层级关系+元素本身的特征共同来定位============

方法5.按照html页面的顺序,从上往下定位。//.....//.....//......

图文中,想定位那个110文本的元素,根本定位不到,因为110是可变的,所以定位它的父节点 ,再通过//定位父节点下的子节点

//div[@class="stu-num"]    定位父节点

//p  定位子节点

方法6.轴定位。   通过兄弟找,通过后代元素找长辈元素

parent     父节点

ancestor    包括父节点在内的,先辈节点

preceding-sibling  同级的哥哥元素

following-sibling  同级的弟弟元素

已找到的元素与要找的元素之间的关系

语法://已经找到的元素/轴定位名称::标签名[...]  

//p[text()="课程人数"]/preceding-sibling::p

六、查找元素

找元素:

find_element(定位策略, 定位表达式)   # 只查找匹配表达式的第一个元素,返回元素对象
find_elements(定位策略, 定位表达式) # 查找匹配表达式的所有元素,返回列表,列表的成员是元素对象。

元素的操作:
1、输入操作  ele.send_keys()  可以输入多个值,也可以输入Keys类里的按键
2、点击操作  ele.click()
3、清除输入框的内容  ele.clear()

4、获取元素文本 -- ele.text
5、获取元素的属性值 -- ele.get_attribute(属性名)

from selenium.webdriver.common.by import By  #导By类,选择定位策略
from selenium.webdriver.common.keys import Keys #导Keys类,用于除26英文字母和数字之外的操作
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://testingpai.com/")
#查找输入框
ele = driver.find_element(By.XPATH, '//input[@placeholder="Search TestingPai via Bing"]')
#对输入框进行输入并点击回车
ele.send_keys("selenium",Keys.ENTER)
time.sleep(7)
driver.quit()

七、面试题:selenium有哪些等待方式?隐性等待与显性等待的区别??

在页面进行一系列操作的时候,是会有页面内容进行更新的。。
要等待更新的内容呈现以后,再进行操作
所以我们需要适当的等待

time.sleep() 强制等待,等固定时间,不管元素什么时候出现。不够智能

智能等待:隐性等待、显性等待

给一个等待上限,假设20秒,只要在20秒内任意时间条件成立了,就不再等待,继续执行下一行代码

隐性等待:implicitly_wait(等待上限)      

   条件:元素存在于页面即可。【存在就是在html当中能够搜索到。可见是页面当中占据了一定的大小】
一般创建会话之后,就可以调用隐性等待。只需要调用一次,整个会话【一次会话(打开浏览器到关闭浏览器)】生效。如果超过等待上限,元素还不存在,则报超时错误。    

显性等待:有一个专门的条件模块 WebDriverWait类

等待 - 等待上限,等待期间去轮询条件的周期。确定每xx久,去看一次条件是否成立

from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# WebDriverWait(driver, 等待上限, 每隔多久去查看条件成立默认是0.5秒).until(条件)直到条件成立
# WebDriverWait(driver, 等待上限, 每隔多久去查看条件成立默认是0.5秒).until_not(条件)  直到条件不成立
# expected_conditions 每一个条件就是一个函数,部分条件如下⬇️:
# visibility_of_element_located(元素定位元组)  -- 指定元素可见
# presence_of_element_located(元素定位元组) --- 指定元素存在
# element_to_be_clickable(元素定位元组或者driver.find_element) --- 指定元素可点击
locator = (By.XPATH,"//span[@id='navLogin'")
WebDriverWait(driver,20).until(EC.visibility_of_element_located(locator=locator))

常用组合:
显性等待 + sleep(0.5-2)
3个等待之间完全不冲突....
 

八、窗口切换

1、触发新窗口出现

      1.1、sleep(0.5 ~1)

2、获取所有的窗口句柄 --  句柄理解为是个窗口id,每次都会变
   列表 - 窗口打开的顺序。最新打开的窗口,会追加在列表末尾。

3、切换
   driver.switch_to.window(窗口句柄)

from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://testingpai.com")
#1、触发新的窗口
driver.find_element(By.XPATH,"//a[contains(text(),'长歌测试半生,归来仍是少')]").click()
#2、稍作等待
time.sleep(0.5)
#3、获取所有的窗口句柄
wins = driver.window_handles
print("当前会话中的所有窗口句柄:",wins)
print("当前窗口的句柄:",driver.current_window_handle)
#4、切换到最新打开的窗口
driver.switch_to.window(wins[-1])
print("切换之后的窗口句柄:",driver.current_window_handle)
#5、找到元素获取文本
locator = (By.XPATH,"//span[@aria-label='总访问计数']//span")
WebDriverWait(driver,10).until(EC.visibility_of_element_located(locator))
value=driver.find_element(*locator).text
print(f"总访问量为:{value}")
#6、再切换窗口
driver.switch_to.window(wins[-2])
time.sleep(7)
driver.quit()

九、iframe切换

find_element的时候,是不会跨html的。
iframe == 里面存放的就是一个html
如果我们要找iframe当中的元素进行操作,那么必须切换进入iframe当中的html才能找得着。

1、怎么知道要操作的元素是否在iframe当中??
  F12当中写完定位表达式找到元素后,看查找框上面的,元素的绝对定位路径中是否有html(不是开头)
  当你明确元素定位没有错,等待也够,依然报找不着的,考虑一下是不是在iframe当中。

2、如果在iframe当中,切换进入iframe。
  driver.switch_to.frame(3种)
  1种-字符串:id或者name属性
  2种-元素对象:driver.find_element()
  3种-整数:iframe元素的索引。从0开始的哟

3、回到默认的html当中去
  driver.switch_to.default_content()

4、默认html -> iframe -> iframe
  回到上一层iframe
  driver.switch_to.parent_frame()

十、alert

js弹框
案例地址:https://www.w3school.com.cn/js/js_popup.asp
如果遇到了js弹框,不把它关掉,啥也别想干。
目标:将它关掉
Alert类 -- 能处理警告框、确认框和提示框。
实例化: Alert(driver)
方法:
accept()  -- 确定
dismiss() -- 取消
send_keys() -- 输入内容

import time
driver = webdriver.Chrome()
driver.implicitly_wait(20)
driver.get("https://www.w3school.com.cn/tiy/t.asp?f=eg_js_prompt")
driver.switch_to.frame('iframeResult')
driver.find_element(By.XPATH,'//button[text()="试一试"]').click()
time.sleep(2)
alert = driver.switch_to.alert
alert.accept()
time.sleep(7)
driver.quit()

十一、鼠标操作

能不用鼠标操作,就不用鼠标操作,而且当你的代码执行时有鼠标操作,你不能动鼠标。

ActionChains类  ---
鼠标操作方法:
move_to_element(element) --悬浮
click(element) -- 点击
double_click(element) --双击
context_click(element) -- 右键
drag_and_drop(ele1, ele2) -- 拖拽
pause() -- 暂停

执行鼠标操作:perform()

使用步骤:
1、实例化ActionChains(driver)
2、调用鼠标操作方法 -- 可以调多个
3、调用perform() --执行鼠标操作

from selenium.webdriver.common.action_chains import ActionChains
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("http://testingpai.com/")
#1、实例化ActionChains类
ac = ActionChains(driver)
#2、调用鼠标操作方法  --可以调多个-- 悬浮+点击
ele = driver.find_element(By.XPATH,'//span[contains(text(),"柠檬")]')
ac.move_to_element(ele).pause(0.5).click(ele)  #链式调用
#3、调用perform(),执行鼠标操作
ac.perform()
#4、选择下拉列表当中某个元素,点击操作
driver.find_element(By.XPATH,'//details-menu//a[text()="柠檬班官网"]').click()

time.sleep(7)
driver.quit()

十二、js滚动条操作

为什么要滚动滚动条??
1、查看其它元素
第一种: 页面太长,元素已经加载出来,但是看不见。(两种方法)
     1.1.元素属性:ele.location_once_scrolled_into_view -- 【与窗口顶部对齐】,与底部对齐选择下面这个
     1.2. js代码:arguments[0].scrollIntoView(true);
            true  【与窗口顶部对齐】
            false  【与窗口底部对齐】
python selenium当中如何去执行js代码?
driver.execute_script(js代码字符串, 参数)
     1.3、js如何接收传进来的参数??
   --- js代码中,使用arguments来接收外部参数。 列表类型。
   --- arguments[0]  表示第一个参数
   --- arguments[n]  表示第n+1个参数

driver = webdriver.Chrome()
driver.get("http://testingpai.com/article/1595507317340")
#找到元素
ele = driver.find_element(By.XPATH,'//h5[text()="1、BeautifulReport风格的报告"]')
#将元素拖动到可见区域中来---默认与顶部对齐
# ele.location_once_scrolled_into_view
#使用js代码--与页面底部对齐
# driver.execute_script("arguments[0].scrollIntoView(false)",ele)

time.sleep(7)
driver.quit()

第二种:分页加载,滚动条边滚动边加载内容。 -- 翻页。
    只能滚动滚动条

  • window.scrollTo(0,0):滑动到指定坐标位置
  • window.scrollBy(0,0):基于当前位置滑动指定像素距离  --
  • document.documentElement.scrollTop:获取当前滚动距离最上方的距离(垂直方向)
  • document.documentElement.scrollLeft:获取当前滚动距离最左侧的距离(水平方向)
driver = webdriver.Chrome()
driver.get("https://www.jd.com/?cu=true&utm_source=baidu-search&utm_medium=cpc&utm_campaign=t_262767352_baidusearch&utm_term=106807362512_0_c994b5c473db4a1b8ee23ea1d0cff6f6")
time.sleep(3)
for _ in range(6):
    driver.execute_script("window.scrollBy(0,800);")
    time.sleep(2)
    # 等待你要找的元素可见,如果可见就不滚啦。。如果不可见,继续滚。最多滚10次。
time.sleep(7)
driver.quit()

十三、js点击操作

用element的点击操作,没有生效的情况下,可以选择使用js去完成点击操作。
js点击元素的代码: 元素.click();
注意:js代码是立即去操作页面,不会去等待。在调用js代码之前,要等待元素是可见的。
driver.execute_script("arguments[0].click()", ele)


driver = webdriver.Chrome()
driver.implicitly_wait(20)

driver.get('https://www.iloveyou.com/#/login')

# 等待元素可见
loc = (By.XPATH, '//span[text()="登录"]/parent::button')
WebDriverWait(driver,10).until(EC.visibility_of_element_located(loc))
# driver.find_element(*loc).click()
ele = driver.find_element(*loc)
# 执行js代码  ---
driver.execute_script("arguments[0].click()", ele)



time.sleep(7)
driver.quit()

十四、上传操作

 一、pywinauto

1、pip install pywinauto

2、使用(windows)
from pywinauto.keyboard import SendKeys
SendKeys('文件路径1')
SendKeys('文件路径2')  # 支持传多个
SendKeys('{ENTER}')


 二、pyautogui

1、pip install pyautogui
2、使用(跨平台、windows、linux、mac、文件路径不能有中文、不支持多文件上传)
       pyautogui.typewrite(r'D:\fk88.png')          选择文件
       pyautogui.press(keys='enter',presses=3)         确认上传
参数:1、keys:按键; 2、presses=1:重复按多少次; 3、interval=0.0:间隔(浮动,可选):每次按下之间的秒数

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python+selenium实现UI自动化(一) 的相关文章

随机推荐

  • SVN 安装与使用教程总结

    转载 http www cnblogs com armyfai p 3985660 html SVN简介 为什么要使用SVN 程序员在编写程序的过程中 每个程序员都会生成很多不同的版本 这就需要程序员有效的管理代码 在需要的时候可以迅速 准
  • Error:在安装elasticsearch和logstash程序出现的报错

    开启logstash服务出现 Failed to start logstash service Unit not found root localhost systemctl start logstash Failed to start l
  • ALAssetsLibrary获取所有图片

    通过创建ALAssetsLibrary 的实例可以访问系统Photos里的图片与视频 这个库包括了保存的图片 从iTunes导入的和从其他设备里面导入的图片 你可以访问所有的分类和保存图片视频 用普通的alloc和init就可以创建ALAs
  • word给公式自动编号、交叉引用

    利用域给公式自动编号 鼠标定位在公式末尾 如下图 注意是蓝框的末尾 在红框的末尾会无法识别 在公式末尾输入一个 号 作用是让编号右对齐 前不要有空格 插入 文档部件 域 如图指示 点击确定 这里的equaltion是自己添加的 后面再说 公
  • 【解释】对用户透明=对用户隐蔽:关系模型的存取路径对用户透明

    在计算机中 从某个角度看不到的特性称该特性是透明的 这个意义上的 透明 与社会生活中的透明含义恰好相反 例如计算机组织对程序员是透明的 就是说计算机组织对程序员来说是看不到的 也不需要看到的 和汉语字典里面的意思不一样 举个栗子 比如数据库
  • 网络安全之sql注入-less1

    less 1 是字符注入 union注入的步骤一般有以下几步 1 判断注入点 2 判断是整型还是字符型 3 判断查询列数 4 判断显示位 5 获取敏感信息 1 判断注入点 我们再Less1中看到 id将作为参数来使用 因此我们输入 http
  • python moviepy学习系列(一)安装及功能模板简介

    Moviepy简介 Moviepy是一个用于视频编辑的Python模块 它可被用于一些基本操作 如剪切 拼接 插入标题 视频合成 即非线性编辑 视频处理和创建高级特效 它可对大多数常见视频格式进行读写 包括GIF 安装方式 Pip安装方式
  • 闻达搭建paddingpadding

    项目地址wenda LLM wenda 闻达 一个LLM调用平台 为小模型外挂知识库查找和设计自动执行动作 实现不亚于于大模型的生成能力 github com git clone https github com wenda LLM wen
  • STM32定时器学习 hal库PWM输入捕获实验

    实验原理 输入捕获实验目的是为了获得脉宽和频率 首先是脉宽的获得 在实际捕获实验中 有两个通道 一个负责捕获上升沿 一个负责下降沿 从上图可以看出 t1 t2 时间就是我们需要测量的高电平时间 假如定时器工作在向上计数模式 测量方法是 首先
  • 特殊的IP地址127.x.x.x的含义

    特殊的IP地址127 x x x的含义 127 0 0 1 127 0 0 1是最常用的一种 表示本地计算机的IP地址 也可以用localhost表示 最常见的用法是 在 Windows 平台下使用快捷键 Win R 打开运行对话框 接着输
  • 十--nodejs原理(buffer)

    1 Buffer 1 Arraybuffer对象是用表示通用的 固定长度的二进制数据缓冲区 Arraybuffer不能直接操作 而是要通过类型数组对象或DataView对象来操作 它们会将缓冲区数据表示为特定格式的数据 并通过这类格式来读写
  • 冲流量显示与服务器通讯异常,科来:如何分析网络异常流量突发

    概述 网络异常流量突发是经常困扰运维管理人员的问题之一 突发流量可能会造成网络的拥塞 从而产生丢包 延时和抖动 导致网络服务质量下降 不仅如此 突发流量还可能存在安全风险 例如 DoS攻击 蠕虫 窃密等 会对网络和业务系统造成更大的危害 常
  • 学习C++项目——数据库知识学习(主从原理,分离配置,远程工具只是了解,都没有实现)

    学习数据库知识 一 思路和学习方法 本文学习于 B站平台UP主 IT 小当家 学习 MySQL 数据库 如里面加以自己的一些学习复现和理解 如有侵权会进行删除 学习Oracle以后也可以参考之前学习的UP主 C语言技术网 www freec
  • Java作用域与生命周期

    基本数据类型的作用域 作用域决定了在其内的变量名的可用性和生命周期 与c c 一样 作用域由花括号的位置决定 int x 5 x y都可用 int y 6 只有x可用 尽管下列代码在c c 中合法 但在Java中不能使用 c c 中将一个较
  • 《我的眼睛--图灵识别》第一章:起源

    我的眼睛 图灵识别 第一章 起源 账号登录 相信经常上网的你对上面这张图肯定不会陌生 特别是在注册新账号 账号登录或发表新文章之类的时候 它们都有可能出现要求我们输入 那么肯定会有人提出疑问 这些所谓的验证图形码跟我要做的事情毫无任何关系
  • Ubuntu开机后卡在登陆界面进去不

    系统 Ubuntu18 03 系统跑代码卡死了 导致鼠标键盘都用不了 直接强制关机后 卡在登陆界面进不去 步骤 1 系统启动后 在BIOS引导界面按 ESC 键进入选择菜单 选择第一个 Ubuntu 按 e 键进入编辑模式 2 在 hand
  • linux-ubuntu-bash切换zsh问题

    bash切换zsh问题记录 简单切换 sudo chsh s zsh 如果该命令没有生效 则可以直接修改配置文件 sudo gedit etc passwd 将 bin zsh改为 bin zsh
  • 【Linux系统编程】20.程序、进程、CPU和MMU、PCB

    目录 程序 进程 CPU和MMU PCB 程序 编译好的二进制文件 存在磁盘上 只占用磁盘资源 进程 进程是活跃的程序 占用系统资源 在内存中执行 程序运行起来 产生一个进程 程序类似于剧本 进程类似于一场戏 一场戏需要舞台 演员 灯光 道
  • (五)SpringCloud-Ribbon负载均衡

    目录 1 Spring Cloud Ribbon简介 2 Ribbon提供了七种负载均衡策略 3 微服务架构下如何使用Ribbon 3 1 使用Eureka作为注册中心时使用Ribbon 3 1 1 引入ribbon依赖 3 1 2 往容器
  • python+selenium实现UI自动化(一)

    一 selenium selenium官方网站 selenium ide 录制工具 火狐 google edge插件 selenium webdriver 结合代码来编写自动化用例 提供很多在浏览器上的操作的api 本文主要记录此项的学习过