2014-10-30 69 views
1

我有一个包含有效和无效登录组合的电子表格。我使用Ruby在Selenium中编写了测试,将用户名和密码传递到我测试网站中的文本字段。Ruby无法从excel文件中输入文本字段

它不输入用户名和密码。事实上,测试似乎停留在一个连续的循环中,并没有结束,而它仍然集中在登录窗口。

下面是我在遇到问题的代码片段:

require "win32ole" 

xl = WIN32OLE.new('Excel.Application') 
xl.Visible = true 
xl.displayAlerts = false 
wb = xl.Workbooks.open("C:/.../login.xlsx") 
ws = wb.Worksheets(1) 
ws.select 

rows = 2 
while rows <= 3 
    username = ws.Cells(rows, "A").text 
    password = ws.Cells(rows, "B").text 
end 

#invalid login 
@driver.find_element(:id, "tbLUser").clear 
@driver.find_element(:id, "tbLUser").send_keys(username) 
@driver.find_element(:id, "tbLPass").clear 
@driver.find_element(:id, "tbLPass").send_keys(password) 
assert element_present?(:name, "lg5_login") 
@driver.find_element(:name, "lg5_login").click 

谁能帮我弄过去,这挂断在这段代码,我会很感激。

+1

当然,它会是一个**无限循环**因为'rows'值在'while'循环中没有被改变,条件总是'true'。 – Surya 2014-10-30 19:49:33

+0

我会如何改变这种情况,以防止它成为一个无限循环? – Brenda 2014-10-30 19:50:37

+1

首先,'行'是什么,'while'循环背后的原因是什么?没有正确理解你想要做什么,就很难说出任何事情。 – Surya 2014-10-30 19:52:37

回答

1

从您的代码开始没有太侵入,你可以尝试像即:

(2..ws.UsedRange.Rows.Count).each do |row| # go through each row with data 
    username = ws.Cells(row, "A").Value 
    password = ws.Cells(row, "B").Value 
    is_valid = ws.Cells(row, "C").Value # 3rd column with TRUE/FALSE boolean values 

    @driver.find_element(:id, "tbLUser").clear 
    @driver.find_element(:id, "tbLUser").send_keys(username) 
    @driver.find_element(:id, "tbLPass").clear 
    @driver.find_element(:id, "tbLPass").send_keys(password) 
    assert element_present?(:name, "lg5_login") 
    @driver.find_element(:name, "lg5_login").click 
    # One method for each case, an if/else with an inline check would also be fine 
    is_valid ? assert_valid_result : assert_invalid_result 
end 
+0

谢谢!我现在唯一的问题是,它不认可用户名作为变量,即使它在上面定义。 – Brenda 2014-10-31 14:43:11

+0

没关系,我发现了这个问题。我的结束语是错误的。再次感谢你的帮助! – Brenda 2014-10-31 14:50:36

0

您不需要while循环,因为您只需遍历Excel工作表中的行数。您可以使用:times

rows = 2 
rows.times do 
    username = ws.Cells(rows, "A").text 
    password = ws.Cells(rows, "B").text 
end 

# your rest of the code 

有一两件事我想在这里指出的是,在rows.timesusernamepassword将被覆盖由块的最后一次迭代。为了防止这种情况,你可以创建一个哈希:

rows = 2 
users = rows.times.with_object({}){ |i, u| u["row #{i+1}"] = { 'username' => 'd', 'password' => 'r' } } 

现在,你可以用凭据逐行访问用户:

users['row 1']['username'] #=> 'user 1' 
users['row 2']['username'] #=> 'user 2'