python做ui自动化_python+selenium做ui自动化测试用法必会

一、前言

大家都知道,基于Web端的测试的基础框架是需要Selenium做主要支撑的,这里边给大家介绍下Web测试核心之基于 Python 的 Selenium

Selenium 是用于测试 Web 应用程序用户界面 (UI) 的常用框架。它是一款用于运行端到端功能测试的超强工具。您可以使用多个编程语言编写测试,并且 Selenium 能够在一个或多个浏览器中执行这些测试。

二、环境安装

安装 python,这个。。。忽略,建议 python3.7。

安装基于 python 的 selenium 依赖包,命令:pip install selenium

安装浏览器驱动包,推荐使用 chrome 浏览器的 chromedriver.exe,对应 chrome 版本一定要对哦,不然运行不起来的,安装在哪?想放哪放哪,不过一般是放在 python 的根目录下。下载地址:chromedriver.storage.googleapis.com/index.html

安装 PyCharm ,这个无脑安装~然后可自定义界面 UI 及编码风格,这个。。。忽略

三、牛刀小试

1. 控制浏览器

#coding=utf-8

from selenium importwebdriver

driver=webdriver.Chrome()

driver.get("http://www.baidu.com")

driver.maximize_window()#将浏览器最大化显示

driver.set_window_size(480, 800) #设置浏览器宽480、高800显示"

driver.back() #后退

driver.forward() #前进

driver.close() #关闭chrome

driver.quit() #退出chrome

如果你对软件测试、接口测试、自动化测试、面试经验交流感兴趣欢迎加入:软件测试技术群:603401995,群里的免费资料都是笔者十多年测试生涯的精华。还有同行大神一起交流技术哦。

2. 对象的定位

通过 id 定位:find_element_by_id()

通过 name 定位:find_element_by_name()

通过 class 定位:find_element_by_class_name()

通过 tag 定位:find_element_by_tag_name()

通过 link 定位:find_element_by_link_text()

通过 partial_link 定位:find_element_by_partial_link_text()

通过 xpath 定位:find_element_by_xpath()

通过 css 定位:find_element_by_css_selector()

以上几种定位是常规操作,应该就基本够用了,但是有的时候就是会出现一些诡异的定位失效或者定位到了点击失效的问题,这个时候如果用js进行直接执行该事件,接下来介绍下非常规操作:

id 定位:document.getElementById()

name 定位:document.getElementsByName()

tag 定位:document.getElementsByTagName()

class 定位:document.getElementsByClassName()

css 定位:document.querySelectorAll()

search_js = "document.getElementsByName('wd')[0].value='selenium';"#通过name定位,然后赋值“selenium”

search_js2 = "document.querySelectorAll('.s_ipt')[0].value='selenium';"#通过css定位,然后赋值“selenium”

button_js = "document.getElementById('su').click();"#通过id定位,然后执行单击操作

button_js2 = "document.getElementsByClassName('s_btn')[0].click()"#通过className定位,然后执行单击操作 driver.execute_script(search_js2)#执行,execute_script(script, *args)

以上几种定位是可以再度升级,可以利用 jQuery 定位一波

3. 操作测试对象

#coding=utf-8

from selenium importwebdriver

driver=webdriver.Chrome()

driver.get("http://passport.kuaibo.com/login/")

driver.find_element_by_id("user_name").clear() #清除输入框的默认内容

driver.find_element_by_id("user_name").send_keys("username")

driver.find_element_by_id("user_pwd").clear()

driver.find_element_by_id("user_pwd").send_keys("password") #输入输入框的内容为“password”

driver.find_element_by_id("dl_an_submit").click() #通过 submit() 来提交操作

driver.find_element_by_id("dl_an_submit").submit()

size=driver.find_element_by_id("kw").size #返回百度输入框的宽高 text=driver.find_element_by_id("cp").text #返回百度页面底部备案信息#返回元素的属性值,可以是 id、name、type 或元素拥有的其它任意属性

attribute=driver.find_element_by_id("kw").get_attribute('type') #返回元素的结果是否可见,返回结果为 True 或 False

result=driver.find_element_by_id("kw").is_displayed()

driver.quit()#退出

复制代码

4. 鼠标键盘事件

from selenium import webdriver #引入 Keys 类包

from selenium.webdriver.common.keys import Keys #引入 ActionChains 类

from selenium.webdriver.common.action_chains importActionChains

...#鼠标事件 #定位到要操作的元素

right =driver.find_element_by_xpath("xx") #对定位到的元素执行鼠标右键操作

ActionChains(driver).context_click(right).perform() #对定位到的元素执行鼠标双击操作

ActionChains(driver).double_click(right).perform() #对定位到的元素执行鼠标移动到上面的操作

ActionChains(driver).move_to_element(right).perform() #对定位到的元素执行鼠标左键按下的操作

ActionChains(driver).click_and_hold(right).perform() #定位元素的原位置

element = driver.find_element_by_name("xxx") #定位元素要移动到的目标位置

target = driver.find_element_by_name("xxx") #执行元素的移动操作

ActionChains(driver).drag_and_drop(element, target).perform() #键盘事件 #删除多输入的一个 值

driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE) #输入空格键+“教程”

driver.find_element_by_id("kw").send_keys(Keys.SPACE)

driver.find_element_by_id("kw").send_keys(u"教程") #ctrl+x 剪切输入框内容

driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x') #其余的键盘操作类似

复制代码

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

5. 等待时间

#coding=utf-8

from selenium import webdriver #导入 WebDriverWait 包

from selenium.webdriver.support.ui importWebDriverWaitfrom selenium.webdriver.support import expected_conditions as EC #导入 time 包

importtime

driver=webdriver.Chrome()

driver.get("http://www.baidu.com") #WebDriverWait()方法使用,显示等待,WebDriverWait(driver,超时时长,调用频率,忽略异常).until(可执行方法,超时返回的信息),这里可以调用EC来实现可执行方法

is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)).until_not(lambda x: x.find_element_by_id(“kw”).is_displayed()) #until(method, message=’ ’),调用该方法提供的驱动程序作为一个参数,直到返回值不为 False

element.send_keys("selenium") #添加智能等待,隐时等待

driver.implicitly_wait(30)

driver.find_element_by_id("su").click() #添加固定休眠时间,强制等待

time.sleep(5)

driver.quit()

复制代码

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

6. 组对象定位及层级定位,呃,忽略

7. 多窗口处理

#coding=utf-8

from selenium import webdriver importtime

driver=webdriver.Chrome()

driver.get("http://www.baidu.com/") #获得当前窗口

nowhandle=driver.current_window_handle #打开注册新窗口

driver.find_element_by_name("tj_reg").click()

allhandles=driver.window_handles #循环判断窗口是否为当前窗口

for handle in allhandles: if handle !=nowhandle:

driver.switch_to_window(handle)print 'now register window!'

#切换到邮箱注册标签

driver.find_element_by_id("mailRegTab").click()

time.sleep(5)

driver.close()#回到原先的窗口

driver.switch_to_window(nowhandle)

driver.find_element_by_id("kw").send_keys(u"注册成功!")

time.sleep(3) #ifrome处理 #这里会自动识别id,name,如果没有则可以将元素通过选择器找到,然后输入该元素即可

driver.switch_to_frame("f1")

element= driver.find_element_by_id("kw")

driver.switch_to_frame(element)

driver.quit() 

复制代码

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

8. 提示窗口处理

#coding=utf-8

from selenium import webdriver importtime

driver=webdriver.Chrome()

driver.get("http://www.baidu.com/") #点击打开搜索设置

driver.find_element_by_name("tj_setting").click()

driver.find_element_by_id("SL_1").click() #点击保存设置

driver.find_element_by_xpath("//div[@id='gxszButton']/input").click() #获取网页上的警告信息

alert=driver.switch_to_alert() #接收警告信息

alert.accept() #取消对话框(如果有的话)

alert.dismiss() #输入值(如果有的话)

alert.send_keys(“xxx”)

复制代码

9. 控制浏览器滚动条,这个运用之前提示的jq语句即可实现

10. cookie处理,主要用途在于处理验证码问题

#coding=utf-8

from selenium import webdriver importtime

driver=webdriver.Chrome()

driver.get("http://www.youdao.com") #向 cookie 的 name 和 value 添加会话信息。

driver.add_cookie({'name':'key-aaaaaaa', 'value':'value-bbbb'}) #遍历 cookies 中的 name 和 value 信息打印,当然还有上面添加的信息

for cookie in driver.get_cookies(): print "%s -> %s" % (cookie['name'], cookie['value']) ##### 下面可以通过两种方式删除 cookie ##### # 删除一个特定的 cookie

driver.delete_cookie("CookieName") #删除所有 cookie

driver.delete_all_cookies()

time.sleep(2)

driver.close()

复制代码

四、小结

如果你对软件测试、接口测试、自动化测试、面试经验交流感兴趣欢迎加入:软件测试技术群:603401995,群里的免费资料都是笔者十多年测试生涯的精华。还有同行大神一起交流技术哦。

在熟悉了selenium常见的API基本操作后,这里便可以开展实际测试用例的设计了,一个良好的自动化测试用例起码符合一下五个条件:

1、一个脚本是一个完整的场景,从用户登陆操作到用户退出系统关闭浏览器。

2、一个脚本脚本只验证一个功能点,不要试图用户登陆系统后把所有的功能都进行验证再退出系统

3、尽量只做功能中正向逻辑的验证,不要考虑太多逆向逻辑的验证,逆向逻辑的情况很多(例如手 号输错有很多种情况),验证一方面比较复杂,需要编写大量的脚本,另一方面自动化脚本本身比较脆弱, 很多非正常的逻辑的验证能力不强。(我们尽量遵循用户正常使用原则编写脚本即可)

4、脚本之间不要产生关联性,也就是说编写的每一个脚本都是独立的,不能依赖或影响其他脚本。

5、如果对数据进行了修改,需要对数据进行还原。 6、在整个脚本中只对验证点进行验证,不要对整个脚本每一步都做验证。

最后配合unittest或者testNG单元测试框架,实现分层、数据驱动、断言、截图、日志等全方位功能,得心应手的开展自动化测试工作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/547827.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c# 操作IIS应用程序池

直接代码: 代码 usingSystem.DirectoryServices; //添加引用 System.DirectoryServicestry{ DirectoryEntry appPool newDirectoryEntry("IIS://localhost/W3SVC/AppPools"); DirectoryEntry findPool appPool.Children.Find("DefaultAppPool&…

Android获取手机和系统版本等信息的代码

2019独角兽企业重金招聘Python工程师标准>>> String phoneInfo "Product: " android.os.Build.PRODUCT; phoneInfo ", CPU_ABI: " android.os.Build.CPU_ABI; phoneInfo ", TAGS: " android.os.Build.TAGS; phoneInfo &…

用hyperledger cello H3C分支创建单机模式区块链系统

本文介绍用hyperledger cello的0.9.0-h3c分支创建一套区块链系统的完整流程,希望对读者有所帮助。 环境准备工作:需要准备一台装有ubuntu 16.04的主机,内存需要大一些,建议8G以上。安装docker-ce和docker-compose。 接下来&…

Visual Studio 2010快捷键大全

为什么80%的码农都做不了架构师?>>> 【窗口快捷键】 CtrlW,W: 浏览器窗口 CtrlW,S: 解决方案管理器 CtrlW,C: 类视图 CtrlW,E: 错误列表 CtrlW,O: 输出视图 trlW,P: 属性窗口 CtrlW,T: 任务列表 CtrlW,X: 工具箱 CtrlW,B: 书签窗口 CtrlW,U: 文档大纲 C…

c# 查询本机日志

代码 StringBuilder sb newStringBuilder();EventLog mylog newEventLog();mylog.Log "Application"; //System[系统日志] | Application[应用日志] | Security[安全日志]EventLogEntryCollection myCollection mylog.Entries;for(inti 0; i <myCollection.Count…

Python安装FrankMocap实现3D人体姿态估计

FrankMocap 是港中文联合 Facebook AI 研究院提出的3D 人体姿态和形状估计算法。 不仅仅是估计人体的运动姿态&#xff0c;甚至连身体的形状&#xff0c;手部的动作都可以一起计算出来。 算法很强大&#xff0c;能够从单目视频同时估计出 3D 人体和手部运动&#xff0c;在一块 …

Windows任务管理 连接用户登录信息 通用类[C#版]

通用类名[ComputerLoginUserInfo.cs] 代码如下&#xff1a; 代码 usingSystem;//---引用usingSystem.Runtime.InteropServices;usingSystem.Text;///<summary>///Windows 任务管理器登录用户信息///author:Stone_W///date:2011.1.14///</summary>publicclassComput…

Hanoi(汉诺)塔问题

问题描述&#xff1a; Hanoi(汉诺)塔问题。古代有一个梵塔&#xff0c;塔内有3个座A,B,C&#xff0c;开始时A座有n个盘子&#xff0c;盘子大小不等&#xff0c;大的在下&#xff0c;小的在上。有一个老和尚想把这n个盘子&#xff0c;从A座移动到C座&#xff0c;但是每次只允许移…

实现Windows直接远程访问Ubuntu桌面和解决VNC连接Ubuntu桌面灰色的问题解决

Accept clipboard from viewersSend clipboard to viewersSend primary selection to viewers 本文主要是讲解如果理由VNC实现Windows远程访问Ubuntu 16.04(因为本文已经有点年头了&#xff0c;之前以16.04版本为例讲解&#xff0c;最新版18.04笔主也测试过是没有问题的)&#…

python自己做个定时器_python 创建一个自己的类计时器

前言&#xff1a;学习了python的类之后收获颇多&#xff0c;于是想利用类创建一个简单的计时器第一代版本首先要明确自己的timer想要实现的功能…先列一些简单的吧比如&#xff1a;开始计时的功能&#xff0c;停止计时的功能&#xff0c;有一些简单的提示语…还有一个问题&…

HttpWebRequest模拟POST提交防止中文乱码

测试通过&#xff0c;请求的为自己写的一般处理程序&#xff0c;代码如下&#xff1a; 代码 Encoding myEncoding Encoding.GetEncoding("gb2312");stringparam HttpUtility.UrlEncode("aa", myEncoding) ""HttpUtility.UrlEncode("值A&quo…

手把手带你玩转Tensorflow 物体检测 API (1)——运行实例

本文在学习《Tensorflow object detection API 搭建属于自己的物体识别模型&#xff08;1&#xff09;——环境搭建与测试》的基础上优化并总结&#xff0c;此博客链接&#xff1a;https://blog.csdn.net/dy_guox/article/details/79081499&#xff0c;感谢此博客作者。 0.前言…

html5 java 图片上传_java实现图片上传至服务器并显示,如何做?希望要具体的代码实现...

展开全部有两种方法一是用上传的组建jspSmartUpload的Request&#xff0c;还有一种不用组建&#xff0c;但在e69da5e6ba9062616964757a686964616f31333238653233form表单中不能加入ENCTYPE "multipart/form-data "我给你的案例吧建立后台数据库if exists (select * f…

CISCO的GLBP(网关负载均衡协议)

名词定义&#xff1a;活动虚拟网关AVG: 它的优先级最高&#xff0c;应答所有ARP请求&#xff0c;反回哪个MAC地址&#xff0c;取决于采用的负载均衡方式AVG还给GLBP组中的每台路由器分配虚拟MAC地址&#xff0c;最多每个组可以分到4个&#xff0c;组里的每台路由器都被称为活动…

net发布的dll方法和类显示注释信息(字段说明信息)[图解]

自己发布的dll添加的另一个项目中突然没有字段说明信息了&#xff0c;给使用带来了很多的不便&#xff0c;原因是为了跨项目引用&#xff0c;所以导致不显示注释信息的&#xff0c;一下是解决这个问题的方法。 在要发布&#xff08;被引用&#xff09;的项目上右键 > 属性 &…

手把手带你玩转Tensorflow 物体检测 API (2)——数据准备

致谢声明 本文在学习《Tensorflow object detection API 搭建属于自己的物体识别模型&#xff08;2&#xff09;——训练并使用自己的模型》的基础上优化并总结&#xff0c;此博客链接&#xff1a;https://blog.csdn.net/dy_guox/article/details/79111949&#xff0c;感谢此博…

手把手带你玩转Tensorflow 物体检测 API (3)——训练模型

致谢声明 本文在学习《Tensorflow object detection API 搭建属于自己的物体识别模型&#xff08;2&#xff09;——训练并使用自己的模型》的基础上优化并总结&#xff0c;此博客链接&#xff1a;https://blog.csdn.net/dy_guox/article/details/79111949&#xff0c;感谢此博…

动态类型var和dynamic和传统确定类型区别和效率

伴随着vs2010的出现&#xff0c;c#4.0的诞生&#xff0c;与之而来的动态类型dynamic更是给net程序员们锦上添花&#xff0c;为自己的程序书写上带来了给大的便利。可到底怎么用&#xff0c;好不好用&#xff0c;效率这么样&#xff0c;也许是大家最迫切关注的&#xff0c;msdn虽…

手把手带你玩转Tensorflow 物体检测 API (4)—— 模型验证

致谢声明 本文在学习《Tensorflow object detection API 搭建属于自己的物体识别模型&#xff08;2&#xff09;——训练并使用自己的模型》的基础上优化并总结&#xff0c;此博客链接&#xff1a;https://blog.csdn.net/dy_guox/article/details/79111949&#xff0c;感谢此博…

mysql tomcat列表增删改查_Tomcat-Database

Tomcat-Database介绍根据Tomcat9源码二次开发&#xff0c;增加数据库功能&#xff0c;可一行代码实现CURD安装教程需要先配置Ant&#xff0c;然后在根目录下执行ant命令&#xff0c;即可编译&#xff0c;编译后的目录在Tomcat-Database/output/build下&#xff0c;其中在bin下可…