Take the 2-minute tour ×
Software Quality Assurance & Testing Stack Exchange is a question and answer site for software quality control experts, automation engineers, and software testers. It's 100% free, no registration required.

Here is an interesting problem (or at least i think so) As an Admin I have a table with N entries (51 to give a number). Each entry in a row is a recruiter name with a link to 'Login' as that person. I want to be able to click on each recruiter 'login' which takes me to that account, verify some facts there, logout, Relogin as the admin and continue the cylcle (login as recruiter,verify,logout etc) I find the elements in the table by finding each row and then each cell. (find_elements_by_tag_name("tr") followed by find_elements_by_tag_name("td") )

The problem arises when i Logout as the recruiter and ReLogin as the admin, now the cells that i had found earlier throw a stale element exceptions.

 for row in rows: 
    if chk == "true":
                    cells[6].find_element_by_link_text("Login").click()  # recruiter login
                    alert = driver.switch_to_alert()
                    alert.accept()
                    #Verify Recruiter account is the same as the one you logged in as
                    driver.find_element_by_link_text("Logout").click()
                    self.login()   #admin login
                    self.bringUpRecruiters()

I could call the function which finds the rows and columns at each iteration. However it takes half a minute for webdriver to find all the cell elements (51 rows x 7 columns) at each iteration. For 51 iterations that is approximately 25 mins. And if the number of rows increase it will only increase more.

Is there a more elegant and time saving way of doing this ? I would appreciate your bright ideas!

I am using Webdriver + Python bindings

Thanks, S

share|improve this question
    
@user141110 Welcome to SQA. Let me make sure I understand. In a 51 x 7 table, how many login links are there: 51 or 357? –  user246 May 30 '12 at 2:27
    
Thanks 246! There are 51 login links (non unique. so i cannot save the links in one iteration and then circle through them).There are 51 rows each row with 7 columns. I need to check if condition in column 1 is true then click on link in column 7. –  user1411110 May 30 '12 at 17:16
add comment

1 Answer 1

I wonder if it would be faster to use Xpaths to search specifically for cells in the row of interest, rather than fetching all rows and then manipulating the one row you are interested in. I am not fluent in Python, so I will illustrate my suggestion in pseudo-code:

for i in 1..51
  condition_xpath = "//table/tr[" + i + "]/td[1]"
  column1 = driver.find_element_by_xpath(condition_xpath)
  if condition in column 1 is true
    login_xpath = "//table/tr[" + i + "]/td[7]/a"
    driver.find_element_by_xpath(login_xpath).click()
    alert = driver.switch_to_alert()
    alert.accept()
    #Verify Recruiter account is the same as the one you logged in as
    driver.find_element_by_link_text("Logout").click()
    self.login()   #admin login
    self.bringUpRecruiters()
  end if
end for
share|improve this answer
    
I am going to try this now. looks like this will work.Thanks! –  user1411110 May 30 '12 at 18:51
    
Good answer. An alternative that avoids using xpath (which can be slow) to avoid the stale element exception (and to get a little closer to following the page object pattern), you need to create a new instance of the element each time the page is re-loaded. You can create a function called ClickLoginForUser that takes an integer for the index. In that function you would create all of the elements and interact with them so that they don't get stale. You would then call your function inside the for loop. –  Sam Woods May 30 '12 at 22:00
    
@Sam Woods What does "create all of the elements" translate to in terms of Selenium locators? –  user246 May 30 '12 at 22:45
    
Execute the find_element_by function to set your element object. –  Sam Woods May 31 '12 at 17:42
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.