Проблема непреднамеренного щелчка в Python Selenium

#python #selenium #instagram

#python #селен #Instagram

Вопрос:

Я пытаюсь привлечь подписчиков с помощью python selenium. Но иногда python щелкает сам по себе. Я хочу создать программу без ошибок. Я пытаюсь Я пробовал конструкции «try catch», но это не сработало. Вот мой код:

 def getFollowers(self):
        try:
            self.browser.get(f"https://www.instagram.com/{self.username}")
            time.sleep(2)
            followers=self.browser.find_element_by_xpath("//*[@id='react-root']/section/main/div/header/section/ul/li[2]/a").click()
            time.sleep(2)
            dialog=self.browser.find_element_by_xpath("/html/body/div[5]/div/div/div[2]")
            followerCount=len(dialog.find_elements_by_tag_name("li"))
            print(f"first count:{followerCount}")
            action=webdriver.ActionChains(self.browser)
//*******************************************Probly my problem is here****************************************
            while True:
                dialog.click()
                action.key_down(Keys.SPACE).key_up(Keys.SPACE).perform()
                time.sleep(3)
                newCount=len(dialog.find_elements_by_tag_name("li"))
                if followerCount!=newCount or newCount==24:
                    print(f"New count:{newCount}")
                    time.sleep(3)
                    followerCount=newCount
                else:
                    break
//**********************************************************************************************************
            followers=dialog.find_elements_by_tag_name("li")
            followersList=[]
            for user in followers:
                link=user.find_element_by_css_selector("a").get_attribute("href")
                # print(link)
                followersList.append(link)
            with open("followers.txt","w",encoding="UTF-8") as file:
                for item in followersList:
                    file.write(item "n")
            time.sleep(5)
        except:
            pass
 

У меня также есть def getfollowing, и он работает безупречно. Если вы хотите, я тоже могу это показать. Но они почти одинаковые.

РЕДАКТИРОВАТЬ: @RohanShah решил мою проблему. В нижней части страницы вы можете увидеть решение.

Редактировать: я новичок здесь, поэтому иногда мои вопросы могут быть бессмысленными.Но, пожалуйста, не уменьшайте мои очки. Stackoverflow больше не будет принимать мои вопросы. Пожалуйста, увеличьте мои очки.

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

1. Неясно, что вы подразумеваете под «он щелкает сам по себе». Что он щелкает? И что вы подразумеваете под «самим собой»?

2. Я имею в виду, что при просмотре списков пользователей щелчок любого пользователя переходит на их страницу и завершается

3. @RohanShah Спасибо за ваш блестящий ответ. Я собираюсь проверить это сейчас.

4. @RohanShah это работает!! Вы буквально спасли мой день. Я ценю это.

Ответ №1:

У меня была точно такая же проблема при прокрутке всплывающих окон. Что происходит dialog.click() , так это то, что вы, пытаясь сфокусировать свой ключ на всплывающем окне, иногда щелкаете пользователя и загружаете его профиль. Затем ваш скрипт выходит из строя, поскольку всплывающее окно больше не отображается на экране.

После долгих исследований по решению этой проблемы я заметил, что это происходит только с длинными именами пользователей. Несмотря на это, я реализовал простой способ обойти эту проблему.

  1. Сначала мы получаем URL-адрес того, как выглядит стандартная прокрутка. При открытии и прокрутке всплывающего окна это URL-адрес, по которому мы находимся. https://www.instagram.com/some_username/followers/

2. Теперь я создал функцию для хранения кода для открытия всплывающего окна. Это будет очень полезно, чтобы преобразовать необходимый код в функцию. (У меня нет имен классов или xpath, поэтому, пожалуйста, настройте функцию для себя)

     def openPopup():
        self.browser.get(f"https://www.instagram.com/{self.username}")
        global popup # we will need to access this variable outside of the function
        popup = driver.find_element_by_class_name('popupClass') #you don't have to use class_name
        popup.click()
 
  1. Теперь мы должны указать нашему while loop не сканировать, когда Selenium случайно нажимает на пользователя. Мы будем использовать наш URL-адрес с шага 1. Пожалуйста, убедитесь, что следующий оператор if вставлен в начало вашего цикла, поэтому, если есть разрыв, он сначала обработает его, прежде чем пытаться получить доступ к всплывающему окну.
     while True:  
      check_url = self.browser.current_url #returns string with current_url

      if check_url != 'https://www.instagram.com/some_username/followers/':
        #if this code is executed, this means there has been an accidental click
        openPopup() #this will bring back to the page and reopen popup
    
     #the rest of your code
      popup.click() # variable from our function
      action.key_down(Keys.SPACE).key_up(Keys.SPACE).perform()
      time.sleep(3)
      newCount=len(dialog.find_elements_by_tag_name("li"))           
      if followerCount!=newCount or newCount==24:
        print(f"New count:{newCount}")
        time.sleep(3)
        followerCount=newCount
      else:
        break
      check_url = self.browser.current_url #we must recheck the current_url every time the loop runs to see if there has been a misclick
 

Теперь, всякий раз, когда ваш цикл обнаруживает, что URL-адрес больше не является одним из всплывающих окон, он автоматически вызывается openPopup() , что возвращает вас на страницу и обратно во всплывающее окно, и ваш цикл будет продолжаться, как будто ничего не произошло.