当前位置:   article > 正文

【Selenium完整篇】:基本概念+元素定位+API示例_selenium vb

selenium vb

一、常见的自动化测试工具认识

1、QTP:主要做自动化回归有图形化界面,用VB语言实现
2、Rational Robot :做配置和回归的自动化测试
3、jmeter:Apache下的一个性能和部分接口测试工具,轻量级,用JAVA实现
4、Loadrunner:性能测试工具,比较常用
5、Appium:做APP自动化测试的一个工具
6、postman、soupui:做接口自动化的测试工具
7、Selenium:web端的功能自动化(重点学习)

注:自动化测试的时机是功能相对稳定,很好理解,有功能才能去测,UI自动化是在前端完成、接口自动化是在后端完成

二、Selenium工具集简单认识

1、Selenium是个工具集

Selenium并不是一个工具,而是一个工具集;比如Selenium1就包括三个,Selenium IDE(有图形化)、SeleniumRC(远程控制)和SeleniumGRID(分布式测试)Selenium2:重点加入了浏览器驱动Web Driver,WebDriver工作原理就像出租车司机,可以去驱动出租车,驱动的方式就是乘车告诉给他的路线,他照着开,乘客就相当于编写的自动化脚本

在这里插入图片描述
Selenium3:增加了一些浏览器的原生驱动,比如edge,safari

2、Selenium较之其他工具的优点

–免费,这对于咱这穷鬼很友好,QTP 就是收费的
–小巧,对于不同的语言它只是一个包而已,Loadrunner的安装包就有4个G
–支持多语言这也是最重要的一点,不管你以前更熟悉C、java、ruby、python、或都是C# ,你都 可以通过selenium 完成自动化测试,而QTP 只支持VB
–支持多平台:windows、linux、MAC ,支持多浏览器:ie、ff、safari、opera、chrome
–支持分布式测试用例的执行,可以把测试用例分布到不同的测试机器执行,相当于分发机的功能

3、如何实施自动化

单纯的讲,自动化测试的具体实现,应该是包含下面七个过程的。

  1. 分析:总体把握系统逻辑,分析出系统的核心体系架构。
  2. 设计:设计测试用例,测试用例要足够明确和清晰,覆盖面广而精
  3. 实现:实现脚本,有两个要求一是断言,二是合理的运用参数化。
  4. 执行:执行脚本远远没有我们想象中那么简单。脚本执行过程中的异常需要我们仔细的去分析原因。
  5. 总结:测试结果的分析,和测试过程的总结是自动化测试的关键。
  6. 维护:自动化测试脚本的维护是一个难以解决但又必须要解决的问题。
  7. 分析:在自动化测试过程中深刻的分析自动化用例的覆盖风险和脚本维护的成本。

4、进行自动化测试的好处

①减少重复测试的时间,实现快速回归测试
②创建优良可靠的测试过程,减少人为错误
③可以运行更多更繁琐的测试
④可以执行一些手工测试困难或不可能进行的测试
⑤更好的利用资源,节省人力
⑥测试具有一致性和重复性,脚本的重复性

三、常见API使用实例

先来看一个简单的脚本,对自动化脚本建立一个基础认识
#后面为代码的详细解释

# coding = utf-8  防止乱码,可加可不加
from selenium import webdriver  
#要想使用selenium 的webdriver 里的函数,首先把包导进来
import time
browser = webdriver.Firefox()
#webdriver.我们想操控的浏览器,这个可以换
time.sleep(3)  
#等待三秒
browser.get("http://www.baidu.com") 
#在火狐浏览器内打开百度页面
time.sleep(3)
browser.find_element_by_id("kw").send_keys("selenium") 
#元素定位方式。下面会说
time.sleep(3)
browser.find_element_by_id("su").click
browser.quit() 
#操作完调用quit关闭掉,不然桌面会打开好多浏览器页面
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

1、元素定位方面

元素定位在自动化测试中非常重要,这就比如你找不到元素你拿什么测,所以这里也是自动化测试的重点,下面介绍几种元素定位方式

<input id="kw" class="s_ipt" type="text" maxlength="100" name="wd" autocomplete="off">
  • 1

①id和name定位:id 和name 是我们最最常用的定位方式,因为大多数控件都有这两个属性,而且在对控件的id 和name 命名时一般使其有意义也会取不同的名字。

#通过id 方式定位
browser.find_element_by_id("kw").send_keys("selenium")
#通过name 方式定位
browser.find_element_by_name("wd").send_keys("selenium")
  • 1
  • 2
  • 3
  • 4

②tag name 和class name定位:百度输入框的属性信息中不单单只有id 和name 两个属性, 比如class 和tag name(标签名),input 就是一个标签的名字,可以通过find_element_by_tag_name(“input”) 函数来定位。class=“s_ipt”,通过find_element_by_class_name(“s_ipt”)函数捕获百度输入框。

#通过tag name 方式定位
browser.find_element_by_tag_name("input").send_keys("selenium") 不能成功,因为input太多了不唯一。
#通过class name 方式定位
browser.find_element_by_class_name("s_ipt").send_keys("selenium")
  • 1
  • 2
  • 3
  • 4

③XPath定位XPath可以看做定位的杀手锏,它是可以唯一定位的,是一种在XML 文档中定位元素的语言。因为HTML 可以看做XML 的一种实现,所以selenium 用户可是使用,这种强大语言在web 应用中定位元素。

#通过xphan 方式定位
browser.find_element_by_xpath("//[@id='kw']").send_keys("selenium")
  • 1
  • 2
#coding=utf-8
from selenium import webdriver
import time
browser = webdriver.Chrome()
browser.get("http://www.baidu.com")
#########百度输入框的定位方式##########
#通过id 方式定位
browser.find_element_by_id("kw").send_keys("selenium")
#通过name 方式定位
browser.find_element_by_name("wd").send_keys("selenium")
#通过tag name 方式定位
browser.find_element_by_tag_name("input").send_keys("selenium") 不能成功,因为input太多了不唯一。
#通过class name 方式定位
browser.find_element_by_class_name("s_ipt").send_keys("selenium")
#通过CSS 方式定位
browser.find_element_by_css_selector("#kw").send_keys("selenium")
#通过xphan 方式定位
browser.find_element_by_xpath("//[@id='kw']").send_keys("selenium")
############################################
browser.find_element_by_id("su").click()
time.sleep(3)
browser.quit()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

④link定位:有时候不是一个输入框也不是一个按钮,而是一个文字链接,我们可以通过link text来定位

#coding=utf-8
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("http://www.baidu.com")
browser.find_element_by_link_text("hao123").click()
browser.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

⑤部分链接定位,这个有时候也会用到,我还没有想到很好的用处。拿上面的例子,我可以只用链接的一部分文字进行匹配:

#coding=utf-8
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("http://www.baidu.com")
browser.find_element_by_partial_link_text("hao").click()
browser.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

⑥CSS定位:

#通过CSS 方式定位
browser.find_element_by_css_selector("#kw").send_keys("selenium")

  • 1
  • 2
  • 3

2、操作测试对象方面

一般来说,webdriver 中比较常用的操作对象的方法有下面几个:

click :点击对象
send_keys :在对象上模拟按键输入
clear :清除对象的内容,如果可以的话
submit :提交表单
text :用于获取元素的文本信息

driver.find_element_by_id("su").submit()
driver.find_element_by_id("kw").send_keys("selenium").click
driver.find_element_by_id("su").submit()
data=driver.find_element_by_id("cp").text
print(data)
import time
time.sleep(3)
driver.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

3、浏览器的操作

我们知道调用启动的浏览器不是全屏的,这样不会影响脚本的执行,但是有时候会影响我们“观看”脚本的执行。
①浏览器最大化,也就是放全屏:maximize_window()

browser.maximize_window() #将浏览器最大化显示
  • 1

②设置浏览器宽和高:set_window_size

#参数数字为像素点
print "设置浏览器宽480、高800显示"
browser.set_window_size(480, 800)

  • 1
  • 2
  • 3
  • 4

③操作浏览器的前进后退:browser.back()、browser.forward()

#访问新闻页面
second_url='http://news.baidu.com'
print "now access %s" %(second_url)
browser.get(second_url)
time.sleep(2)
#返回(后退)到百度首页
print "back to %s "%(first_url)
browser.back()
控制浏览器滚动条
execute_script(script, *args),在当前窗口/框架同步执行javaScript
#前进到新闻页
print "forward to %s"%(second_url)
browser.forward()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

④控制浏览器滚动条

#将页面滚动条拖到底部
js="var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)
time.sleep(3)
#将滚动条移动到页面的顶部
js="var q=document.documentElement.scrollTop=0"
driver.execute_script(js)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

4、键盘事件

键盘按键用法

driver.find_element_by_id("account").send_keys(Keys.TAB)
driver.find_element_by_name("password").send_keys(Keys.ENTER)
  • 1
  • 2

键盘组和用法

#ctrl+a 全选输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
time.sleep(3)
#ctrl+x 剪切输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')
time.sleep(3)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

5、鼠标事件

就是我们平时在鼠标上进行的简单操作
ActionChains 类下的这些方法需要掌握
context_click() 右击
double_click() 双击
drag_and_drop() 拖动
move_to_element(menu) 移动:移动鼠标到一个元素中,menu 上面已经定义了他所指向的哪一个元素
perform():执行所有存储的行为

#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
import time
driver = webdriver.Chrome()
driver.get("http://news.baidu.com")
qqq =driver.find_element_by_xpath(".//*[@id='s_btn_wr']")
ActionChains(driver).context_click(qqq).perform() #右键
ActionChains(driver).double_click(qqq).perform() #双击
#定位元素的原位置
element = driver.find_element_by_id("s_btn_wr")
#定位元素要移动到的目标位置
target = driver.find_element_by_class_name("btn")
#执行元素的移动操作
ActionChains(driver).drag_and_drop(element, target).perform()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

6、多层框架/窗口定位

对于一个现代的web 应用,经常会出现框架(frame) 或窗口(window)的应用,这也就给我们的定位带来了一个难题。
有时候我们定位一个元素,定位器没有问题,但一直定位不了,这时候就要检查这个元素是否在一个frame 中,
seelnium webdriver 提供了一个switch_to_frame 方法,可以很轻松的来解决这个问题。

#先找到到ifrome1(id = f1)
browser.switch_to_frame("f1")
#再找到其下面的ifrome2(id =f2)
browser.switch_to_frame("f2")
#下面就可以正常的操作元素了
  • 1
  • 2
  • 3
  • 4
  • 5

7、上传文件操作

#coding=utf-8
from selenium import webdriver
import os,time
driver = webdriver.Chrome()
#脚本要与upload_file.html 同一目录
file_path = 'file:///' + os.path.abspath('upload.html')
driver.get(file_path)
#定位上传按钮,添加本地文件
driver.find_element_by_name("file").send_keys('D:\\PycharmProjects\\test\\upload.txt')
time.sleep(2)
driver.quit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

8、alert、confirm、prompt 的处理

text 返回alert/confirm/prompt 中的文字信息
accept 点击确认按钮
dismiss 点击取消按钮,如果有的话
send_keys 输入值,这个alert\confirm 没有对话筐就不用处理了,不然会报错
注意:switch_to_alert()只能处理原生的alert

#接受警告信息
alert = dr.switch_to_alert() 
alert.accept() 
#得到文本信息打印
alert = dr.switch_to_alert() 
print alert.text 
#取消对话框(如果有的话)
alert = dr.switch_to_alert() 
alert.dismiss() 
#输入值
alert = dr.switch_to_alert() 
alert.send_keys("hello word")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号