Python Selenium 无意点击问题

Python Selenium unintentional click problem

我正在尝试使用 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 解决了我的问题。在页面底部您可以看到解决方案。

编辑:我是新来的,这就是为什么有时我的问题可能是 meanless.But 请不要减少我的分数。 Whosebug 不会再接受我的问题了。请加分。

我在滚动弹出窗口时遇到了完全相同的问题。你的 dialog.click() 会发生什么,当你试图将你的键集中在弹出窗口上时,偶尔会点击一个用户并加载他们的个人资料。然后您的脚本崩溃,因为弹出窗口不再出现在屏幕上。

经过大量研究解决这个问题后,我注意到只有长用户名才会出现这种情况。不管怎样,我实施了一个简单的 hack 来解决这个问题。

  1. 首先我们得到 url 标准卷轴的样子。打开并滚动弹出窗口时,这是我们所在的 url。 https://www.instagram.com/some_username/followers/

2.Now 我创建了一个函数来保存打开弹出窗口的代码。这将非常有用,因此将必要的代码捕获到一个函数中。 (我没有类名或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 意外点击用户时不要进行扫描。我们将使用第 1 步中的 URL。请确保将以下 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(),这将使您返回页面并返回弹出窗口,并且您的循环将继续,就好像什么都没发生一样。