一、前言
大家知道,Web端测试的基础框架主要为支撑的是Selenium,所以这边给大家介绍一下Web测试基于Python的Selenium
什么是Selenium框架?
-
框架(framework)是一个框子——指其约束性,也是一个架子——指其支撑性。是一个基本概念上的结构,用于去解决或者处理复杂的问题。 -
框架是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义。 -
框架,其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是使用别人搭好的舞台,你来做表演。
二、环境安装
1、先下载python(建议3.7) 2、验证python是否安装成功: python 3、安装pip 包 4、安装selenium包 5、谷歌浏览器控制响应的版本,禁止跟新 6、下载谷歌浏览器的驱动程序包:webdriver 7、安装pycharm 8、在pycharm中编写代码
三、牛刀小试
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
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. 多窗口处理
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单元测试框架,实现分层、数据驱动、断言、截图、日志等全方位功能,得心应手的开展自动化测试工作。
章到这里就结束了,感谢你的观看。
我想把我收藏的一些编程干货贡献给大家,回馈每一个读者,希望能帮到你们。
1、Python编程方面的视频(及电子书)!
2、web、接口、工具等视频教程!
3、Python自动化测试学习路线图(告别不入流的学习)
如果你用得到的话可以直接拿走,欢迎加入软件测试技术群:798478386!
还有同行大神加粗样式一起交流技术哦。 ?
|