一、简介
Selenium 是 thoughtworks公司的一个集成测试的强大工具 , 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样 .完全仿真式模拟用户在浏览器进行操作。 支持各种浏览器包括Chrome、Firefox、Safari等主流界面浏览器,同时也支持phantomJS无界面浏览器, 支持多种OS如Windows、Linux、IOS、Android等
二、版本
Selenium 现在存在2个版本,一个叫 selenium-core, 一个叫selenium-rc 。
selenium-core 是使用HTML的方式来编写测试脚本,你也可以使用 Selenium-IDE来录制脚本,但是目前Selenium-IDE只有 FireFox 版本。
Selenium Core基于JsUnit,完全由JavaScript编写,因此可以用于任何支持JavaScript的浏览器上。
Selenium-RC 是 selenium-remote control 缩写,是使用具体的语言来编写测试类。支持的语言也比较多: Java,C#,Perl,Python和PHP。
这样就可以编写更加复杂的测试用例,这里就重点讨论 Selenium-RC。
发展历史
- 1.0 时代
selenium IDE:浏览器安装相应的插件,通过录制用户操作,生产测试脚本(类似于按键精灵)
selenium Grid: 利用RC进行集群并发,大规模的测试
selenium RC : 模拟单浏览器操作,支持多语言
存在的缺陷:
不支持本机键盘和鼠标事件
不支持XSS和HTTPS
不支持弹窗 、对话框、证书
- 2.0时代
等于1.0+WebDriver
基于WebDriver API 来模拟用户操作
- 3.0时代
支持Java8
支持多系统,包括MAC OS 和 safari浏览器,支持Edge浏览器,支持IE9
弃用 Selenium-RC
三、 Selenium3.0
1.工作原理
Selenium WebDriver的工作方式是这样
Test Script-------------》ChromeDriver---》Chrome Browser------->Web Server
2.实战
OS : win7 64bit IDE :PyCharm Python:3.7 chrome driver
chrome driver 下载地址
1.谷歌官方镜像
http://chromedriver.storage.googleapis.com/index.html
2.淘宝镜像
https://npm.taobao.org/mirrors/chromedriver/
好在驱动文件不大,可以直接下载
创建py文件,开始编码。需要指定chromedriver的物理路径,以及windows下反斜杠的转义
from selenium import webdriver
# 实例化一个web driver对象,其中 r 为转义反斜杠
driver1=webdriver.Chrome(r'G:\py\chromedriver.exe')
driver1.get('https://www.baidu.com/')
# 类似按键精灵,也需要等待时间,单位为秒
driver1.implicitly_wait(3)
# 返回 element 对象 ,输入数据
ele_input=driver1.find_element_by_id('kw')
ele_input.send_keys("张小娴")
# 点击按钮
ele_sub=driver1.find_element_by_id('su').click()
driver1.implicitly_wait(3)
#对返回的查询数据进行遍历,用到CSS表达式
ok=driver1.find_element_by_css_selector('a.s-tab-item.s-tab-pic')
ok.click()
#id elemet[class=on] 父级元素内,元素的 class
# ele_pic=driver1.find_elements_by_class_name('s-tab-item s-tab-pic')
# driver1.find_element_by_class_name()
# for el in ele_pic:
# el.click()
总结起来就是:获取元素,操作元素以及鼠标键盘事件。
其中:获取元素的几种方式
#1. id定位:find_element_by_id("id值");id属性是唯一的
driver.find_element_by_id("loginName").clear()
driver.find_element_by_id("loginName").send_keys("admin")
driver.find_element_by_id("pwdTip").send_keys(Keys.TAB)#密码输入框的id属性
driver.find_element_by_id("pwdTip").send_keys("111111")
#2. name定位:元素的名称,find_element_by_name("name值");name属性值在当前页面可以不唯一
driver.find_elements_by_name("PeriodName")[1].click()#选择学段:初中
driver.find_elements_by_name("SubjectName")[0].click()#选择学科:语文
#3.class定位:元素的类名,find_element_by_class_name("class值")
driver.find_elements_by_class_name("u-btn-levred")[0].click()
#4. tag定位:页面html文档下的各种标签,基本没有用
find_element_by_tag_name("input")
#5. link定位:专门用来定位文本链接,find_element_by_link_name("text");
driver.find_element_by_link_text(u"退出").click()
#页面右上方的一些个人操作,比如退出、个人中心、消息通知等
#6. partial link定位:是对link定位的一种补充,当链接上的文本内容比较长的时候,可以取文本的一部分进行定位,当然#这部分可以唯一地标识这个链接
7. XPath定位:find_element_by_xpath("");有多种定位策略,用FirePath插件自动生成的涵盖以下几种方式
1)绝对路径定位:对于没有id,name、classname不好定位的,这也是我最常用的,因为可以通过Firefox的FirePath插件可以方便的获取到xpath值
2)利用元素属性定位:
find_element_by_xpath(".//*[@id='Title']"),这里是用的id,也可以用元素其他能够唯一标识的属性,不局限于id、name、class这些;*代表的是标签名,不指定时就可以用*代替
3)层级与属性结合:下图中就是这种
4)使用逻辑运算符
driver.find_element_by_xpath(".//*[@id='divword']/input[7]").click()#登录
driver.find_element_by_xpath("html/body/div[4]/div/div[2]/div/div[3]/a[1]").click()#个人页面的发布课程操作
8. CSS定位(薄弱,用的很少,但很强大,比xpath简洁灵活):使用选择器来为页面元素绑定属性,可以灵活地选择控件的任意属性;find_element_by_css_selector("");同样也可以用FirePATH生成css哟
1)通过class属性定位:点号(".")表示通过class属性定位
#<input class="u-btn mart5" type="submit" onclick="return User.check()" value="登录"> driver.find_element_by_css_selector(".u-btn.mart5").click()
2)通过id属性定位:("#")表示通过id定位元素
driver.find_element_by_css_selector("#loginName")
3)通过其他属性定位:("[]"),中括号里的属性可以唯一标识这个元素就可以;属性的值可以加引号,也可以不加
<input class="u-btn mart5" type="submit" onclick="return User.check()" value="登录">
driver.find_element_by_css_selector("#div input[type=submit]").click()
9. 用By定位元素
除find_element_by_***这种方式,还有另一套写法,也就是统一调用find_element()方法,两个参数,第一个参数是定位的类型,由By提供;第二个参数是定位的具体值
from selenium.webdriver.common.by import By #使用By这种定位前要将By类导入
find_element(By.ID,"loginName")
find_element(By.NAME,"SubjectName")
find_element(By.CLASS_NAME,"u-btn-levred")
find_element(By.TAG_NAME,"input")
find_element(By.LINK_TEXT,"退出")
find_element(By.PARTIAL_LINK_TEXT,"退")
find_element(By.XPATH,".//*[@id='Title")
find_element(By.CSS_SELECTOR,"[type=submit]")
一半的工作在找元素,一般的工作在写业务逻辑