Ruby:如何使用常量名而不是其值

时间:2016-12-28 12:35:10

标签: ruby selenium cucumber capybara

我是使用Ruby自动化测试的新手(与Selenium结合使用),并且在我的test_steps.rb中努力使用常量的名称而不是它的值。

我使用下面的3个文件:

LoginPage.rb

class LoginPage < Base

  FIELDS = {
    'Username' => '//form[@id="login"]//input[@name="j_username"]',
  }

Base.rb

def fill_field(field, value)
  find(:xpath, field, wait: 15).set(value)
  #logger("Filling field with xpath '" + field + "' with value '" +
             value + "'.") > this works fine but prints the xpath

  p "field: " + field
  log = field.scan(/\w+(?:'\w+)*/).last
  logger("Filling field '" + log + "' with value '" + value + "'.")

test_steps.rb:

And(/^logs in as user "([^"]*)"$/) do |userName|
  $login_name = search_excel('testdata/accounts.xlsx', userName, 1)
  @pg.fill_field(LoginPage::FIELDS['Username'], $login_name)

执行场景时,我在命令提示符中看到了这一点:

Given a user is on the oCRM login page # features/step_definitions/test_steps.rb:13
"field: //form[@id=\"login\"]//input[@name=\"j_username\"]"
28/12/2016 13:03:50 Filling field 'j_username' with value 'D0X02703'.

请注意Base.rb中的行打印常量匹配&#34;字段&#34;的值。

'//form[@id="login"]//input[@name="j_username"]'

我希望打印常量本身:"LoginPage::FIELDS['Username']"。目标是在我的日志记录中打印它:

"Filling field 'Username' with value 'DOX02703'."

我已尝试打印"field.name""field.value"并玩local_variables,但尚未成功。非常欢迎帮助!

另外尝试使用下面的定义但是当然它不会获取常量值并寻找xpath "LoginPage::FIELDS['Username']"

  def fill_fields(page, type, field, value)
            find(:xpath, page + "::" + type + "['" + field + "']", wait: 15).set(value)

4 个答案:

答案 0 :(得分:1)

常量不是Ruby中的对象。因为你只能将对象作为参数传递,并且只能在对象上调用方法(并且对象是唯一的值,而方法调用是唯一的做法),所以根本不可能将常量作为参数传递或者询问它因为它的名字。

答案 1 :(得分:0)

您可以使用带const_get的字符串:

class LoginPage # <Base
  FIELDS = {
    'Username' => '//form[@id="login"]//input[@name="j_username"]',
  }
end

def get_constant_from_string(param)
  puts "Parameter is #{param}"
  Object.const_get(param) if param.is_a?(String)
end

get_constant_from_string(LoginPage::FIELDS)
# Parameter is {"Username"=>"//form[@id=\"login\"]//input[@name=\"j_username\"]"}
# method returns nil

puts get_constant_from_string("LoginPage::FIELDS")['Username']
# Parameter is LoginPage::FIELDS
# //form[@id="login"]//input[@name="j_username"]

答案 2 :(得分:0)

基本上,调用

之间没有区别
@pg.fill_field(LoginPage::FIELDS['Username'], $login_name)

username = LoginPage::FIELDS['Username']
@pg.fill_field(username, $login_name)

它只是第一个没有提到临时变量。无论哪种方式,唯一传递给该方法的是与用户名&#39;相关联的值。哈希中的键。看看你的班级结构,看起来你有很多“Page&Page;继承自base的类,并且您期望fill_field使用继承它的类中的FIELDS常量。在那种情况下,你可能想要

def fill_field(field, value)
  find(:xpath, self.class::FIELDS[field], wait: 15).set(value)

  logger("Filling field '" + field + "' with value '" + value + "'.")
end

并将其称为

@pg.fill_field('Username', $login_name)

答案 3 :(得分:0)

基于Thomas Walpole评论的工作解决方案:

Private Sub PbClose_Click(sender As Object, e As EventArgs) Handles PbClose.Click BtnCancel.PerformClick() DGV_Root.DefaultCellStyle.SelectionBackColor = df1 DGV_Root.DefaultCellStyle.BackColor = df2 DGV_Root.DefaultCellStyle.SelectionForeColor = df3 DGV_Root.DefaultCellStyle.ForeColor = df4 Me.Close() End Sub

Base.rb

def find_field(field) @fieldToFill = find(:xpath, self.class::FIELDS[field], wait: 15) end def set_value(value) @fieldToFill.set(value) end def fill_field_log(field, value) logger("Filling field '" + field + "' with value '" + value + "'.") end

LoginPage.rb

def fill_field(field, value) find_field(field) set_value(value) fill_field_log(field, value) end

test_steps.rb