pythonselenium做ui自动化测试用法必会
一、前言
大家都知道,基于 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("//p[@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单元测试框架,实现分层、数据驱动、断言、截图、日志等全方位功能,得心应手的开展自动化测试工作。
简单直接且有效的检测音响高中低音质的方法阜新声艺视听在没有专业知识或没有专业测试工具的前提下,音响小白应该怎么检测音箱是否具备有高中低音呢?今天就教大家几招简单直接并且有效的方法低音部分在音箱旁放一杯水,打开机子播放,低音效果好的音
十分钟让你理解关于声音的7个概念阜新声艺视听音响发烧友聊天,经常会听到他们说音质音色音场频段解析力动态对比等高大上的词。对于不了解音乐音响的小白来讲,简直听得云里雾里。现在小编就用简单易懂的话语,带您了解这些词的概念含义。音
一文搞清点声源和线阵列音箱功能区别阜新声艺视听线阵音箱也称为线性整列扬声器。多只音箱可以组合成一个具有相同的振幅与相同位置的音箱组(线阵组)的音箱叫做线阵音箱。线性阵列是一组排列成直线间隔紧密的辐射单元,并具有相同的振幅与相位
音频处理器延时功能怎么用阜新声艺视听音频处理器中的延时是扩声系统工程师经常会用到的功能,在这里我们简单归纳一下调节延时的主要方法。我们知道,延时数值只能够输入正值,无法输入负值。因此,在采用延时功能时第一种方法步骤1
宴会厅灯光音响系统介绍阜新声艺视听以希尔顿五星级酒店宴会厅为例,宴会厅舞台台口宽11m,舞台台口高6m,舞台深9m。本工程设计方案是根据国内高档次宴会厅标准和要求来设计的,综合吸取了当前国内外此类系统的特点而设计制
家庭KTV包房音响的摆放与不规则声场的调音方法在音响工程实战中,由于很多家庭KTV音响套装客户的包房是不规则的,导致音响工程的难度倍增。如果消费者在网上买了家庭KTV音响套装,收到货物后在工作人员的指导下直接安装好。那么很有可
详细说明有源音箱与无源音箱的区别阜新声艺视听大家在购买音箱的时候,总是会被音箱的类型给困扰,那就是有源音箱和无源音箱到底是什么?今天小编就来为大家来个解惑,让大家在选择过程中,能够因地制宜,减少不必要的麻烦和损失。什么是有源
各地超火音乐节幕后设备大盘点!阜新声艺视听近段时间受疫情影响,全国多地演出取消,剧院KTV等娱乐场所暂停营业,演艺行业再次面临停摆。如今境遇不同,但行业前进的步伐不止。在黑暗中积蓄力量,则终将迎来发展的黎明。小编本次继续为
演出场所的声场优化阜新声艺视听EQ真的能解决空间声学问题吗?首先,我们先来思考一下我们面临的声学问题是受限于扬声器系统的性能,还是室内建筑声学缺陷,亦或者两者兼而有之?让我们先来看看典型的大型音乐表演空间的声场
如何规划音响系统!!阜新声艺视听想必大家都面临过这样的问题,想要一套系统,但不知道如何规划吗!?做事有轻重缓急,因此,我们先来看看,PA音响系统规划的优先级是什么?1。空间设计规划2。预算分配控制3。清楚自己的需
如何保障重要会议正常召开,以下几点需要注意阜新声艺视听数字会议系统作为现代会场建设的核心系统,不仅要有清晰的拾音功能和超长的拾音距离,而且系统的稳定运行保障也是非常重要的,尤其是大型的会议上,一旦出现故障,既耽误了会议的进度与决策的及