Analyst
Analyst

Reputation: 137

Unable to figure out where to add wait statement in python selenium

I am searching elements in my list(one by one) by inputing into searchbar of a website and get apple products name that appeared in search result and printed. However I am getting following exception

StaleElementReferenceException: Message: stale element reference: element is not attached to the page document   

I know its because of changing of element very fast so I need to add wait like

wait(driver, 10).until(EC.visibility_of_element_located((By.ID, "submitbutton"))) 

or explictly

Q1. But I don't understand where should I add it? Here is my code. Please help!

Q2. I want to go to all the next pages using but that's not working.

driver.find_element_by_xpath( '//div[@class="no-hover"]/a' ).click()

Earlier exception was raised on submitton button and now at if statement.

Upvotes: 0

Views: 64

Answers (2)

JeffC
JeffC

Reputation: 25611

I think what you had was doing too much and can be simplified. You basically need to loop through a list of search terms, myList. Inside that loop you send the search term to the searchbox and click search. Still inside that loop you want to grab all the elements off the page that consist of search results, class='search-result-product-url' but also the text of the element contains 'apple'. The XPath locator I provided should do both so that the collection that is returned all are ones you want to print... so print each. End loop... back to next search term.

for element in mylist:
    driver.find_element_by_id("search-input").send_keys(element)
    driver.find_element_by_id("button-search").click()
    # may need a wait here?
    for item in driver.find_elements_by_xpath( "//a[@class='search-result-product-url'][contains(., 'apple')]" ):
        print item.text

Upvotes: 0

amirouche
amirouche

Reputation: 7883

That's not what implicit wait is for. Since the page change regularly you can't be sure when the current object inside the variable is still valid.

My suggestion is to run the above code in loop using try except. Something like the following:

for element in mylist:
    ok = False
    while True:
        try:
           do_something_useful_while_the_page_can_change(element)
        except StaleElementReferenceException:
           # retry
           continue
        else:
           # go to next element
           break

Where:

def do_something_useful_while_the_page_can_change(element):
    searchElement = driver.find_element_by_id("searchbar")
    searchElement.send_keys(element)
    driver.find_element_by_id("searchbutton").click()
    items_count = 0
    items = driver.find_elements_by_class_name( 'searchresult' )
    for i, item in enumerate( items ):
        if 'apple' in item.text:
            print ('item.text')
    items_count += len( items )

Upvotes: 1

Related Questions