Lettuce_webdriver 自动化测试
这篇文章主要讲解以下几点:
1. Lettuce_webdriver环境搭建
2. lettuce_webdriver自动化实例讲解
一. lettuce_webdriver环境搭建
搭建lettuce_webdriver,主要需要安装:
1. lettuce
2. lettuce_webdriver
3. nose
这三个包均可以pip安装
因为pip下载地址默认为国外的pypi,下载过慢,很容易timeout,为了解决这一问题,可以pip命令后加上一个参数:--trusted-host pypi.douban.com
例如: pip install lettuce --truted-host pypi.douban.com 这一下载地址会指定为国内豆瓣代理pypi,速度比国外快了不知多少倍
也可以直接访问 http://pypi.douban.com/simple/*** ***替换为你想找的python插件,找到合适的版本下载即可

二. 自动化实例
项目:baidu查找selenium
1. 为了更加深刻的理解接下来学习的lettuce语法,先在这里说一下所需要实现的自动化流程
如果是人工操作,步骤大概如下:
a. 打开浏览器
b. 输入网址www.baidu.com,进入baidu首页
c. 在查询框中输入 selenium
d. 点击查询按钮
f. 等待页面响应
g. 验证结果是否正确
h. 关闭浏览器
相信熟悉selenium的人,已经看出来了,这不就是selenium的自动化执行步骤么
我大声的告诉你,没错! lettuce其实就是数据驱动脚本,而且更加具有可读性
2. 废话不多说,先看个案例,再说理论
创建一个叫features的目录,目录下两个文件 baidu.feature 和 step.py
首先是baidu.feature,内容如下
Feature: Baidu search test case Scenario: search selenium
Given I go to "http://www.baidu.com/"
When I fill in field with id "kw" with "selenium"
And I click id "su" with baidu once
Then I should see ".//*[@id='1']/h3/a" and value is "Selenium - Web Browser Automation" within 2 second
Then I close browser
化身翻译狂魔,上面说的是:
第一行 功能:百度查询测试用例
第三行 场景:查询selenium
第四行 给定: 我进入网址“http://www.baidu.com/”
第五行 当: 我用“selenium”一词填充id为“kw”的输入框
第六行 和: 我点击id为“su”的按钮一词
第七行 此时: 我可以在2秒内看到“.//*[@id='1']/h3/a” 的值为“Selenium - Web Browser Automation” //这句太抽象,将就看吧
第八行 此时: 我关闭了浏览器
这就是全部的lettuce代码,简直就是流水帐有没有,英语渣渣表示也能啃懂
现在和之前步骤对比一下,发现几乎是一致的
脚本中的关键字(每行第一个单词)都是代表一定意义的
Feature 代表一个功能,其下可以写很多个场景
Scenario 代表一个场景,其下可以存在很多步骤
Give 代表的是操作步骤
When 代表触发条件,可以代替操作步骤
And 连接两个触发条件
Then 验证结果
接下来是step.py的内容
# coding: utf-8 import time
from lettuce import *
from selenium import webdriver
from lettuce_webdriver.util import AssertContextManager @before.all
def setup_browser():
world.browser = webdriver.Firefox()
world.browser.maximize_window() @step('I go to "(.*?)"')
def baidu_init(step, baidu_url):
with AssertContextManager(step):
print baidu_url
world.browser.get(baidu_url)
world.browser.maximize_window() # 定位输入框输入关键字
@step('I fill in field with id "(.*?)" with "(.*?)"')
def baidu_text(step, field_name, value):
with AssertContextManager(step):
text_fied = get_element_by_id(world.browser, field_name)
text_fied.clear()
text_fied.send_keys(value) # 点击“百度一下”按钮
@step('I click id "(.*)?" with baidu once')
def baidu_click(step, field_name):
with AssertContextManager(step):
click_field = get_element_by_id(world.browser, field_name)
click_field.click() @step('I should see "(.*?)" and value is "(.*?)" within 2 second')
def i_should_see(step, xpath, expect_value):
time.sleep(2)
elem = get_element_by_xpath(world.browser, xpath)
active_value = elem.text
assert expect_value == active_value, "Got value=%s " % active_value # 关闭浏览器
@step('I close browser')
def close_browser(step):
world.browser.close() def get_element_by_id(browser, attribute):
xpath = "//input[@id='%s']" % attribute
elems = browser.find_elements_by_xpath(xpath)
return elems[0] if elems else False def get_element_by_xpath(browser, attribute):
elems = browser.find_elements_by_xpath(attribute)
return elems[0] if elems else False
代码比较长,不过没关系,首先,你会发现,baidu.feature中每一个步骤都会对应一个step.py中一个方法
且步骤说明写在了装饰器step("")中,唯一的不同就是,有些数据被替换成了奇怪的符号
对于代码来讲,这里的元素定位方法和selenium是相同的,唯一值得注意的就是step装饰器了
当启动这个脚本(如何启动后面说)时,出现的结果如下:

对于每一步,会分为灰/绿两种颜色的执行结果,灰色代表的是baidu.feature的代码行,绿色代表step.py的代码行,最后执行通过
看到这想到了什么?同步是不是,不同的两个文件,因为某种练习,步骤一一对应的进行
这里要说一下运行的原理
首先两个文件是有分工的,feature的工作是指导,即决定执行步骤的顺序,他提供操作需要的数据,但是不决定每一步怎么做;而setup.py文件是将每一步处理好,两部分分工明确,相辅相成
其次,feature如何传送给setup.py数据的呢?很简单,step.py中的每一步都对需要的数据进行了正则匹配,并传入到方法中,比如I go to ...这一步,使用了(.*?)对“http://www.baidu.com/”进行匹配,
并将该值赋值给baidu_init(step, baidu_url)方法中的参数baidu_url;当配置数据2个以上时,在下面的方法中再加一个参数,顺序获取之 例子:I should see这一行
例子介绍完了,说一下运行的事
想运行文件,不能直接python ... ,需要用lettuce命令
保证项目目录下有features目录
.feature文件一定要保证在features目录下,不然会报错
step.py文件可以在项目目录下的任意地方
运行时进入到项目目录,此时你可以看到features目录
直接输入lettuce,开始执行
当然,这只是一个场景,上面也说了,一个功能下可以设置多个场景,怎么办呢,将 Scenario及步骤复制,Scenario和所需的数据变一下就好了
Feature: Baidu search test case Scenario: search selenium
Given I go to "http://www.baidu.com/"
When I fill in field with id "kw" with "selenium"
And I click id "su" with baidu once
Then I should see ".//*[@id='1']/h3/a" and value is "Selenium - Web Browser Automation" within 2 second
Then I close browser Scenario: search selenium
Given I go to "http://www.baidu.com/"
When I fill in field with id "kw" with "selenium"
And I click id "su" with baidu once
Then I should see ".//*[@id='1']/h3/a" and value is "Selenium - Web Browser Automation" within 2 second
Then I close browser Scenario: search selenium
Given I go to "http://www.baidu.com/"
When I fill in field with id "kw" with "selenium"
And I click id "su" with baidu once
Then I should see ".//*[@id='1']/h3/a" and value is "Selenium - Web Browser Automation" within 2 second
Then I close browser
由于本人太懒,没有换数据,值得注意的是,为了区分场景,场景名一定要取不同
此时你再去运行,会发现执行了三次
好的,本章letture_webdriver攻略就到这里,如果有问题欢迎留言
Lettuce_webdriver 自动化测试的更多相关文章
- lettuce webdriver 自动化测试---玩转BDD
行为驱动开发(BDD),依然高大上的矗立在远方,很少被人问津,一方面是BDD的思想不太容易理解,别一方面BDD的资料并不多.中文的资料就更少了. 之前增写过一篇<python BDD 框架之le ...
- 避免重复造轮子的UI自动化测试框架开发
一懒起来就好久没更新文章了,其实懒也还是因为忙,今年上半年的加班赶上了去年一年的加班,加班不息啊,好了吐槽完就写写一直打算继续的自动化开发 目前各种UI测试框架层出不穷,但是万变不离其宗,驱动PC浏览 ...
- python自动化测试(2)-自动化基本技术原理
python自动化测试(2) 自动化基本技术原理 1 概述 在之前的文章里面提到过:做自动化的首要本领就是要会 透过现象看本质 ,落实到实际的IT工作中就是 透过界面看数据. 掌握上面的这样的本领 ...
- AutoIt实现Webdriver自动化测试文件上传
在运用WebDriver进行自动化测试时,由于WebDriver自身的限制,对于上传文件时Windows弹出的文件选择窗口无法控制,通过在网上查找资料锁定使用AutoIt来控制文件上传窗口. Auto ...
- 手机GUI自动化测试工具选择
(Graphical User Interface,简称 GUI,又称图形用户接口) 我们需要针对自身产品的需求,从中选取一款合适的工具来实现自动化.对于移动客户端GUI的自动化而言,需要保证选取的工 ...
- Splinter学习——不仅仅是自动化测试哦
前两天,想抢购一个小米MIX,结果,一开始抢就没有了.于是想,作为程序猿,总得有点特殊手段吧,比如说一个小脚本.最近在学习python,百度了一下,发现了Splinter这个强大的东东!用了不到两小时 ...
- [转]Android Studio 里搭建自动化测试框架Robotium
Android的自动化测试框架可选择的不多,后来选了Robotium(https://code.google.com/p/robotium/),它的语法及易用性挺像我们用在iOS里的KIF. 官方文档 ...
- 接口自动化测试的"开胃小菜"---简单黑客攻击手段
Web应用系统的小安全漏洞及相应的攻击方式 接口自动化测试的"开胃小菜" 1 写作目的 本文讲述一个简单的利用WebAPI来进行一次基本没有破坏力的“黑客”行为. 主要目的如下 ...
- python自动化测试(4)-使用第三方python库技术实现
python自动化测试(4)-使用第三方python库技术实现 1 概述 关于测试的方法论,都是建立在之前的文章里面提到的观点: 功能测试不建议做自动化 接口测试性价比最高 接口测试可以做自动化 ...
随机推荐
- 2017最新xcode打包APP详细图文
网上的xcode打包ipa教程大多太旧而且又不完整,所以整理了一个最新的完整详细的xcode打包APP的图文教程分享给小白到大神路上前进的你我. xcode打包IPA包之前先申请iOS证书,然后导入证 ...
- Redis中的数据对象
redis对象 redis中有五种常用对象 我们所说的对象的类型大多是值的类型,键的类型大多是字符串对象,值得类型大概有以下几种,但是无论哪种都是基于redisObject实现的 redisObjec ...
- Web 前端代码规范
Web 前端代码规范 最后更新时间:2017-06-25 原始文章链接:https://github.com/bxm0927/web-code-standards 此项目用于记录规范的.高可维护性的前 ...
- ci框架中表前缀的处理
后面的写死,前面的无论如何改变都没事,会自动的替换,以后如果数据库的表前缀被修改了,只需要修改上面的配置项,下面的不变
- IOS 关于property的详细解法
1.格式 @property (参数1,参数2,...) 类型 名字; eg: @property(nonatomic,retain) UIWindow *window; 其中参数主要分为三类: • ...
- 【LeetCode】144. Binary Tree Preorder Traversal
题目: Given a binary tree, return the preorder traversal of its nodes' values. For example:Given binar ...
- CSS自定义动画
动画名称 animation-name : (动画名称必须与@keyfarmes的名称相对应,因为动画名称是由@keyfarmes定义的) 例如:animation-name:AA:则 @ ...
- log 的 debug()、 error()、 info()方法的区别
软件中总免不了要使用诸如 Log4net, Log4j, Tracer 等东东来写日志,不管用什么,这些东东大多是大同小异的,一般都提供了这样5个日志级别: × Debug × Info ...
- js通过Date获取日期
获取当前系统时间 var myDate = new Date();//获取系统当前时间 获取特定格式日期 myDate.getYear(); //获取当前年份(2位) myDate.getFullYe ...
- Java缓存框架使用EhCache结合Spring AOP
一.Ehcache简介 EhCache是一个纯Java的进程内缓存框架,具有如下特点: 1. 快速简单,非常容易和应用集成. 2.支持多种缓存策略 . 3. 缓存数据有 ...