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 来解决这个问题。
- 首先我们得到 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()
- 现在我们必须告诉
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()
,这将使您返回页面并返回弹出窗口,并且您的循环将继续,就好像什么都没发生一样。
我正在尝试使用 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 来解决这个问题。
- 首先我们得到 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()
- 现在我们必须告诉
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()
,这将使您返回页面并返回弹出窗口,并且您的循环将继续,就好像什么都没发生一样。