前言

  • Python+Selenium 来实现的web端自动化, 以下演示会用到禅道、百度和自己编写的html.

一、准备工作

1、安装

  • 安装Python 3
  • 安装selenium库,命令:pip install selenium
  • 搭建禅道环境

2、导入浏览器驱动

selenium操作不同的浏览器,需要下载不同浏览器的驱动


  • Firefox 浏览器驱动: 浏览器驱动下载 webdriver.Chrome()
  • Chrome浏览器驱动:浏览器驱动下载 webdriver.Firefox()
  • IE浏览器驱动:浏览器驱动下载 webdriver.Ie()
  • Edge浏览器驱动:浏览器驱动下载 webdriver.Edge()

以chrome浏览器为例:
1、进入到下载页面,找到符合自己浏览器版本的驱动
2、下载好了之后,右键解压到当前文件夹
3、将得到的chromedriver.exe放到Python的安装目录

二、使用

from selenium import webdriver
from selenium.webdriver.common.by import By
import timeclass Zen_Tao:def __init__(self):# 初始化一个chrome浏览器(驱动谷歌浏览器时,直接使用webdriver.Chrome()可能会报错,建议使用一下方法)options = webdriver.ChromeOptions()options.add_experimental_option('excludeSwitches', ['enable-logging'])self.drive = webdriver.Chrome(options=options)# 最大化窗口self.drive.maximize_window()# 隐式等待,设置最大的等待时长,只对查找元素(find_elementXXX)生效self.drive.implicitly_wait(2)def log_on(self):'''代码执行'''# 通过get()方法打开网页self.drive.get('http://192.168.100.210/zentao/')def sign_out(self):'''退出浏览器'''self.drive.close()  # 关闭浏览器self.drive.quit()  # 关闭浏览器并且关闭驱动if __name__ == "__main__":run = Zen_Tao()run.log_on()run.sign_out()

1、元素定位方法

  • 禅道登陆演示
图一

图二

  • 单属性查找
    def log_on(self):'''代码执行'''# 通过get()方法打开网页self.drive.get('http://192.168.100.210/zentao/')# 1.用 id 属性定位查找self.drive.find_element(By.ID, "account")# 2.用 name 属性定位查找self.drive.find_element(By.NAME, "account")# 3.用 class 属性定位查找self.drive.find_element(By.CLASS_NAME, "form-control")# 4.用 xpath 属性定位查找self.drive.find_element(By.XPATH, '//*[@id="account"]')# 5.具有给定标签名称的第一个元素将被返回self.drive.find_element(By.TAG_NAME, "input")# 6.用 css 属性定位查找# 方法一[标签名]self.drive.find_element(By.CSS_SELECTOR, 'input')# 方法二[id], #代表idself.drive.find_element(By.CSS_SELECTOR, '#account')# 方法三[class], .代表classself.drive.find_element(By.CSS_SELECTOR, '.form-control')# 方法四[其他属性]self.drive.find_element(By.CSS_SELECTOR, '[name="account"]')# 7.链接文本值与位置匹配的第一个元素将被返回# (通过标签对之间的文本进行定位)self.drive.find_element(By.LINK_TEXT, "忘记密码")# 8.具有部分链接文本值与位置匹配的第一个元素将被返回# (partial link其实是对link的一个扩展,因为有些时候链接文本很长,这时候就可以使用其中的一部分来进行定位)self.drive.find_element(By.PARTIAL_LINK_TEXT, "忘记")
  • 组合属性查询
    def log_on(self):'''代码执行'''# 1.通过get()方法打开网页self.drive.get('http://192.168.100.210/zentao/')# 2.标签名和id属性值组合定位self.drive.find_element(By.CSS_SELECTOR, 'input#account')# 3.标签名和class属性值组合定位self.drive.find_element(By.CSS_SELECTOR, 'input.form-control')# 4.标签名和属性(含属性值)组合定位self.drive.find_element(By.CSS_SELECTOR, 'input[name="account"]')# 5.多个属性组合定位self.drive.find_element(By.CSS_SELECTOR, '[class="form-control"][name="account"]')
  • 层级查询
图三
    def log_on(self):'''代码执行'''# 通过get()方法打开网页self.drive.get('http://192.168.100.210/zentao/')# 1.查询元素时,我们也可以先查询父级,然后再查询子级,父级和子级用空格隔开,如上图所示(div - table - input)self.drive.find_element(By.CSS_SELECTOR, '.col-8 [class="table table-form"] #account')

  • 相同元素定位
图四
    def log_on(self):'''代码执行'''# 通过get()方法打开网页self.drive.get('http://192.168.100.210/zentao/')# 定位第一个元素self.drive.find_element(By.CSS_SELECTOR, '[class="form-control"]')# 定位第二个元素,find_elements后面加了sself.drive.find_elements(By.CSS_SELECTOR, '[class="form-control"]')[1]

  • 我们在进行元素定位时,获取到的元素一定是唯一的或第一个。查看是否唯一我们可以按CTRL+F搜索,如下:

2、输入、清空、点击操作

    def log_on(self):'''代码执行'''# 通过get()方法打开网页self.drive.get('http://192.168.100.210/zentao/')# 输入:send_keys()self.drive.find_element(By.CSS_SELECTOR, '#account').send_keys("admin")# 清空: clear()self.drive.find_element(By.CSS_SELECTOR, '#account').clear()# 单机操作(相当于鼠标点击):click()self.drive.find_element(By.CSS_SELECTOR, '.form-actions #submit').click()

3、回车键操作

# 点击登录按钮,一般情况下,使用click()进行点击
# 有些时候也可以使用submit()代替click(),相当于敲回车def log_on(self):'''代码执行'''# 通过get()方法打开网页self.drive.get('https://www.baidu.com/')# 输入内容,点击百度一下self.drive.find_element(By.CSS_SELECTOR, '[class="s_ipt"]').send_keys("软件测试")# 回车操作(相当于按回车键):submit()self.drive.find_element(By.CSS_SELECTOR, '[id="su"]').submit()

4、获取元素内容

-Text获取元素内容

# text 获取元素内容
text = self.drive.find_element(By.CSS_SELECTOR, '.form-actions a').text
print(text)# 结果:忘记密码
  • 如果使用Text获取元素内容时,返回的是空值,但未报错,这个时候我们需要使用get_attribute(‘innerText’)获取元素的内容
# 获取元素内容
get = self.drive.find_element(By.CSS_SELECTOR, '#loginPanel h2').get_attribute('innerText')
print(get)# 结果:易软天创项目管理系统

5、获取元素属性的值

  • 禅道登陆演示

# 获取属性的值
get = self.drive.find_element(By.CSS_SELECTOR, '[id="keepLoginon"]').get_attribute('title')
print(get)# 结果:保持登录

6、元素判断

  • 没有演示环境,就自己写一个html页面

在页面中显示元素:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>演示数据</title>
</head>
<body><form><input type="text" value="用户名" id="account"><br><input type="password" value="密码" id="password"><br></form>
</body>
</html>

在页面中不显示元素:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>演示数据</title>
</head>
<body><form><input style="visibility: hidden;" type="text" value="用户名" id="account"><br><input type="password" value="密码" id="password"><br></form>
</body>
</html>

禁用输入框:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>演示数据</title>
</head>
<body><form><input disabled="disabled" type="text" value="用户名" id="account"><br><input type="password" value="密码" id="password"><br></form>
</body>
</html>

1、is_displayed()

1、is_displayed():判断元素是否存在,结果是真或假
1-1显示元素,在HTML里,在页面也显示,返回True1-2隐藏元素,在HTML里,不在页面显示,返回Flase
1-3不在HTML里,不存在这个元素,会报错# 判断输入框是否在页面中显示
drive = self.drive.find_element(By.CSS_SELECTOR, '#account').is_displayed()
print(f"元素是否显示:{drive}")

2、is_enabled()

is_enabled():判断是否可用
# 判断输入框是否可以输入
drive = self.drive.find_element(By.CSS_SELECTOR, '#account').is_enabled()
print(f"输入框是否可以输入:{drive}")

3、is_selected()

  • 禅道登陆页面演示
is_selected():判断是否选中,一般用于复选框或单选框的选中判断
# 勾选保持登陆操作
# self.drive.find_element(By.CSS_SELECTOR, '[name="keepLogin[]"]').click()
drive = self.drive.find_element(By.CSS_SELECTOR, '[name="keepLogin[]"]').is_selected()
if drive:print(f"已勾选:{drive}")
else:print(f"未勾选:{drive}")

7、iframe&frame切换

说明:在html语法中,frame 元素或者iframe元素的内部会包含一个被嵌入的另一份html文档,这个时候如果我们需要操作iframe内的文档,就需要先切换到被嵌入的文档中,才可以进行操作。

  • 禅道登陆后演示


    1.先定位到需要切换的文档 — iframe&frame
    2.切换文档(切到frame中):switch_to.frame()
    3.从子frame切回到父frame:switch_to.parent_frame()
    4.切换到最外层文档(从frame中切回主文档):switch_to.default_content()
    def log_on(self):'''代码执行'''# 通过get()方法打开网页self.drive.get('http://192.168.100.210/zentao/')# 登陆禅道self.drive.find_element(By.CSS_SELECTOR, '[id="account"]').send_keys("admin")time.sleep(1)self.drive.find_element(By.CSS_SELECTOR, '[name="password"').send_keys("123456")time.sleep(1)self.drive.find_element(By.CSS_SELECTOR, '[id="submit"]').click()time.sleep(1)# 切换方法如下:# 方法一# iframe = self.drive.find_elements_by_tag_name("iframe")[0]# self.drive.switch_to.frame(iframe)# 方法二# self.drive.switch_to.frame(0)# 方法三iframe = self.drive.find_element(By.CSS_SELECTOR, '#appIframe-my')self.drive.switch_to.frame(iframe)time.sleep(1)# 点击联系人self.drive.find_element(By.XPATH, '//*[@id="navbar"]/ul/li[5]/a').click()# 切换到最外层表单self.drive.switch_to.default_content()time.sleep(1)# 点击项目self.drive.find_element(By.CSS_SELECTOR, '#menu [data-app="project"]').click()

8、鼠标悬停

  • 禅道登陆界面,选择语言
  • 鼠标悬停需要导入:from selenium.webdriver import ActionChains
    def log_on(self):'''代码执行'''# 通过get()方法打开网页self.drive.get('http://192.168.100.210/zentao/')# 需要悬停的元素,悬停到语言选择框上hover = self.drive.find_element(By.CSS_SELECTOR, '[class="btn"]')# 鼠标悬停 ActionChains(浏览器).move_to_element(悬停的元素).perform() 执行操作ActionChains(self.drive).move_to_element(hover).perform()time.sleep(1)# 选择需要的语言self.drive.find_element(By.CSS_SELECTOR, '[data-value="zh-tw"]').click()

iframe切换/鼠标悬停为提高成功率,最好是在操作后sleep(1)秒

9、警告框处理

  • 禅道登陆演示

    警告框处理:switch_to.alert
    def log_on(self):'''代码执行'''# 通过get()方法打开网页self.drive.get('http://192.168.100.210/zentao/')# 点击登陆self.drive.find_element(By.CSS_SELECTOR, '[id="submit"]').click()time.sleep(1)# 获取警告框的文本信息alert_msg = self.drive.switch_to.alert.textprint(alert_msg)# 接受警告框 accept()self.drive.switch_to.alert.accept()# 取消警告框 dismiss()# self.drive.switch_to.alert.dismiss()

10、窗口切换

  • 切换窗口:switch_to.window(需要切换到的窗口)
    def log_on(self):'''代码执行'''# 打开百度self.drive.get('https://www.baidu.com/')# 搜索框输入:CSDNself.drive.find_element(By.CSS_SELECTOR, '[name="wd"]').send_keys("csdn")time.sleep(0.5)# 点击百度一下self.drive.find_element(By.CSS_SELECTOR, '[id="su"]').click()time.sleep(0.5)# 点击CSDN官网,开启新窗口,进入CSDN官网self.drive.find_element(By.LINK_TEXT, 'CSDN技术社区').click()time.sleep(3)# 获取当前窗口(当前句柄名称-handle)windows = self.drive.current_window_handleprint(f"当前handle:{windows}")# 获取所有窗口(所有句柄名称-handle),以列表的形式返回过来all_windows = self.drive.window_handlesprint(f"所有handle:{all_windows}")# 切换窗口,根据所有窗口的下标来切换,窗口顺序从0开始。(此时有两个窗口,第一个百度,第二个csdn)self.drive.switch_to.window(all_windows[0])time.sleep(3)# 切换到最新窗口的句柄(csdn)self.drive.switch_to.window(all_windows[-1])

11、select标签的下拉框选择

  • 没有演示环境,就自己写一个html页面:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>演示数据</title>
</head>
<body><select id="nr" name="wan"><option value="10">每页显示10条</option><option value="20">每页显示20条</option><option value="50">每页显示50条</option><option value="100">每页显示100条</option></select>
</body>
</html>
  • 首先需要先导入一个包(注意Select的S需要大写)
  • from selenium.webdriver.support.ui import Select
    def log_on(self):'''代码执行'''# 打开本地hthl页面self.drive.get('file:///C:/Users/Admin/Desktop/hthl.html')# 需要先定位到下拉框elements = self.drive.find_element(By.CSS_SELECTOR, '#nr')# Select(需要操作下拉框).根据什么操作time.sleep(2)Select(elements).select_by_index(1)  # 根据index,下标定位,从0开始time.sleep(2)Select(elements).select_by_value('100')  # 根据value定位time.sleep(2)Select(elements).select_by_visible_text('每页显示50条')  # 根据文本定位

Python+Selenium自动化测试详细教程相关推荐

  1. Python+selenium自动化测试环境搭建(详细)

    Python+selenium自动化测试环境搭建 环境版本: Python3.7+Selenium3.141+谷歌浏览器76.0/火狐浏览器 一.安装五大组件 1.安装python并配置环境变量   ...

  2. Jenkins持续集成项目搭建与实践——基于Python Selenium自动化测试(自由风格)

    Jenkins简介 Jenkins是Java编写的非常流行的持续集成(CI)服务,起源于Hudson项目.所以Jenkins和Hudson功能相似. Jenkins支持各种版本的控制工具,如CVS.S ...

  3. python+selenium自动化测试-Windows环境搭建

    来自python+selenium自动化测试初学者的笔记,写的不对的地方大家多多指教哦 一.安装selenium 安装selenium需要先安装python环境,python环境在之前的python+ ...

  4. Python+Selenium自动化测试——126邮箱自动登录脚本(登录首页是二维码,切入账号密码输入框)

    Python+Selenium自动化测试--126邮箱自动登录脚本 版权声明:本文为博主原创文章,未经允许不得转载.https://blog.csdn.net/qiao_wan/article/det ...

  5. Python+Selenium自动化测试脚本(入门)

    前言 最近在学习Python+selenium自动化测试,计划把公司已有一套自动化测试框架(UIAutomation+C#)用Python+Selenium框架实现一遍.先拿了一个csdn的登录页面练 ...

  6. Linux下利用python实现语音识别详细教程

    Linux下python实现语音识别详细教程 语音识别工作原理简介 选择合适的python语音识别包 安装SpeechRecognition 识别器类 音频文件的使用 英文的语音识别 噪音对语音识别的 ...

  7. Python + Selenium 自动化测试《人生重开模拟器》

    原文 Python + Selenium 自动化测试<人生重开模拟器> 背景 最近有一款小游戏特别火,叫<人生重开模拟器>,这款游戏用黑色幽默的调侃形式,随机生成你的人生大事件 ...

  8. Python 自动发送邮件详细教程

    自动发送邮件能应用于许多场景中,比如我想要知道股票策略中的股票池是否有实时的更新,这时候如果再拉一遍数据,跑一遍脚本,实在是太浪费时间了.为什么不把这一套流程放到服务器上,然后到点自动运行并发送邮件呢 ...

  9. python写界面输入测试脚本,python+Selenium自动化测试——输入,点击操作

    这是我的第一个真正意思上的自动化脚本. 1.练习的测试用例为: 打开百度首页,搜索"胡歌",然后检索列表,有无"胡歌的新浪微博"这个链接 2.在写脚本之前,需要 ...

最新文章

  1. 如何设计一个牛逼的本地缓存!
  2. 用border-width,border-color画三角形
  3. harbor的镜像复制功能使用教程
  4. java之七 高级类设计
  5. Modis数据处理工具:MRT百度网盘下载和手把手图文安装教程
  6. log nginx 客户端请求大小_nginx log记录请求响应时间
  7. MFC中 windows object 和 C++ object
  8. linux时间戳_10款优秀的 Linux 网络工具
  9. 关于PLSQL Developer报动态执行表不可访问,本会话的自动统计被禁止错的解决方法 .
  10. SQLite快速入门
  11. 【加法笔记系列】逻辑门、半加器、全加器、波纹进位加法器
  12. 【数据结构】顺序线性表的几种常用方法
  13. 明尼苏达计算机科学与工程,明尼苏达大学计算机科学专业排名第29(2020年USNEWS美国排名)...
  14. 6.26 mongoDB是无法find未初始的值的,mongoose的Schema需具象化及个人商品Schema设计,租赁网登录态初次尝试,vue对对象未赋初值的监听,forEach等api深拷贝问题
  15. Linux误删文件或程序如何恢复
  16. 天河CAD2012打开服务器文件,AutoCAD无法启动,或启动中途闪退
  17. 按光在光纤中的传输模式可将光纤分为单模光纤和多模光纤两种
  18. Linux ss命令使用
  19. 2019四川大学计算机系,2019四川大学专业排名
  20. 服务器的防御是什么意思?

热门文章

  1. 同位素标记脱氢丙氨酸(Dha)
  2. 在线求救代码以及解题思路
  3. Android 自定义日历
  4. 网络通信Socket(Linux)
  5. keepalived启动后无法ping通VIP,提示ping: sendmsg: Operation not permitted
  6. C# managed DirectX HexEngine - Part I
  7. 养老院管理系统(Java毕业设计)
  8. 从行为心理角度论证罗马数字是抄袭中国汉字、算筹的可能性
  9. Ubuntu 中安装最新版的 Node.js 和 npm
  10. 在inkcanvas 中画几何图形