selenium是进行web自动化测试的;
把selenium + python写用例的过程中需要注意的地方和问题点简单的给大家分享一下,互相学习进步。
1、Selenium简介
Selenium 是ThoughtWorks专门为Web应用程序编写的一个验收测试工具。
Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE、Google Chrome、Mozilla Firefox、Mozilla Suite等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建衰退测试检验软件功能和用户需求。支持自动录制动作和自动生成。Python、Java、Ruby、Perl、Net等不同语言的测试脚本。
2、准备工作
搭建windows,准备工作如下:
1):下载python 2.7.13,下载地址:http://python.org/getdit/
安装python 2.7.13,安装目录根据个人电脑目录进行安装,默认的是C盘,C:\python27
安装完后配置环境变量,计算机--->系统属性--->高级设置--->环境变量--->系统变量path
讲安装的路径加入path中,前面有英文的分号(;)进行隔开。例如:;C:\python27;C:\python27\Scripts\
校验是否成功安装python,打开cmd窗口输入:python,安装成功显示python的版本以及相关的信息。
2):下载selenium,下载地址:https://pypi.python.org/pypi/selenium/
如果是在联网的状态下,可以直接打开cmd窗口,执行下载命令安装:pip install -U selenium
3):安装chromedriver (特别注意)
下载chromedriver.exe 下载地址:http://npm.taobao.org/mirrors/chromedriver/ 下载2.32版本
解压后,将chromedriver.exe放到chrome安装的目录里:。。。\Google\Chrome\Application\,然后设置环境变量path,根据个人的chrome安装路径配置在path中,然后再调用运行:
浏览器可以下载58,59版本的,下载地址如下:
http://www.pc6.com/SoftView/SoftView_22726.html
#coding = utf-8
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://test.guahao-inc.com:2000')
print driver.title
driver.quit()
3、开始第一个脚本
1):为什么选python
java也是可以实现的,这里就不赘述了,对于python来说,简单,易学,易用,应用也比较广泛。
下面就以百度搜索实现第一个脚本
#coding = utf-8
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('http://www.baidu.com')
browser.find_element_by_id("kw").send_keys("selenium")
browser.find_element_by_id("su").click()
browser.quit()
2):脚本解析
#coding = utf-8
可加也可以不加,加了一般可以防止出现乱码
from selenium import webdriver
要想使用selenium的webdriver里的函数,首先需要把包导进来
browser = webdriver.Chrome()
我们需要操控哪个浏览器呢?chrome,当然也可以换成IE,Firefox。
browser可以随机取,但后面要用它操控各种函数执行。
browser.find_element_by_id("kw").send("selenium")
一个控件有若干个class、name、id、(也可以用其他方式定位),百度输入框id是kw,我们要在输入框里输入selenium。
browser.find_element_by_id("su").click()
搜索按钮的id是su,我需要点击一下按钮(click())
browser.quit()
退出并关闭窗口的相关驱动程序。
4、Selenium—页面元素定位
find_element_by_ClassName
find_element_by_cssSelector
find_element_by_id
find_element_by_linkText
find_element_by_name
find_element_by_partialLinkText
find_element_by_tagName
find_element_by_xpath
根据实际业务场景选择元素类型!
注意:
selenium-webdriver通过findElement()\findElements()等find方法调用"By"对象来定位和查询元素。
By类只是提供查询的方式进行分类。findElement返回一个元素对象否则抛出异常,findElements返回符合条 件的元素List,如果不存在符合条件的就返回一个空的list。
各方法使用优先级为:id,name,linktext优先使用,cssselector次之,最后使用xpath。
5、添加等待时间
有时候为了保证脚本运行的稳定性,需要在脚本中添加等待时间。
1):添加休眠时间
添加休眠时间非常简单,我们需要引入time包,就可以在脚本中自由的添加时间了。
#coding = utf-8
from selenium import webdriver
import time //调入时间函数
browser = webdriver.Chrome()
browser.get('http://www.baidu.com')
time.sleep(10)
browser.find_element_by_id("kw").send_keys("selenium")
browser.find_element_by_id("su").click()
time.sleep(3)
browser.quit()
当执行用例的时候,我们会发现这个等待时间就比较死板,页面加载出来了,还在那里等待着,只有时间到了才执行下面的语句,这样就显得不是特别智能,那么接下来我们就看一下如何更智能的等待。
2):智能等待
通过添加implicitly_wait()方法就可以方便的实现智能等待;implicitly_wait(30)的用法应该比time.sleep()更智能,后者只能选择固定的时间等待,前者可以在一个时间范围内智能等待。
#coding = utf-8
from selenium import webdriver
import time //调入时间函数
browser = webdriver.Chrome()
browser.get('http://www.baidu.com')
browser.implicitly_wait(30) //智能等待30秒
browser.find_element_by_id("kw").send_keys("selenium")
browser.find_element_by_id("su").click()
browser.quit()
3):浏览器最大化
每次执行脚本的时候,我们会看到浏览器并不是最大化的状态,尽管这样不会影响测试,但是有时候会影响我们的’观看‘脚本运行。
#coding = utf-8
from selenium import webdriver
import time //调入时间函数
browser = webdriver.Chrome()
browser.get('http://www.baidu.com')
browser.implicitly_wait(30) //智能等待30秒
print “浏览器最大化”
browser.maximize_window() //将浏览器最大化显示
browser.find_element_by_id("kw").send_keys("selenium")
browser.find_element_by_id("su").click()
browser.quit()
6、操作测试对象
一般来说,webdriver中比较常用的操作对象的方法有下面几个:
click 点击对象
send_key 在对象上模拟按键输入
clear 清除对象内容
submit 提交表单
text 用于获取元素的文本信息
7、键盘事件
1):键盘按键用法
这里以我们测试环境的portal应用,以用户登录的场景来模拟键盘按键的方式进行操作:
#coding = utf-8
from selenium import webdriver
from selenium import webdriver.common.keys import keys #需要引入keys包
import os,time
browser = webdriver.Chrome()
browser.get('http://test.guahao-inc.com:2000/user/login?target=%2F')
browser.implicitly_wait(30) //智能等待30秒
print “浏览器最大化”
browser.maximize_window() //将浏览器最大化显示
browser.find_element_by_id("loginId").clear() //清空输入框里的内容
browser.find_element_by_id("loginId").send_keys("15268170102")
#tab的定位相当于清除了密码框内的默认提示信息,等同上面的clear()
browser.find_element_by_id("password").send_keys(Keys.TAB)
time.sleep(0.5)
browser.find_element_by_id("password").send_keys("123456")
browser.find_element_by_id("validCode").send_keys(Keys.TAB)
time.sleep(0.5)
browser.find_element_by_id("validCode").send_keys("ajhk")
#通过定位验证码的框,enter(回车)来代替登陆按钮
browser.find_element_by_id("validCode").send_keys(Keys.ENTER)
#也可以通过定位登陆按钮,enter(回车)来代替click()
#browser.find_element_by_id("J_LoginSubmit").send_keys(Keys.ENTER)
browser.quit()
要想调用键盘按键操作需要引入keys包
from selenium import webdriver.common.keys import keys
通过send_keys调用按键:
send_keys(Keys.TAB) #TAB
send_keys(Keys.ENTER) #回车
注意:这个操作和页面元素的遍历有关,假如当前定位在账号输入框,按键盘的tab键后遍历的不是密码框,那就无法输入密码。
2):键盘组合键用法
#coding = utf-8
from selenium import webdriver
import time //调入时间函数
browser = webdriver.Chrome()
browser.get('http://www.baidu.com')
browser.implicitly_wait(30) //智能等待30秒
print “浏览器最大化”
browser.maximize_window() //将浏览器最大化显示
browser.find_element_by_id("kw").send_keys("selenium")
#ctrl + a 全选输入框内容
browser.find_element_by_id("kw").send_keys("Keys.CONTROL,'a'")
#ctrl + x 剪贴输入框内容
browser.find_element_by_id("kw").send_keys("Keys.CONTROL,'x'")
#输入框重新输入内容,搜索
browser.find_element_by_id("kw").send_keys(u"操蛋")
browser.find_element_by_id("su").click()
browser.quit()
3):中午乱码问题
selenium2 python在send_keys()中输入中文报错,是因为Python2.7无法解析中文,需要在字符串前面加u。建议学习Python3,Python3 不需要加u,默认字符串编码就是中文编码格式。