当我将一段代码移动到另一个文件时,我无法使用方法。
下面提到的代码工作原因导致所有代码都在一个文件中。
require 'rubygems'
require 'watir'
require 'win32ole'
require 'erb'
require 'ostruct'
require 'C:/classes/html.class'
require 'C:/classes/Xls'
require 'C:/classes/screen_capture'
require 'C:/classes/RequiredRubies'
include Watir
begin
xlFile = XLS.new(Dir.pwd + '/testdata.xls')
myData = xlFile.getRowRecords('a2:z3','Pit')
xlFile.close
myData.each do |record|
@ie = IE.new
@ie.maximize
@ie.goto (record['Url'])
@ie.focus
end
end
在上面的代码中,“URL”出现在excel表名称testdata.xls中。上面的代码工作得很好。让我们说这个文件名是file1.rb
但我想将浏览器的开放移动到不同的文件中,这样我就不会在所有测试文件中使用此代码,只在一个文件中使用它,并从中调用所有其他测试。以下是我所做的更改,但这不起作用。
在File1.rb中,我保留了
所有必需文件+新文件,其中我提到了打开浏览器的公共代码
require 'C:/function.rb
include Watir
include Commonfunctions
begin
xlFile = XLS.new(Dir.pwd + '/testdata.xls')
myData = xlFile.getRowRecords('a2:z3','Pit')
xlFile.close
myData.each do |record|
openie = openbrowser
end
end
我已经创建了一个用于打开浏览器的文件,我想将其用作常用功能。让我们在function.rb
中说出这个文件名所有必需文件+以下代码
include Watir
module Commonfunctions
def openbrowser
@ie = IE.new
@ie.maximize
@ie.goto (record['Url'])
@ie.focus
end
end
现在,当我运行file1.rb时,我收到以下错误
C:/function.rb:17:in `openbrowser': undefined local variable or method `reco
rd' for main:Object (NameError)
from test.rb:23:in `block in <main>'
from test.rb:21:in `each'
from test.rb:21:in `<main>'
'record'对象来自不同的文件,这是我的数据驱动器。在该文件中,这是存在方法记录的代码
numRecords = myRange.Rows.Count
(0..numRecords-1).each do |i|
record=[]
areas.each do |area|
record.concat(area[i])
end
#Clean up formatting
record.collect! do |x|
if x.is_a?(Float) and x % 1 == 0
x.to_i.to_s
else
x.to_s.strip
end
end
data << record
end
return data
end
任何人都可以帮我解决这个问题。我想将所有常用函数移动到一个文件中,并在所有测试中使用这些函数,而不是在所有测试中编写相同的函数。
答案 0 :(得分:1)
record
是一个词法范围的变量,在块的args中定义,从myData.each do |record|
开始。由于它是词法范围的,因此它不能在声明的上下文之外通过名称引用,因此您必须将它传递给您明确指出的方法。
myData.each do |record|
openie = openbrowser record # pass it here
end
# and in the other file
def openbrowser record
@ie = IE.new
@ie.maximize
@ie.goto (record['Url'])
@ie.focus
end
顺便说一句,在你的问题中,你说明了&#34;&#39;记录&#39;对象来自不同的文件&#34;。事实并非如此,因为我已经指出了问题背景中record
的位置。你在这里感到困惑是因为你使用了不好的通用名称,而没有编写范围有限的小块代码。
我感谢您正在努力重构以改进代码组织。你的代码示例还有很多值得关注的东西:一些样式(camelCaseNames,随机缩进),一些结构(没有OO,命令式文件脚本),一些句法陷阱(方法名称和args的第一个空格之间的空格),一些成语(可枚举方法的命令不佳)。您可以通过使用经验丰富的ruby程序员遍历代码并在代码审查中寻求指导来获益。