Hi there, I'm having an issue with some logic and how the best way to go about it. I am starting to build a selenium framework and what my aim is, is to:
The problem I'm having is iterating over the list to select row one i.e. url = data[1]['URL'], running the selenium test i.e. driver.get(url), then selecting row 2 i.e. url = data[2]['URL'].
If I put the above in a for loop, literally all my selenium code would have to be in the loop too. I did a quick test to see if the loop would work (see "loop through the list to test it works" comment in first code block under this post), which it does, but I need a method of changing the number of the element in the array e.g. data[3], without in being inside the loop. All of my selenium code is in another class! I must be going about it the wrong way but can't for the life of me figure out how to do it.
If I leave the loop to run, come out of it and run my selenium code, all I'm left with is the last value in the loop - obviously e.g. data[3], if I have 3 rows in spreadsheet.
Please can someone help! I know this may be a confusing post but literally any help would be appreciated. It must involve a loop somewhere but I'm new to python and just can't figure out the logic.
Below is my code that I'm working with:
- Read in the rows from a spreadsheet - the data in each row will be used for one "iteration" or test.
- Run the selenium test - enter data from spreadsheet from first row into text fields etc. This will be UnitTest later but just dry python code at the mo.
- Close the test, select second row of spreadsheet and run test again.
The problem I'm having is iterating over the list to select row one i.e. url = data[1]['URL'], running the selenium test i.e. driver.get(url), then selecting row 2 i.e. url = data[2]['URL'].
If I put the above in a for loop, literally all my selenium code would have to be in the loop too. I did a quick test to see if the loop would work (see "loop through the list to test it works" comment in first code block under this post), which it does, but I need a method of changing the number of the element in the array e.g. data[3], without in being inside the loop. All of my selenium code is in another class! I must be going about it the wrong way but can't for the life of me figure out how to do it.
If I leave the loop to run, come out of it and run my selenium code, all I'm left with is the last value in the loop - obviously e.g. data[3], if I have 3 rows in spreadsheet.
Please can someone help! I know this may be a confusing post but literally any help would be appreciated. It must involve a loop somewhere but I'm new to python and just can't figure out the logic.
Below is my code that I'm working with:
#readsheet.py
from xlrd import open_workbook
book = open_workbook('test_sheet.xls')
sheet = book.sheet_by_index(0)
"""Read data into a list of dictionaries"""
first_row = [] # The row where we store the name of the column
for col in range(sheet.ncols):
first_row.append(sheet.cell_value(0,col))
# transform the workbook to a list of dictionaries
data =[]
for row in range(1, sheet.nrows):
data_dict = {}
for col in range(sheet.ncols):
data_dict[first_row[col]]=sheet.cell_value(row, col)
data.append(data_dict)
#print data
#print data[0]['URL']
url = data[2]['URL']
"""print out cell value 'URL' from row 2"""
print "test: " + url
"""loop through the list to test it works"""
for i in range(len(data)):
url_value = data[i]['URL']
password_value = data[i]['password']
username_value = data[i]['username']
print url_value
print password_value
print username_valueThen in another class I would have my selenium test. The data in variable "url" is from readsheet.py and is what I need to change/update to the data in row 2 after row 1 has finished:from read_sheet import *
class selenium_class():
def setUp(self):
self.driver = webdriver.Chrome('/home/daniel/chromedriver')
def go_to_url(self, url_value):
driver = self.driver
driver.get(url_value)
driver.implicitly_wait(10)
test_selenium_object=selenium_class()
test_selenium_object.setUp()
test_selenium_object.go_to_url(url)Thank you!!
