ui自动化---WebDriverApi接口
一、webdriver client原理
当测试脚本启动Chrome的时候,selenium-webdriver 会首先在新线程中启动Chrome浏览器。启动后selenium-webdriver会将Chrome绑定到特定的端口,绑定完成后该chrome实例便作为webdriver的remote server存在;客户端(也就是测试脚本)创建1个会话,在该session中通过http请求向remote server发送请求,remote server解析请求,完成相应操作并返回response;客户端接受response,并分析其返回值以决定是转到第3步还是结束脚本;
webdriver是按照server – client的经典设计模式设计的。
server端就是remote server,可以是任意的浏览器。当我们的脚本启动浏览器后,该浏览器就是remote server,它的职责就是等待client(脚本)发送请求并做出相应;
client端简单说来就是我们的测试代码,我们测试代码中的一些行为,比如打开浏览器,转跳到特定的url等操作是以http请求的方式发送给被测试浏览器,也就是remote server;remote server接受请求,并执行相应操作,并在response中返回执行状态、返回值等信息;
二、启动浏览器
首次按参照以前的博客,将浏览器下载对应的驱动,并将驱动添加到系统环境变量后。再pycharm种输入以下代码即可启动浏览器
from selenium import webdriver
#实例化浏览器,启动浏览器
driver=webdriver.Chrome()
# driver=webdriver.Firefox()
# drier=webdriver.Ie()
#以http协议发送请求 driver.get('http://www.baidu.com/')
三、元素定位
获取标签元素定位方式共18种
from selenium import webdriver
driver=webdriver.Chrome()
driver.get('http://ui.imdsx.cn/uitester/')
# 1、通过ID定位目标元素
d=driver.find_element_by_id('i1')
# d.send_keys('id定位到元素') # 2、通过className定位目标元素
d1=driver.find_element_by_class_name('classname')
d1.send_keys('classname定位到元素')
#
# 3、 通过name属性定位目标元素
driver.find_element_by_name('name')
#
# 4、通过Xpath定位目标元素
driver.find_element_by_xpath('//*[@id="i1"]')
#
#5、通过css Selector定位目标元素
driver.find_element_by_css_selector('#i1')
#
# 6、 通过标签名称定位(注:在一个页面中,标签一定会重复,所以不用这个来进行定位)
driver.find_element_by_tag_name('input')
#
# 7、 通过标签中的文本查找元素
driver.find_element_by_link_text('登录')
#
# 8、 通过标签中文本的模糊匹配查找
driver.find_elements_by_partial_link_text('录')
还有8种是上面的复数形式,返回的是个list,比如:

这样的情况,可以通过下标来获取到返回的list种某一个元素,再进行操作
d[0].sendkeys('通过复数形式返回一个list')
还有2种是前面16种的底层封装,可通过查看底层源码找到。如下:

三、执行脚本
元素定位i的时候,有时候不能直接定位,需要借助js脚本。比如再打开网页后,由于网页很长,加入了滚动条。有些内容不能直观地显示在页面上,需要拖拽滚动条才可看到。这时候就可以加入操作滚动条的脚本,先让页面滚动到元素能够显示的位置,再进行定位
执行脚本用函数execute_script()
import time
time.sleep(1)
driver.execute_script('window.scrollTo(0,0);')#让浏览器滚动条转跳转最上面
time.sleep(1)#浏览器滚动到最上面后等1s
e=driver.find_element_by_partial_link_text('跳转')
e.click()
四、浏览器操作
driver.maximize_window()#最大化浏览器
driver.back()#浏览器后退键
driver.forward()#前进
driver.refresh()#刷新
# 获取当前浏览器的大小
driver.get_window_size() # 通过像素设置浏览器的大小
driver.set_window_size('width','height') # 获取当前窗口针对于Windows的位置的坐标x,y
driver.get_window_position() # 设置当前窗口针对Windows的位置,x,y
driver.set_window_position(20,20) # 最大化当前窗口,不需要传参
driver.maximize_window() # 返回当前操作的浏览器句柄
driver.current_window_handle # 返回所有打开server的浏览器句柄
driver.window_handles
#截图
driver.get_screenshot_as_file('pngdemo.png') #退出驱动,关闭所有页面
driver.quit()
#关闭当前页面.指针不会自动切回到上一个页面。必须手动切回来
driver.close()
五、切换窗口
当点击页面上一个链接后,跳转到一个新的页面。此时如果想要操作新页面的元素,则需要将指针指向新页面
from selenium import webdriver
driver=webdriver.Chrome()
driver.get('http://ui.imdsx.cn/uitester/')
#先将滚动条滑至最顶端,让元素能够直接看到
driver.execute_script('window.scrollTo(0,0);')
import time
time.sleep(2)#停留2s
el=driver.find_element_by_css_selector('[href="/new-index/"]')#定位到元素后并点击跳转到新的页面
time.sleep(1)
el.click()
handles=driver.window_handles
print(handles)#打印出当前所有窗口句柄,默认指针在首次打开的第一个页面
# 窗口句柄打印结果:['CDwindow-AD4AD4A2DBED39512B11E0F393261452', 'CDwindow-BB87742C82C3DDD61F153B89A568E45E'] #要想操作新窗口的元素,就要先将指针切换到第二个窗口
driver.switch_to.window(handles[1])#切换指针到新窗口
driver.find_element_by_css_selector('#newtag').send_keys('切换窗口后写入')#定位新窗口的标签,并操作
time.sleep(2)
driver.close()#关闭当前页面,也就是第二个页面。但是指针仍旧停留在第二个页面,不会自动回到第一个页。需要手动切回
driver.switch_to.window(handles[0])
driver.find_element_by_css_selector('#i1').send_keys('又切回来了')
# driver.quit()#关闭驱动,关闭浏览器
六、iframe
同一个网页种,如果有多个iframe的时候,如果想要定位到iframe中的元素,也是不能直接定位的,需要在不同的iframe之间切换
#iframe
#可以先通过定位找到iframe元素,然后再切换该元素对象
eleobj=driver.find_element_by_css_selector('[src="/new-index/"]')#先定位到这个元素,然后下面直接用这个元素对象
driver.switch_to.frame(eleobj)#切换到top-frame #如果iframe有name属性或id属性,可以直接填写
# 第二种方式,直接用id或name
driver.switch_to.frame('top-frame')
注意的是,以上切换只能切换至下一级,如果想要跳出返回上一级frame,就要用driver.switch_to.parent_frame()
如果要返回最外层默认页面,则用driver.switch_to.default_content()
七、alert和confirm
alert、confirm同iframe类似,再操作的时候,都需要切换
driver.find_element_by_css_selector('#alert').click()
print(driver.switch_to.alert.text)#alert弹框的文本内容
driver.switch_to.alert.accept()#点击确认按钮
driver.switch_to.alert.dismiss()#取消
八、隐藏元素定位
对于有些元素,默认是隐藏不显示的,即display:none,这样的元素定位是无法定位到的。必须先让它显示,即将他的display属性做修改
driver.execute_script("document.getElementById('dis1').style.display='';")
然后就可以定位并操作le
ui自动化---WebDriverApi接口的更多相关文章
- 测试自动化:java+selenium3 UI自动化(1) - 环境搭建
1.前言 我大概是在2012年第一次正式接触到自动化测试,那个时候跟随我的团队一起,就当时项目的UI自动化尝试做出了探索. 在我离开那家公司的时候,我们的自动化测试体系仍然难言完美,但是也已经达到了非 ...
- 小心!做 UI 自动化一定要跨过这些坑
一 .引子 UI自动化,在移动互联网时代的今天,一直都是在各大测试社区最为火爆的一个TOPIC.甚至在测试同行面前一提起自动化,大家就会自然而然的问:“恩,你们是用的什么框架?appium?还是rob ...
- 接口自动化与UI自动化两者的可行性
1.首先接口测试是跳过前端界面对服务端的测试,UI测试是对前端界面的测试,从分层测试的角度考虑,两者不应该是可以互相取代的关系. 2.从公司开展自动化的的角度考虑,可以重点关注这个项目开展接口自动 ...
- UI自动化,你值得拥有
去年春节联欢晚会,为了那张“敬业福”,全家都卯足了劲儿“咻一咻”,连节目都顾不上看了.当时我就想,要是能自动化该多好,不停点击屏幕,屏幕不疼手还疼呢,何况还不好分心,生怕错过了“敬业福”.玩“咻一咻” ...
- 【Android测试】UI自动化代码优化之路(临时发布, 随时删除)
◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5993622.html 关于UI自动化的抱怨 听过不少人这样 ...
- Appium UI自动化的那些梗
@作者 彭海波 转载请注明出处 前言 由于需求的快速迭代和敏捷测试的要求,在测试过程中引入自动化成为必不可少的手段.作为一个互联网测试团队,我们自然也引入了自动化测试这个环节.在众多的测试框架中,我们 ...
- UI自动化测试之Jenkins配置
前一段时间帮助团队搭建了UI自动化环境,这里将Jenkins环境的一些配置分享给大家. 背景: 团队下半年的目标之一是实现自动化测试,这里要吐槽一下,之前开发的测试平台了,最初的目的是用来做接口自动化 ...
- UI自动化selenium
1.什么是UI自动化?模拟人用代码的方式去操作页面2.为什么要做UI自动化?后期迭代的时候,老功能比较多,人工维护成本较大,重复性工作较多,这个时候就考虑因为UI自动化3.什么时候做UI自动化?项目稳 ...
- 【Android测试】UI自动化代码优化之路
◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5993622.html 关于UI自动化的抱怨 听过不少人这样 ...
随机推荐
- C#LeetCode刷题之#67-二进制求和(Add Binary)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3929 访问. 给定两个二进制字符串,返回他们的和(用二进制表示) ...
- LeetCode 861翻转矩阵后得分详细解法
1. 题目内容 有一个二维矩阵 A 其中每个元素的值为 0 或 1 . 移动是指选择任一行或列,并转换该行或列中的每一个值:将所有 0 都更改为 1,将所有 1 都更改为 0. 在做出任意次数的移动后 ...
- Go热门开源项目大全
监控系统 项目 简介 Star数 grafana/grafana Grafana 是一个用于监控指标分析和图表展示的工具, 后端支持 Graphite, InfluxDB & Promethe ...
- 解析Class文件之创建InstanceKlass对象
ClassFileParser::parseClassFile()方法会将解析Class文件的大部分结果保存到instanceKlass对象中.创建instanceKlass对象的代码如下: int ...
- offset range 查询
offset range 查询 我们在实际使用过程中经常需要查询某个topic的某分区的offset的range 命令行: kafka-run-class.sh kafka.tools.GetOffs ...
- 计算机网络要点---TCP
计算机网络要点---TCP 浏览器在通过域名通过dns服务器找到你的服务器外网ip,将http请求发送到你的服务器,在tcp3次握手之后(http下面是tcp/ip),通过tcp协议开始传输数据,你的 ...
- CentOS ISO 下载地址
x86_64:https://wiki.centos.org/Download ARM:http://mirror.nsc.liu.se/centos-store/altarch/ http://dl ...
- 第三篇 Scrum冲刺博客
一.会议图片 二.项目进展 成员 完成情况 今日任务 冯荣新 商品列表,商品详情轮播图 商品底部工具栏,购物车列表 陈泽佳 历史足迹,静态页面 渲染搜索结果,防抖的实现 徐伟浩 未完成 商品信息录入 ...
- 区块链入门到实战(27)之以太坊(Ethereum) – 智能合约开发
智能合约的优点 与传统合同相比,智能合约有一些显著优点: 不需要中间人 费用低 代码就是规则 区块链网络中有多个备份,不用担心丢失 避免人工错误 无需信任,就可履行协议 匿名履行协议 以太坊(Ethe ...
- 【转】C# 利用反射根据类名创建类的实例对象
原文地址:https://www.cnblogs.com/feiyuhuo/p/5793606.html “反射”其实就是利用程序集的元数据信息. 反射可以有很多方法,编写程序时请先导入 System ...