Ruby: 如何使用常量名代替它的值
Ruby: how to use constant name instead of its value
我不熟悉使用 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
中的行打印常量匹配的值 "field"
'//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)
常量不是 Ruby 中的对象。由于您只能将对象作为参数传递,并且只能调用对象的方法(对象是唯一的值,方法调用是做某事的唯一方法),所以根本不可能将常量作为参数传递或询问它因为它的名字。
您可以做的唯一一件事就是将常量的名称作为参数传递,而不是或除了对象常数指向.
您可以将字符串与 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"]
本质上和调用没有区别
@pg.fill_field(LoginPage::FIELDS['Username'], $login_name)
和
username = LoginPage::FIELDS['Username']
@pg.fill_field(username, $login_name)
只是第一个没有提到临时变量。无论哪种方式,唯一传递给该方法的是与散列中的 'Username' 键关联的值。查看您的 class 结构,您似乎有许多 'Page' class 继承自 base,并且您期望 fill_field 使用来自class 继承了它。在那种情况下你可能想要
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)
基于 Thomas Walpole 评论的工作解决方案:
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
:
Given(/^a user is on the login page$/) do
@pg = Base.new
@lp = LoginPage.new
@pg.visit_loginpage
end
And(/^logs in as user "([^"]*)"$/) do |userName|
$login_name = search_excel('testdata/accounts.xlsx', userName, 1)
login_password = search_excel('testdata/accounts.xlsx', userName, 2)
@lp.fill_field('Username', $login_name)
@lp.fill_field('Password', login_password)
我不熟悉使用 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
中的行打印常量匹配的值 "field"
'//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)
常量不是 Ruby 中的对象。由于您只能将对象作为参数传递,并且只能调用对象的方法(对象是唯一的值,方法调用是做某事的唯一方法),所以根本不可能将常量作为参数传递或询问它因为它的名字。
您可以做的唯一一件事就是将常量的名称作为参数传递,而不是或除了对象常数指向.
您可以将字符串与 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"]
本质上和调用没有区别
@pg.fill_field(LoginPage::FIELDS['Username'], $login_name)
和
username = LoginPage::FIELDS['Username']
@pg.fill_field(username, $login_name)
只是第一个没有提到临时变量。无论哪种方式,唯一传递给该方法的是与散列中的 'Username' 键关联的值。查看您的 class 结构,您似乎有许多 'Page' class 继承自 base,并且您期望 fill_field 使用来自class 继承了它。在那种情况下你可能想要
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)
基于 Thomas Walpole 评论的工作解决方案:
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
:
Given(/^a user is on the login page$/) do
@pg = Base.new
@lp = LoginPage.new
@pg.visit_loginpage
end
And(/^logs in as user "([^"]*)"$/) do |userName|
$login_name = search_excel('testdata/accounts.xlsx', userName, 1)
login_password = search_excel('testdata/accounts.xlsx', userName, 2)
@lp.fill_field('Username', $login_name)
@lp.fill_field('Password', login_password)