百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

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

bigegpt 2024-08-23 11:36 2 浏览

 一、前言

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

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

  二、环境安装

  建议 python3.7。

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

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

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

  三、牛刀小试

  1.控制浏览器

#coding=utf-8

from selenium import webdriver

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

  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 import webdriver

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 import ActionChains

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

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') #其余的键盘操作类似

  5.等待时间

#coding=utf-8

from selenium import webdriver #导入 WebDriverWait 包

from selenium.webdriver.support.ui import WebDriverWait

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

import time

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()

  6.组对象定位及层级定位

  7.多窗口处理

#coding=utf-8

from selenium import webdriver import time

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() 

  8.提示窗口处理

#coding=utf-8

from selenium import webdriver import time

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 import time

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()

  四、小结

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

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

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

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

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

  5.如果对数据进行了修改,需要对数据进行还原。

  6.在整个脚本中只对验证点进行验证,不要对整个脚本每一步都做验证。

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

相关推荐

悠悠万事,吃饭为大(悠悠万事吃饭为大,什么意思)

新媒体编辑:杜岷赵蕾初审:程秀娟审核:汤小俊审签:周星...

高铁扒门事件升级版!婚宴上‘冲喜’老人团:我们抢的是社会资源

凌晨两点改方案时,突然收到婚庆团队发来的视频——胶东某酒店宴会厅,三个穿大红棉袄的中年妇女跟敢死队似的往前冲,眼瞅着就要扑到新娘的高额钻石项链上。要不是门口小伙及时阻拦,这婚礼造型团队熬了三个月的方案...

微服务架构实战:商家管理后台与sso设计,SSO客户端设计

SSO客户端设计下面通过模块merchant-security对SSO客户端安全认证部分的实现进行封装,以便各个接入SSO的客户端应用进行引用。安全认证的项目管理配置SSO客户端安全认证的项目管理使...

还在为 Spring Boot 配置类加载机制困惑?一文为你彻底解惑

在当今微服务架构盛行、项目复杂度不断攀升的开发环境下,SpringBoot作为Java后端开发的主流框架,无疑是我们手中的得力武器。然而,当我们在享受其自动配置带来的便捷时,是否曾被配置类加载...

Seata源码—6.Seata AT模式的数据源代理二

大纲1.Seata的Resource资源接口源码2.Seata数据源连接池代理的实现源码3.Client向Server发起注册RM的源码4.Client向Server注册RM时的交互源码5.数据源连接...

30分钟了解K8S(30分钟了解微积分)

微服务演进方向o面向分布式设计(Distribution):容器、微服务、API驱动的开发;o面向配置设计(Configuration):一个镜像,多个环境配置;o面向韧性设计(Resista...

SpringBoot条件化配置(@Conditional)全面解析与实战指南

一、条件化配置基础概念1.1什么是条件化配置条件化配置是Spring框架提供的一种基于特定条件来决定是否注册Bean或加载配置的机制。在SpringBoot中,这一机制通过@Conditional...

一招解决所有依赖冲突(克服依赖)

背景介绍最近遇到了这样一个问题,我们有一个jar包common-tool,作为基础工具包,被各个项目在引用。突然某一天发现日志很多报错。一看是NoSuchMethodError,意思是Dis...

你读过Mybatis的源码?说说它用到了几种设计模式

学习设计模式时,很多人都有类似的困扰——明明概念背得滚瓜烂熟,一到写代码就完全想不起来怎么用。就像学了一堆游泳技巧,却从没下过水实践,很难真正掌握。其实理解一个知识点,就像看立体模型,单角度观察总...

golang对接阿里云私有Bucket上传图片、授权访问图片

1、为什么要设置私有bucket公共读写:互联网上任何用户都可以对该Bucket内的文件进行访问,并且向该Bucket写入数据。这有可能造成您数据的外泄以及费用激增,若被人恶意写入违法信息还可...

spring中的资源的加载(spring加载原理)

最近在网上看到有人问@ContextConfiguration("classpath:/bean.xml")中除了classpath这种还有其他的写法么,看他的意思是想从本地文件...

Android资源使用(android资源文件)

Android资源管理机制在Android的开发中,需要使用到各式各样的资源,这些资源往往是一些静态资源,比如位图,颜色,布局定义,用户界面使用到的字符串,动画等。这些资源统统放在项目的res/独立子...

如何深度理解mybatis?(如何深度理解康乐服务质量管理的5个维度)

深度自定义mybatis回顾mybatis的操作的核心步骤编写核心类SqlSessionFacotryBuild进行解析配置文件深度分析解析SqlSessionFacotryBuild干的核心工作编写...

@Autowired与@Resource原理知识点详解

springIOCAOP的不多做赘述了,说下IOC:SpringIOC解决的是对象管理和对象依赖的问题,IOC容器可以理解为一个对象工厂,我们都把该对象交给工厂,工厂管理这些对象的创建以及依赖关系...

java的redis连接工具篇(java redis client)

在Java里,有不少用于连接Redis的工具,下面为你介绍一些主流的工具及其特点:JedisJedis是Redis官方推荐的Java连接工具,它提供了全面的Redis命令支持,且...