(Ruby) 无法在黄瓜测试中使用 selenium 命令?
(Ruby) Cannot use selenium commands in cucumber tests?
我正在尝试将对象定义保存在 "home page" 文件中,并在需要时调用这些方法 button/link/image/etc。但出于某种原因,selenium 命令会显示 NoMethodError
。当我在终端的功能文件夹中简单地 运行 cucumber
命令时,我得到这些错误:
When I click on Site Management # features/step_definitions/steps.rb:17
undefined method `find_element' for nil:NilClass (NoMethodError)
./features/lib/pages/home.rb:3:in `siteMgmt'
./features/step_definitions/steps.rb:18:in `/^I click on Site Management$/'
features/test.feature:6:in `When I click on Site Management'
所以换句话说,它试图 "click on site management," 代码移动到主页 class,SiteMgmt 方法(太棒了!)然后在尝试 运行 selenium 时失败find_method
方法。我想我可能必须在 home.rb
的顶部添加一个 require selenium-webdriver
,但是 a) 在 steps.rb
中不是这种情况,即使我添加它,它也不起作用。
文件夹结构如下:
features/
--test.feature
lib/
pages/
--home.rb
step_definitions/
--steps.rb
support/
--env.rb
env.rb
require 'selenium-webdriver'
Dir[File.dirname(__FILE__) + "/../lib/pages/*.rb"].each {|file| require file }
Before do |scenario|
@driver = Selenium::WebDriver.for :chrome
@url = "URL goes here"
end
After do |scenario|
@driver.quit
end
test.feature
Feature: Proof of Concept
Stack overflow help!
Scenario:
Given I am logged into the site
When I click on Site Management
Then the Site Management page should load
steps.rb
Given(/^I am logged into AMP$/) do
@driver.get @amp_url
end
When(/^I click on Site Management$/) do
link = Home.new.siteMgmt
link.click
end
Then(/^the Site Management page should load$/) do
# assert here
end
home.rb
class Home
def siteMgmt
elem = @driver.find_element(:xpath, '//*[@id="body"]/section[2]/ul/li[1]/h3/a')
return elem
end
end
感谢您的帮助!
在 Before
块中创建的 @driver
实例变量不可用于实例化的 Home
对象。您可以向 site_mgmt
方法添加一个参数并将 @driver
实例变量传入。这是一个人为的示例:
class Home
def site_mgmt(driver)
elem = driver.find_element(:id, "logo")
end
end
require 'selenium-webdriver'
@driver = Selenium::WebDriver.for :chrome
@driver.navigate.to "http://www.iana.org/domains/reserved"
link = Home.new.site_mgmt(@driver)
link.click
注意事项:1) ruby 中的变量是 snake_case 的(即 site_mgmt
而不是 siteMgmt
;以及 2)return elem
in site_mgmt
不需要,因为 ruby 方法隐式 return.
好吧,事实证明我所要做的就是将@driver 转换为$driver。我还在学习 Ruby 并没有意识到其中的区别。
我正在尝试将对象定义保存在 "home page" 文件中,并在需要时调用这些方法 button/link/image/etc。但出于某种原因,selenium 命令会显示 NoMethodError
。当我在终端的功能文件夹中简单地 运行 cucumber
命令时,我得到这些错误:
When I click on Site Management # features/step_definitions/steps.rb:17
undefined method `find_element' for nil:NilClass (NoMethodError)
./features/lib/pages/home.rb:3:in `siteMgmt'
./features/step_definitions/steps.rb:18:in `/^I click on Site Management$/'
features/test.feature:6:in `When I click on Site Management'
所以换句话说,它试图 "click on site management," 代码移动到主页 class,SiteMgmt 方法(太棒了!)然后在尝试 运行 selenium 时失败find_method
方法。我想我可能必须在 home.rb
的顶部添加一个 require selenium-webdriver
,但是 a) 在 steps.rb
中不是这种情况,即使我添加它,它也不起作用。
文件夹结构如下:
features/
--test.feature
lib/
pages/
--home.rb
step_definitions/
--steps.rb
support/
--env.rb
env.rb
require 'selenium-webdriver'
Dir[File.dirname(__FILE__) + "/../lib/pages/*.rb"].each {|file| require file }
Before do |scenario|
@driver = Selenium::WebDriver.for :chrome
@url = "URL goes here"
end
After do |scenario|
@driver.quit
end
test.feature
Feature: Proof of Concept
Stack overflow help!
Scenario:
Given I am logged into the site
When I click on Site Management
Then the Site Management page should load
steps.rb
Given(/^I am logged into AMP$/) do
@driver.get @amp_url
end
When(/^I click on Site Management$/) do
link = Home.new.siteMgmt
link.click
end
Then(/^the Site Management page should load$/) do
# assert here
end
home.rb
class Home
def siteMgmt
elem = @driver.find_element(:xpath, '//*[@id="body"]/section[2]/ul/li[1]/h3/a')
return elem
end
end
感谢您的帮助!
在 Before
块中创建的 @driver
实例变量不可用于实例化的 Home
对象。您可以向 site_mgmt
方法添加一个参数并将 @driver
实例变量传入。这是一个人为的示例:
class Home
def site_mgmt(driver)
elem = driver.find_element(:id, "logo")
end
end
require 'selenium-webdriver'
@driver = Selenium::WebDriver.for :chrome
@driver.navigate.to "http://www.iana.org/domains/reserved"
link = Home.new.site_mgmt(@driver)
link.click
注意事项:1) ruby 中的变量是 snake_case 的(即 site_mgmt
而不是 siteMgmt
;以及 2)return elem
in site_mgmt
不需要,因为 ruby 方法隐式 return.
好吧,事实证明我所要做的就是将@driver 转换为$driver。我还在学习 Ruby 并没有意识到其中的区别。