Ошибка при очистке ingramer селеном

#python #selenium

Вопрос:

Я хочу загрузить фотографии из Instagram через сайт ingramer. Вот мой код:

 from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import os
time_to_scroll=50
os.chdir(r'C:UsersirDownloads')
image_src_list=set()


b = webdriver.Chrome()
b.get('https://ingramer.com/profiles/instagram-viewer')
time.sleep(3)
search=b.find_element_by_id('downloaderform-url')
search.send_keys('my-instagram-user')
search.submit()
while time_to_scroll:
    time.sleep(10)
    image_div=b.find_elements_by_xpath('/html/body/div[1]/main/div/div[4]/div/div/div/div/div/div/div')
    for div in image_div:
        try:
            image=div.find_element_by_tag_name('img')
            if image:
                image_src_list.add(image.get_attribute("src"))
        except:
            print('sonthing missed')
    nextpage=b.find_element_by_id("viewer-next-button")
    b.execute_script("arguments[0].scrollIntoView()",nextpage)
    nextpage.click()
    nextpage.click()
    time_to_scroll-=1
    
def downlad_image(urls):  
    count=0
    for url in urls:
        reponse = requests.get(url)
        if reponse.status_code == 200:
            with open(f"search{count 1}.jpg","wb") as file:
                file.write(reponse.content)
        count =1
downlad_image(image_src_list)
 

Но это дает такую ошибку:

  Traceback (most recent call last):
  File "D:tamrinpythontamrin.py", line 29, in <module>
    nextpage.click()
  File "C:UsersirAppDataLocalProgramsPythonPython38libsite-packagesseleniumwebdriverremotewebelement.py", line 80, in click
    self._execute(Command.CLICK_ELEMENT)
  File "C:UsersirAppDataLocalProgramsPythonPython38libsite-packagesseleniumwebdriverremotewebelement.py", line 633, in _execute
    return self._parent.execute(command, params)
  File "C:UsersirAppDataLocalProgramsPythonPython38libsite-packagesseleniumwebdriverremotewebdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:UsersirAppDataLocalProgramsPythonPython38libsite-packagesseleniumwebdriverremoteerrorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
  (Session info: chrome=90.0.4430.93)
 

В чем проблема?

Комментарии:

1. Я не понимаю эту часть while time_to_scroll: и выше того, что вы определили time_to_scroll=50 . Так что в основном вы говорите while 50: . Что это должно сделать? Я не думаю, что он делает то, о чем ты думаешь.

2. @jd2775 Это правда, я хотел прокрутить страницу вниз 50 раз, чтобы загрузить все фотографии, но я не знаю лучшего способа.

Ответ №1:

Это StaleElementReferenceException происходит, когда вы определяете элемент, переходите на другую страницу в своем тесте, а затем пытаетесь снова использовать тот же элемент. Поскольку ошибка возникает в строке 39 (ваша вторая nextpage.click() ), я ожидаю, что первая nextpage.click перейдет на другую страницу, и поскольку nextpage элемент был определен на предыдущей странице, вы получите StaleElementReferenceException

В любом случае, я думаю , что вы можете обойти это, просто переопределив nextpage что-то вроде этого (если селектор останется прежним).

 nextpage=b.find_element_by_id("viewer-next-button")
b.execute_script("arguments[0].scrollIntoView()",nextpage)
nextpage.click()
nextpage=b.find_element_by_id("viewer-next-button")
nextpage.click()