2014-10-30 68 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'