跳转到主要内容

Selenium webdriver 步骤库,用于behave BDD测试

项目描述

behave-webdriver

behave-webdriver 是一个步骤库,旨在允许用户使用 behave BDD 测试框架轻松编写 selenium webdriver 测试。灵感来源于 webdriverio/cucumber-boilerplate 项目。

docs status version pyversions coverage

有关更多详细信息,请参阅 behave-webdriver 文档

https://raw.githubusercontent.com/spyoungtech/behave-webdriver/master/docs/_static/behave-webdriver.gif

安装

通过 pip 安装非常简单。安装将需要 behaveselenium

pip install behave-webdriver

使用 web 驱动程序

Selenium 要求您提供您想要使用的 webdriver 的可执行文件。此外,除非您明确指定二进制文件的路径,否则 selenium 假设此可执行文件位于 PATH 中。有关更多详细信息,请参阅这些 驱动程序安装说明

用法

使用此库和 behave 的基本步骤如下

  1. 编写您的功能文件

  2. 导入步骤实现

  3. 在您的 environment.py 文件中,将 behave_driver 属性设置为 behave context

  4. 运行 behave

编写功能文件

# my-minimal-project/features/myFeature.feature
Feature: Sample Snippets test
As a developer
I should be able to use given text snippets

Scenario: open URL
    Given the page url is not "http://webdriverjs.christian-bromann.com/"
    And   I open the url "http://webdriverjs.christian-bromann.com/"
    Then  I expect that the url is "http://webdriverjs.christian-bromann.com/"
    And   I expect that the url is not "http://google.com"


Scenario: click on link
    Given the title is not "two"
    And   I open the url "http://webdriverjs.christian-bromann.com/"
    When  I click on the link "two"
    Then  I expect that the title is "two"

导入步骤实现

为了使您的功能文件步骤与我们的步骤实现匹配,behave 需要能在您的项目中找到它们。这就像将我们的步骤定义导入到您自己的步骤实现文件中一样简单。

# features/steps/webdriver_example.py
from behave_webdriver.steps import *

有关步骤实现的更多信息,请参阅behave教程。

在环境中设置behave_driver

我们的步骤实现专门查看behave上下文中的behave_driver属性,以运行您的测试。为此,您必须在您的environment.py文件中提供此属性。

# features/environment.py
import behave_webdriver

def before_all(context):
    context.behave_driver = behave_webdriver.Chrome()

def after_all(context):
    # cleanup after tests run
    context.behave_driver.quit()

behave-webdriver提供的webdriver类继承自selenium的webdriver类,因此它们将接受selenium接受的相同位置和关键字参数。

一些webdriver,如Chrome,提供特殊的方法,例如Chrome.headless,用于以无头模式实例化Chrome。这在无头测试环境中非常有用。

def before_all(context):
    context.behave_driver = behave_webdriver.Chrome.headless()

使用fixture

新增于0.1.1

您还可以使用fixture来设置您的驱动程序,例如,使用Firefox与我们的fixture一起使用

from behave_webdriver.fixtures import fixture_browser
def before_all(context):
    use_fixture(fixture_browser, context, webdriver='Firefox')

这将确保在相应的清理点拆毁浏览器。

运行behave

然后像任何其他behave测试一样运行测试

behave

您应该会看到以下输出

Feature: Sample Snippets test # features/myFeature.feature:2
  As a developer
  I should be able to use given text snippets
  Scenario: open URL                                                          # features/myFeature.feature:6
    Given the page url is not "http://webdriverjs.christian-bromann.com/"     # ../../behave_webdriver/steps/given.py:136 0.012s
    And I open the url "http://webdriverjs.christian-bromann.com/"            # ../../behave_webdriver/steps/given.py:10 1.414s
    Then I expect that the url is "http://webdriverjs.christian-bromann.com/" # ../../behave_webdriver/steps/then.py:102 0.007s
    And I expect that the url is not "http://google.com"                      # ../../behave_webdriver/steps/then.py:102 0.007s

  Scenario: click on link                                          # features/myFeature.feature:13
    Given the title is not "two"                                   # ../../behave_webdriver/steps/given.py:81 0.006s
    And I open the url "http://webdriverjs.christian-bromann.com/" # ../../behave_webdriver/steps/given.py:10 0.224s
    When I click on the link "two"                                 # ../../behave_webdriver/steps/when.py:21 0.622s
    Then I expect that the title is "two"                          # ../../behave_webdriver/steps/then.py:10 0.006s

1 feature passed, 0 failed, 0 skipped
2 scenarios passed, 0 failed, 0 skipped
8 steps passed, 0 failed, 0 skipped, 0 undefined
Took 0m2.298s

高级用法;扩展behave-webdriver

behave-webdriver的设计考虑到了的需求。您可以自由扩展我们的webdriver类以适应您的独特需求。您可以子类化我们的webdriver类,使用自定义selenium webdriver,编写自己的mixin,或使用其他人提供的selenium mixin。

示例:selenium-requests

selenium-requests是一个现有的项目,它将流行的requests库的功能添加到selenium。与behave-webdriver一起使用非常简单。以下示例和其他示例可在存储库的examples目录中找到,并在完整文档中提供。

# examples/selenium-requests/features/environment.py
from selenium import webdriver # or any custom webdriver
from behave_webdriver.driver import BehaveDriverMixin
from seleniumrequests import RequestMixin # or your own mixin

class BehaveRequestDriver(BehaveDriverMixin, RequestMixin, webdriver.Chrome):
    pass

def before_all(context):
    context.behave_driver = BehaveRequestDriver()
# examples/selenium-requests/features/steps/selenium_steps.py
from behave import *
from behave_webdriver.steps import *
from urllib.parse import urljoin

@given('I send a {method} request to the page "{page}"')
def send_request_page(context, method, page):
    url = urljoin(context.base_url, page)
    context.response = context.behave_driver.request(method, url)

@then('I expect the response text contains "{text}"')
def check_response_text_contains(context, text):
    assert text in context.response.text
# examples/selenium-requests/features/selenium-requests.feature
Feature: Using selenium-requests
  As a developer
  I should be able to extend behave-webdriver with selenium-requests

  Scenario: use selenium-requests with behave-webdriver
    # use a behave-webdriver step
    Given the base url is "http://127.0.0.1:8000"
    # use your own steps using selenium-requests features
    Given I send a GET request to the page "/"
    Then I expect the response text contains "<h1>DEMO APP</h1>"

假设您位于存储库根目录(并且已运行演示应用程序),只需像其他项目一样运行behave

结果✨

(behave-webdriver) $ behave examples/selenium-requests/features

DevTools listening on ws://127.0.0.1:12646/devtools/browser/1fe75b44-1c74-49fa-8e77-36c54d50cd24
Feature: Using selenium-requests # examples/selenium-requests/features/requests.feature:1
  As a developer
  I should be able to extend behave-webdriver with selenium-requests
  Scenario: use selenium-requests with behave-webdriver          # examples/selenium-requests/features/requests.feature:6
    Given the base url is "http://127.0.0.1:8000"                # behave_webdriver/steps/actions.py:162
    Given I send a GET request to the page "/"                   # examples/selenium-requests/features/steps/selenium_steps.py:11
    Then I expect the response text contains "<h1>DEMO APP</h1>" # examples/selenium-requests/features/steps/selenium_steps.py:17

1 feature passed, 0 failed, 0 skipped
1 scenario passed, 0 failed, 0 skipped
3 steps passed, 0 failed, 0 skipped, 0 undefined
Took 0m1.385s

获取帮助⛑

如果您有任何未回答的问题或遇到任何问题,请随时提出问题。我们认识到测试人员来自各种形状、大小和背景。我们欢迎使用此库时出现的任何问题。

贡献

我们非常欢迎贡献!如果您有想法或建议,请提出问题或提交PR。

步骤定义列表📝

我们支持webdriverio/cucumber-boilerplate支持的所有步骤。我们还支持一些额外的功能,并计划添加更多步骤定义。

Given步骤👷

  • 我打开网站 "([^"]*)?"

  • 我打开url "([^"]*)?"

  • 我有一个大小为 ([\d]+) x ([\d]+) 像素的屏幕

  • 我有一个 ([\d]+) 像素的屏幕(宽|高)

  • 我除了第一个(窗口|标签页)外都关闭了

  • 我暂停 (\d+)*ms

  • 一个(alertbox|confirmbox|prompt)(不)打开了

  • 基本url是 "([^"]*)?"

  • 复选框 "([^"]*)?"(不)被选中

  • cookie "([^"]*)?"包含(不)值 "([^"]*)?"

  • cookie "([^"]*)?"(不)存在

  • 元素 "([^"]*)?"包含(不)与元素 "([^"]*)?"相同的文本

  • 元素 "([^"]*)?"是(不)([\d]+)px(宽|高)

  • 元素 "([^"]*)?"是(不)空的

  • 元素 "([^"]*)?"是(不)启用的

  • 元素 "([^"]*)?"是(不)在(x|y)轴上的 ([\d]+)px 位置

  • 元素 "([^"]*)?"是(不)选中的

  • 元素 "([^"]*)?"是(不)可见的

  • 该元素 "([^"]*)?"(不)* 包含任何文本

  • 该元素 "([^"]*)?"(不)* 包含文本 "([^"]*)?"

  • 该元素 "([^"]*)?"(不)* 与文本 "([^"]*)?" 匹配

  • 页面URL是(不是)* "([^"]*)?"

  • 标题是(不是)* "([^"]*)?"

  • (CSS)* 属性 "([^"]*)?" 来自元素 "([^"]*)?" 是(不是)* "([^"]*)?"

  • 页面上有(一个|没有)元素 "([^"]*)?"

当步骤▶️

  • 我打开网站 "([^"]*)?"

  • 我打开url "([^"]*)?"

  • 我接受(警告框|确认框|提示框)

  • 我将"{value}"添加到输入框"{element}"

  • 我清空输入框"{element}"

  • 我点击按钮"{element}"

  • 我点击元素"{element}"

  • 我点击链接"{link_text}"

  • 我关闭最后打开的(标签页|窗口)

  • 我删除cookie "{cookie_key}"

  • 我关闭(警告框|确认框|提示框)

  • 我双击元素"{element}"

  • 我将元素"{from_element}"拖动到元素"{to_element}"

  • 我将 "([^"]*)?" 输入到(警告框|确认框|提示框)

  • 我聚焦到最后打开的(标签页|窗口)

  • 我将光标移动到元素"{element}",偏移量为 {x_offset:d},{y_offset:d}

  • 我将光标移动到元素"{element}"

  • 我暂停 {milliseconds:d}ms

  • 我按下 "{key}"

  • 我滚动到元素 "{element}"

  • 我选择元素 "([^"]*)?" 的(文本|值|名称) "([^"]*)?"

  • 我选择元素 "{element}" 的第{n}个选项

  • 我将 "{value}" 设置到输入框 "{element}"

  • 我设置cookie "{cookie_key}",内容为 "{value}"

  • 我提交表单 "{element}"

然后步骤✔️

  • 我期望屏幕是 ([\d]+) 宽,([\d]+) 高像素

  • 我期望新打开了一个(窗口|标签页)

  • 我期望一个(警告框|确认框|提示框)是(不是)*打开的

  • 我期望一个(警告框|确认框|提示框)(不是)*包含文本 "([^"]*)?"

  • 我期望复选框 "([^"]*)?" 是(不是)*选中的

  • 我期望cookie "([^"]*)?"(不是)*包含"([^"]*)?"

  • 我期望cookie "([^"]*)?"(不是)*存在

  • 我期望元素 "([^"]*)?" (有|没有) 类 "([^"]*)?"

  • 我期望元素 "([^"]*)?" (不是)*可见

  • 我期望元素 "([^"]*)?" (不是)*存在

  • 我期望元素 "([^"]*)?" (不是)*宽 ([\d]+)px (宽|高)

  • 我期望元素 "([^"]*)?" (不是)*为空

  • 我期望元素 "([^"]*)?" (不是)*启用

  • 我期望元素 "([^"]*)?" (不是)*聚焦

  • 我期望元素 "([^"]*)?" (不是)*位于 ([\d]+)px 在(x|y)轴上

  • 我期望元素 "([^"]*)?" (不是)*被选中

  • 我期望元素 "([^"]*)?" (不是)*可见

  • 我期望元素 "([^"]*)?" (不是)*在视口中

  • 我期望元素 "([^"]*)?" (不是)*包含任何文本

  • 我期望元素 "([^"]*)?" (不是)*包含与元素 "([^"]*)?" 相同的文本

  • 我期望元素 "([^"]*)?" (不是)*包含文本 "([^"]*)?"

  • 我期望元素 "([^"]*)?" (不是)*匹配文本 "([^"]*)?"

  • 我期望路径是(不是)* "([^"]*)?"

  • 我期望标题是(不是)* "([^"]*)?"

  • 我期望URL是(不是)* "([^"]*)?"

  • 我期望(属性)* "([^"]*)?" 来自元素 "([^"]*)?" 是(不是)* "([^"]*)?"

  • 我期望在新的(标签页|窗口)中打开URL "([^"]*)?"

  • 我期望URL(不)包含 "([^"]*)?"

  • 我等待元素 "([^"]*)?"(?:等待 (\d+)ms)*(?:(不)*(被检查|被启用|被选中|可见|包含文本|包含一个 值|存在))*

致谢 ❤️

特别感谢.webdriverio/cucumber-boilerplate项目的作者和贡献者

特别感谢behave项目的作者和贡献者

项目详情


下载文件

下载适合您平台文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码发行版

behave-webdriver-0.3.1.tar.gz (25.0 kB 查看散列)

上传时间 源代码

构建发行版

behave_webdriver-0.3.1-py2.py3-none-any.whl (23.7 kB 查看散列)

上传时间 Python 2 Python 3

支持者