Python有类似于Capybara/Cucumber的东西吗?

46
Ruby有一种称为Capybara的很棒的抽象层,它位于Selenium之上,可以用于功能/接受/集成测试。还有另一个名为Cucumber的库,可以更进一步地让您实际上使用英语编写测试用例。
这两个库都是基于Selenium构建的,并且可以用于针对任何主要浏览器的测试,但由于它们的抽象层,使用它们编写测试用例非常容易(至少相对于功能测试来说)。
我的问题是:Python是否有类似的东西?我发现Pythonista使用各种工具进行功能测试,但...
A) Splinter:不使用Selenium(也没有IE驱动程序)
-B编辑- 看起来Spliter现在确实使用了Selenium(请参见下面的答案)。
B) Alfajor:已经超过一年没有更新了;看起来死了
C) Selenium(原始):似乎很多人正在直接使用Selenium,但似乎抽象层可以使其更容易使用。
那么,有人知道是否有类似于Capybara或更好的Python解决方案(它不必实际使用Selenium,但需要支持所有主要浏览器)吗?
*编辑*
对于那些不熟悉Capybara的人,它基本上只是添加了一个API,以便您可以像这样使用它而不是正常的Selenium API:
When /I sign in/ do
  within("#session") do
    fill_in 'Login', :with => 'user@example.com'
    fill_in 'Password', :with => 'password'
  end
  click_link 'Sign in'
end

这是Cucumber使用的,可以进一步抽象化(几乎到英语水平):

Scenario Outline: Add two numbers
Given I have entered <input_1> into the calculator
And I have entered <input_2> into the calculator
When I press <button>
Then the result should be <output> on the screen

Examples:
| input_1 | input_2 | button | output |
| 20 | 30 | add | 50 |

我希望有一个类似于 Python Cucumber 的东西,但就算只是类似于 Capybara 的也会很有帮助。


1
虽然Splinter不支持IE,但它确实使用Selenium。请查看Web驱动程序的实现方式:https://github.com/cobrateam/splinter/tree/master/splinter/driver/webdriver - Lorin Hochstein
看起来Splinter自我上次查看以来有了显着的改进(现在它看起来很专业,而我记得它只是一个白色页面和一张老鼠草图)。话虽如此,在我看来,如果有人正在评估一个库,他们不应该深入到驱动程序代码中去学习;库应该在首页上尽可能多地说明。虽然新网站很棒,但我仍然看不到关于Selenium的任何信息在首页上。 - machineghost
2
http://behave.readthedocs.org/en/latest/index.html - yurisich
7个回答

25

你可以使用Cucumber测试Python代码-有关更多信息,请参阅Cucumber wiki

如果您想要一个纯Python解决方案,请查看Lettuce。我从未使用过它,但这里有一篇相当有用的博客文章介绍了它和splinter here


生菜看起来很棒!我知道我可以使用Cucumber与任何语言,但这样做需要A)用Ruby编写我的测试("elsif"...谁会这样做?)和B)让所有同事学习Ruby。有了生菜,看起来我不必忍受这两个折衷方案,非常感谢。 - machineghost
2
跟进评论:现在我实际使用了它,Lettuce 不仅看起来很棒...它实际上也很棒 :-) 它不仅运行良好并且做到了我关心的所有事情,而且还使 Python Selenium 驱动程序更加出色!再次感谢您的建议。 - machineghost
1
你是否发现使用 Lettuce 时,这些问题中的任何一个都成了问题?参见 http://packages.python.org/behave/comparison.html#lettuce - Dave C
1
我并没有发现这些事情对我造成任何问题(我甚至不知道他所说的“标签”是什么意思)。然而,我们现在主要使用Lettuce来进行Selenium辅助测试;出于完全无关的原因,我们放弃了基于BDD风格的文本测试。虽然在使用它时它表现得非常好 :-) - machineghost
看起来Cucumber不再得到维护。 - Bryce Guinta

21

A. 像黄瓜一样:(英语中的)

  • Lettuce(采用Gherkin方法)或
  • Behave(采用Gherkin方法)或
  • Robotframework(采用基于关键字的方法) (附加信息:RF大于英语Like标准。它是基于关键字的,提供了大量的辅助方法和内置库。对于外部库而言,有着良好的生态系统。任何Python脚本都可以修改并与RF一起使用)
  • Freshen(采用Gherkin方法)或
  • Pea(采用Gherkin方法)或
  • RedwoodHQ(采用基于关键字的方法) (RedwoodHQ具有超过“英语式”标准的特性,封装了以下功能:基于关键字、Web测试框架、支持Python作为其中一种语言等。 关于RedwoodHQ的其他信息:理论上来说,所有现有的robot-framework内置库和所有robot-framework外部测试库,或者任何Python库,都可以通过这个基于Web的测试框架进行调用或使用,只需进行少量修改)

  • Gauge(采用Gherkin方法):Python参考:https://gauge-python.readthedocs.io/en/latest/index.html


在Cucumber下面,可以有类似Capybara的抽象层,它可以隐藏/分组许多Selenium操作。

B. 大水牛喜欢:(抽象:隐藏/分组操作)

例如,要单击一个元素,只需提供类似于click(locator)的命令即可,而不是使用原始的selenium api,其中需要找到一个元素,然后单击。许多类似的抽象存在于下面的可选库中

  • 选项1(见下文)
  • 选项2(见下文)
  • 选项3(见下文)
  • 选项4(见下文)
  • 选项5(见下文)
  • 选项6:氦(来自其他答案/评论)
  • 选项7:(见下文)
  • 选项8:(见下文)
  • 选项9:(见下文)
  • 选项10:(见下文)
  • 选项11:(见下文)
  • 选项12:(见下文)
  • 选项13:(见下文)

我的研究:目前有将近半打的选项,其中包括a.活跃的,b.成熟的和c.发展中的。

Python自带各种实用工具!!


选项-1: Selenium2Library

Github url: https://github.com/rtomac/robotframework-selenium2library

开发: 活跃

目的: robotframework的许多库之一,也可以用作您框架的“独立”库(检查下面的使用情况)。

思路:

  • 它提供了对selenium的抽象
  • 在这个库中方法的参数输入要简单得多。库提供的抽象,例如,隐藏了许多查找元素的不必要细节。要了解更多详细信息,需要理解该库。
  • 可以在没有进行任何修改的情况下使用此库,即使可能使用robot包的实用程序。(这是您进一步对该库进行实验的功课!)
  • 因此,可用作您框架的独立库。

用法:

pip安装robotframework-selenium2library

在您的ipython或idle控制台中导入并开始使用 例如:

>>from Selenium2Library import Selenium2Library
>>start_testing= Selenium2Library()
>>start_testing.create_webdriver("Firefox")
>>start_testing.go_to("http://www.google.com")
>>.
...so on

选项2: 页面对象

Github网址: https://github.com/ncbi/robotframework-pageobjects

开发: 不活跃(最新版本没有显示停止器)

目的: robotframework的库之一。在Selenium2Library上提供了一个页面对象抽象。可以作为您的框架的独立部分使用(请参阅下面的用法),也可以与robotframework一起使用。

想法:

  • 它在Selenium2Library上提供了“页面对象抽象”支持
  • 可以在robot-framework上下文之外使用此库而无需任何修改,尽管它可能使用robot包的实用程序。(进一步实验是你的家庭作业!)
  • 因此,可以作为独立库使用

用法:

pip install robotframework-pageobjects

例如:在IPython或IDLE中执行以下操作:
>>from robotpageobjects import Page
>>start_testing=Page()
>>start_testing.create_webdriver("Firefox")
>>start_testing.go_to("http://google.com")

选项-3: robotframework-pageobjectlibrary

Github网址: https://github.com/boakley/robotframework-pageobjectlibrary

开发: 活跃

希望作者支持LTS(长期支持):) ,祈求好运!!

用法:

pip install robotframework-pageobjectlibrary

想法:

  • 不可能在robot-framework上下文之外使用此库。稍微更改页面上下文处理方式将有助于在robot-framework上下文之外使用此库(这是您的家庭作业,找出如何实现!)

选项-4:Splinter

Github链接: https://github.com/cobrateam/splinter

开发状态: 活跃

Usage: splinter.readthedocs.org/en/latest/index.html

使用pip安装splinter

在ipython或idle中执行:

>>from splinter import Browser    
>>browser = Browser()
>>browser.visit('http://google.com')
>>browser.fill('q', 'splinter - python acceptance testing for web applications')
>>browser.find_by_name('btnG').click()

Option-5: SST library Github网址: https://github.com/Work4Labs/selenium-simple-test 开发情况: 功能已完善/活跃

Usage: testutils.org/sst/

pip安装 -U sst

在ipython或idle上执行:

>>> from sst.actions import *
>>> start()

    Starting Firefox
>>> go_to('http://google.com')
    Going to... http://google.com
    Waiting for get_element

选项-6: 非开源(商业性质)

选项-7: holmium.core

Github网址: https://github.com/alisaifee/holmium.core

选项-8: wtframework

Github网址: https://github.com/wiredrive/wtframework

选项-9: webium

Github网址: https://github.com/wgnet/webium

选项-10: elementium

Github网址: https://github.com/actmd/elementium

选项-11: saunter

Github网址: https://github.com/Element-34/py.saunter

用法: saunter

选项-12: webdriverplus

Github网址: https://github.com/tomchristie/webdriverplus

使用方法: webdriverplus

注释: 代码仓库已经不再维护,但是是一个不错的参考资料

选项12: Simple-Pageobject

Github链接: https://github.com/rama-bornfree/simple-pageobject/tree/master/PageObjectLibrary

注释: 最简单的页面对象封装,基于selenium2library构建。我是这个代码仓库的所有者。


测试设置:

在选项1-13中,所有的测试库都可以使用以下任何一个框架运行:Lettuce,Behave,Robotframework或其他单元测试框架(例如PyUnitNose)等等。

测试框架通常用于管理测试用例,例如:

  • 英语格式,如gherkin、关键字、表格等
  • 报告测试运行
  • 连接到CI
  • 测试用例和测试套件的设置/拆卸
  • 测试用例的标记
  • 其他任何测试框架的功能

重要的是掌握上述选项中的库的使用方法。

选项5:就SST而言,它本身具有框架的特性,例如可以生成报告等等。

因此,在SST的情况下,库和框架的定义是模糊的,这取决于您希望从该软件包中使用的功能的程度。


一些有趣的数学:

测试框架、测试库和自定义代码三者组合的总方案数 =(测试框架和测试库)*(框架和库之间的自定义代码):

7 * 13 = 91 种方式

选择最适合自己需求的测试框架和测试库的最佳组合!!

我个人会选择 Robot-framework 加上 Selenium2Library 或 Robot-framework 加上某个页面对象库。

当然,我在我的帖子中对 Robot-framework 和 Selenium2Library 持积极的偏见。


起初,我对这个答案进行了反对投票,因为列出的库似乎都没有很好地抽象化与英语接近。然而,我重新阅读了我的问题,并意识到它在这一点上并不像它本可以那样清晰明了,由于所有这些库在某种程度上都更接近英语地抽象事物,它们实际上是“类似Capybara”的。我已经编辑了我的问题以使其更加清晰,如果您编辑了这个答案,我将很乐意改变我的投票(在那之前SO不会让我更改)。 - machineghost
当然,我会编辑我的答案,如果您觉得我已经尽力做到精准和有帮助,感谢您的赞同。 - Steve Harrison
库通过提供抽象化,使编码更加简洁、专注,并在下面提供各种选择。我不同意这个陈述,因为它似乎暗示库的抽象接近英语。 - Steve Harrison
只有位于库层之上的工具,才能提供接近英语的测试用例。 - Steve Harrison

14

虽然 OP 发现了 Python Cucumber 的替代品,但是吸引我来到这里的是问题标题:Python 的 Capybara 替代品。尽管 Cucumber 使用 Capybara,但是 Cucumber 本身是一种完全不同的“解决方案”,仅仅与 Capybara 有点关联。

如果你正在寻找类似 Capybara 的东西,而不想处理 Cucumber,那么可以看看 splinter。我不知道问题发布时的情况,但是现在 Splinter 基于 Selenium 构建,并支持其他引擎(Webkit、PhantomJS、zope.browsertest 等),同时支持可视化和无头测试。


1
我已经编辑了我的问题的标题和内容,以尝试更清晰地表达。我的原始目标(标题没有完全传达)是寻找类似于Cucumber的库,但由于我不确定是否存在这样的库,我也对类似于Capybara的库感到好奇。因此,包含类似于Cucumber或Capybara的库的答案都是相关的;谢谢。 - machineghost

9

Robot Framework怎么样?它非常棒。而且使用Selenium2Library,它可以与SE2很好地配合使用。http://robotframework.org/


9

3
Brandon Rhodes在Dropbox做了一个有关使用capybara进行验收测试的演示:幻灯片视频。显然,是Dropbox的一名工程师制作了capybara的Python端口。 - ccpizza

7

3

这位提问者要求Python实现Cucumber或Capybara,但正如Jim Stewart在他的回答中指出的那样,Cucumber和Capybara是非常不同的东西。由于问题的标题是关于Capybara的,所以我会回答这个。

我是一款商业Selenium封装库Helium的开发人员之一。像Capybara一样,它为Web自动化提供了非常高级的API。例如,下面是一个更新Facebook状态的脚本:

from helium.api import *
start_chrome("facebook.com")
write(your_fb_email, into="Email or Phone")
write(your_fb_password, into="Password")
click("Log In")
write("Test", into="Update Status")
click("Post")

可以自由地混合使用Helium和Selenium。例如,我们可以通过以下方式扩展上面的脚本:

# get_driver() returns the WebDriver created by start_chrome() above.
chrome = get_driver()
chrome.find_element_by_id('btnG').click()

它们非常不同,但也有内在联系(没有Capybara就不能有Cucumber)。我试图在我的原始答案中明确表明我正在寻找类似于Cucumber的东西,但由于我不确定甚至是否存在这样的东西,我也想了解类似于Capybara的库。我已经编辑了我的答案,试图让这一点更清楚。 - machineghost

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接