通過之前的2篇文章,大家都了解了如果利用behave和selenium打開網頁和進行基本的操作,但是這些對於項目來說,卻是往往不夠的。
如果對junit或者TestNG熟悉的人都知道有@Before Class等這些在腳本之前完成的任務:如用戶登入,以及當瀏覽器操作完,關閉瀏覽器等一些操作。那么問題來了,在behave里面是怎么控制的呢?
在behave中有個environment.py文件,environment.py文件可以很好的解決這個問題,除了解決這個問題,還可以用來解決同一條case可以在不同的瀏覽器運行的問題。
environment.py文件的介紹
environment.py文件定義了一些當測試腳本在run的過程中之前和之后完成的任務:
before_step(context, step), after_step(context, step)
在這里面的腳本會在每一個步驟之前,之后執行
before_scenario(context, scenario), after_scenario(context, scenario)
在這里面的腳本會在每一個場景之前,之后執行
before_feature(context, feature), after_feature(context, feature)
在這里面的腳本會在每一個feature之前,之后執行
before_tag(context, tag), after_feature(context, tag)
在腳本里面可以設置tag(這個之后會介紹),這里面的腳本會在含有tag的模塊里面之前,之后執行
before_all(context), after_all(context)
這里面的腳本會在整個腳本開始之前,之后執行 ----- 一般會在這里面添加一些setup的腳本,例如啟動瀏覽器,設置一些變量,連接數據庫,關閉瀏覽器,關閉數據庫 等等
那我們接下來來介紹一個簡單的例子:
一、還是老規矩在feature文件夾里面新建example03文件夾,然后再新建example03.feature文件,除了這個文件之外,還需要新建environment.py文件:
from selenium import webdriver
import sys
def before_all(context):
reload(sys)
sys.setdefaultencoding('utf-8')
context.driver = webdriver.Firefox()
def after_tag(context, tag):
context.browser.close()
二、example03.feature文件的內容如下:
#../feature/example03/example03.feature
Feature:Search behave results in baidu
Scenario: Search behave results in baidu
Given Access baidu website
When Input behave characters
Then There are more than 1 results displaying
三、在example03文件夾里面新建steps文件夾,然后在steps文件夾里面新建example03.py文件:
# This Python file uses the following encoding: utf-8
#../feature/example03/steps/example03.py
from selenium import webdriver
import time
@Given('Access baidu website')
def step_impl(context):
context.driver.get("http://www.baidu.com")
@when('Input behave characters')
def step_impl(context):
context.ele_input = context.driver.find_element_by_xpath("//input[@id = 'kw']")
context.ele_input.send_keys("behave")
context.ele_btn = context.driver.find_element_by_xpath("//input[@id = 'su']")
context.ele_btn.click()
time.sleep(10)
@Then('There are more than 1 results displaying')
def step_impl(context):
context.ele_results = context.driver.find_element_by_css_selector("div.nums")
context.expected_results = '相關結果'
if context.expected_results in context.ele_results.text:
assert True
else:
assert False
這一章簡單介紹environment.py文件的作用,這個文件的作用非常強大。
問題:
在我的腳本里面有個不好的地方是 time.sleep(10), 這個地方就是讓線程停止10s. 其實這里應該的做法是寫一個顯示等待的腳本。 如下:
context.ele_results = WebDriverWait(context.driver, 60).until(
EC.presence_of_element_located((By.CSS_SELECTOR, "div.nums")))
如果出一些錯誤,那是因為你沒有把包給加進去的原因, 把下面的代碼加到程序的開頭部分,就可以了。
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.common.by import By
