(Ruby)在黄瓜测试中不能使用selenium命令吗?

时间:2016-05-19 16:26:43

标签: ruby selenium cucumber

我正在尝试将对象定义保存在"主页"文件,只要我需要使用该按钮/链接/图像/等,只需调用这些方法。但由于某些原因,selenium命令正在提出NoMethodError。当我在终端上的features文件夹中运行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'

换句话说,它正试图点击网站管理,"代码移动到Home类,SiteMgmt方法(太棒了!)然后在尝试运行selenium find_method方法时失败。我想我可能需要在require selenium-webdriver的顶部添加home.rb,但a)steps.rb中的情况并非如此,即使我添加它,它也不会#39; t work。

这是文件夹结构:

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

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

@driver块中创建的Before实例变量不可用于实例化的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' d(即site_mgmt而不是siteMgmt;以及return elem中的site_mgmt isn&# 39; t需要因为ruby方法隐含地返回。

答案 1 :(得分:-1)

嗯,事实证明我所要做的就是将@driver转为$ driver。我还在学习Ruby,并没有意识到差异。