hiMom
hiMom

Reputation: 93

How to scroll down in an instagram pop-up frame with Selenium

I have a python script using selenium to go to a given Instagram profile and iterate over the user's followers. On the instagram website when one clicks to see the list of followers, a pop-up opens with the accounts listed (here's a screenshot of the site)

However both visually and in the html, only 12 accounts are shown. In order to see more one has to scroll down, so I tried doing this with the Keys.PAGE_DOWN input.

from selenium import webdriver
from selenium.common.exceptions         import TimeoutException
from selenium.webdriver.support.ui      import WebDriverWait 
from selenium.webdriver.support         import expected_conditions as EC
from selenium.webdriver.chrome.options  import Options
from selenium.webdriver.common.keys     import Keys
import time 

...

username = 'Username'
password = 'Password'
message  = 'blahblah'
tryTime  = 2

#create driver and log in
driver = webdriver.Chrome()
logIn(driver, username, password, tryTime)

#gets rid of preference pop-up
a = driver.find_elements_by_class_name("HoLwm")
a[0].click()

#go to profile
driver.get("https://www.instagram.com/{}/".format(username))

#go to followers list
followers = driver.find_element_by_xpath("//a[@href='/{}/followers/']".format(username))
followers.click()
time.sleep(tryTime) 

#find all li elements in list
fBody  = driver.find_element_by_xpath("//div[@role='dialog']")
fBody.send_keys(Keys.PAGE_DOWN) 

fList  = fBody.find_elements_by_tag("li")
print("fList len is {}".format(len(fList)))

time.sleep(tryTime)

print("ended")
driver.quit()

When I try to run this I get the following error:

Message: unknown error: cannot focus element

I know this is probably because I'm using the wrong element for fBody, but I don't know which would be the right one. Does anybody know which element I should send the PAGE_DOWN key to, or if there is another way to load the accounts?

Any help is much appreciated!

Upvotes: 7

Views: 11372

Answers (2)

fayas_akram
fayas_akram

Reputation: 116

The above code works fine if you add iteration (for) with range for i in range(1, 4): try:

            #find all li elements in list
            fBody  = self.driver.find_element_by_xpath("//div[@class='isgrP']")
            scroll = 0
            while scroll < 5: # scroll 5 times
                self.driver.execute_script('arguments[0].scrollTop = arguments[0].scrollTop + arguments[0].offsetHeight;', fBody)
                time.sleep(2)
                scroll += 1

            fList  = self.driver.find_elements_by_xpath("//div[@class='isgrP']//li")
            print("fList len is {}".format(len(fList)))

        except Exception as e:
            print(e, "canot scrol")

        try:
            #get tags with a
            hrefs_in_view = self.driver.find_elements_by_tag_name('a')
            # finding relevant hrefs
            hrefs_in_view = [elem.get_attribute('title') for elem in hrefs_in_view]

            [pic_hrefs.append(title) for title in hrefs_in_view if title not in pic_hrefs]
            print("Check: pic href length " + str(len(pic_hrefs)))

        except Exception as tag:
            print(tag, "can not find tag")

So, the for loop makes it to possible scrol even if the while loop miss

Upvotes: 0

ewwink
ewwink

Reputation: 19154

the element you're looking is //div[@class='isgrP'] and Keys.PAGE_DOWN is not work for scrollable div.

Your variable fList hold old value, you need to find again the elements after scroll.

#find all li elements in list
fBody  = driver.find_element_by_xpath("//div[@class='isgrP']")
scroll = 0
while scroll < 5: # scroll 5 times
    driver.execute_script('arguments[0].scrollTop = arguments[0].scrollTop + arguments[0].offsetHeight;', fBody)
    time.sleep(tryTime)
    scroll += 1

fList  = driver.find_elements_by_xpath("//div[@class='isgrP']//li")
print("fList len is {}".format(len(fList)))

print("ended")
#driver.quit()

Upvotes: 17

Related Questions